2009-04-02 6 views
2

J'ai un parallélépipède qui ses dimensions sont importées de XML, alors je dois être sûr que quelle que soit la taille du modèle, la caméra peut toujours voir tout cela. Ceci est à des fins de prévisualisation. Je vais probablement rendre une légende sur le dessus montrant l'échelle pour plus de clarté.WPF 3D - Adapter ModelVisual3D au champ de vision de la caméra?

Je pense que je dois une fonction qui me dire si le ModelVisual3D correspond à l'intérieur des limites de la FieldOfView de l'appareil photo ou peut-être le Viewport3D lui-même. Jusqu'à présent, j'ai le rappel statique (les propriétés de la cote sont DependencyProperty s) lorsque les propriétés des dimensions changent comme indiqué ci-dessous. C'est assez grossier en ce moment mais vous avez l'idée que je regarde. La section commentée montre à peu près quel genre de logique que je cherche

private static void OnCubeDimensionsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     if (!valueSemaphore) 
     { 
      //while(mainModel.WillClip(mainCamera)) 
      //{ 
      //  mainCamera.FieldOfView--; 
      //} 

      valueSemaphore = true; 
      double propertyValue = 0.0; 
      Product3D p = d as Product3D; 

      switch (e.Property.Name) 
      { 
       case "CubeHeight": 
        propertyValue = (double.Parse(e.NewValue.ToString())/100) * 8; 
        p.CubeHeight = propertyValue; 
        break; 
       case "CubeWidth": 
        propertyValue = (double.Parse(e.NewValue.ToString())/100) * 5.3; 
        p.CubeWidth = propertyValue; 
        break; 
       case "CubeDepth": 
        propertyValue = (double.Parse(e.NewValue.ToString())/100) * 2.6; 
        p.CubeDepth = propertyValue; 
        break; 
      } 
      valueSemaphore = false; 
     } 
    } 

Si quelqu'un sait ce qui devrait aller où la section en commentaire est que je serais éternellement reconnaissant.
Merci d'avance.

+0

C'est le même que http://stackoverflow.com/questions/709368/wpf-3d-detirmine-whether-a-modelvisual3d-is-being-clipped-inside-its-viewport3 est pas ? – ChrisF

Répondre

3

Ce que vous devez saisir est la mesure de la projection 2D du cube sur le plan de la vue. Vous pouvez alors faire une simple vérification sur les min et max X & valeurs Y pour voir si l'ensemble du cube est visible.

Ajout d'un facteur de tolérance dans la mesure prendra soin de toute erreur d'arrondi.

J'ai copié ce qui semble être la section pertinente du code à partir here. Vous pouvez ensuite définir la taille de la fenêtre en conséquence.

public static Rect Get2DBoundingBox(ModelVisual3D mv3d) 
{ 
    bool bOK; 

    Matrix3D m = MathUtils.TryWorldToViewportTransform(vpv, out bOK); 

    bool bFirst = true;  
    Rect r = new Rect(); 

    if (mv3d.Content is GeometryModel3D) 
    { 
     GeometryModel3D gm3d = (GeometryModel3D) mv3d.Content; 

     if (gm3d.Geometry is MeshGeometry3D) 
     { 
      MeshGeometry3D mg3d = (MeshGeometry3D)gm3d.Geometry; 

      foreach (Point3D p3d in mg3d.Positions) 
      { 
       Point3D pb = m.Transform(p3d); 
       Point p2d = new Point(pb.X, pb.Y); 
       if (bFirst) 
       { 
        r = new Rect(p2d, new Size(1, 1)); 
        bFirst = false; 
       } 
       else 
       { 
        r.Union(p2d); 
       } 
      } 
     } 
    } 
Questions connexes