Frage

Ich habe einen Quader, der die Abmessungen von XML importiert werden, so muss ich sicher sein, dass egal, was die Größe des Modells kann die Kamera immer alle es sehen. Dies ist für Vorschauzwecke. Ich werde wahrscheinlich eine Beschriftung über die Oberseite machen die Skala für Klarheit zeigt.

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

Bisher habe ich den statischen Rückruf (die Dimensionseigenschaften sind DependencyPropertys), wenn Dimensionen Eigenschaften wie unten definiert ändern. Es ist ziemlich roh im Moment, aber Sie bekommen die Idee Ich betrachte. Der Kommentar gesetzt Abschnitt zeigt etwa, welche Art von Logik 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.

War es hilfreich?

Lösung

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

einen Toleranzfaktor in dem Maße Das Hinzufügen einer Rundungsfehler kümmern.

Ich habe kopiert, was der entsprechende Abschnitt des Codes von hier zu sein sieht . Sie können dann entsprechend die Größe des Ansichtsfenster gesetzt.

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);
                }
            }
        }
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top