Question

J'ai un parallélépipède qui est des dimensions sont importées de XML, donc 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 une légende rends sur le dessus montrant l'échelle pour plus de clarté.

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.

J'ai Jusqu'à présent, le rappel statique (les propriétés de dimension sont DependencyPropertys) lorsque les dimensions changent propriétés définissent comme ci-dessous. Il est assez brut au moment, mais vous voyez 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 à l'avance.

Était-ce utile?

La solution

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 valeurs min et max X & 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.

Je l'ai copié ce qui semble être la section pertinente du code à partir de . Vous pouvez alors 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);
                }
            }
        }
    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top