2009-04-02 8 views
2

Ich habe einen Quader, dessen Abmessungen aus XML importiert werden, also muss ich sicher sein, dass egal welche Größe das Modell hat, die Kamera immer alles sehen kann. Dies dient der Vorschau. Ich werde wahrscheinlich eine Bildunterschrift über dem oberen Rand der Skala für Klarheit darstellen.WPF 3D - ModellVisual3D in das Sichtfeld der Kamera einfügen?

Ich glaube, ich eine Funktion benötigen, das mir sagen wird, ob der ModelVisual3D paßt in den Grenzen der FieldOfView der Kamera oder vielleicht den Viewport3D selbst.

Bisher habe ich den statischen Rückruf (die Dimension Eigenschaften sind DependencyProperty s), wenn Dimensionen Eigenschaften ändern wie folgt definieren. Es ist im Moment ziemlich grob, aber Sie bekommen die Idee, die ich mir ansehe. Der Kommentar gesetzt Abschnitt zeigt etwa, welche Art von Logik, die ich suche

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; 
     } 
    } 

Wenn jemand weiß, was gehen sollte, wo der kommentierten Herausgleitabschnittes ist würde ich ewig dankbar sein.
Vielen Dank im Voraus.

+0

Dies ist die gleiche wie http://stackoverflow.com/questions/709368/wpf-3d-detirmine-whether-a-modelvisual3d-is-being-clipped-inside-its-viewport3 ist, ist es nicht ? – ChrisF

Antwort

3

Was müssen Sie halten erhalten von, ist das Ausmaß der 2D-Projektion des Würfels auf der Ansichtsebene. Sie können dann eine einfache Überprüfung der minimalen und maximalen X & Y-Werte vornehmen, um zu sehen, ob der gesamte Würfel sichtbar ist.

Durch Hinzufügen eines Toleranzfaktors werden Rundungsfehler vermieden.

Ich habe kopiert, was der entsprechende Abschnitt des Codes von here sein aussieht. Sie können dann die Größe des Ansichtsfensters entsprechend einstellen.

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); 
       } 
      } 
     } 
    }