Pregunta

Tengo un paralelepípedo que sus dimensiones son importados de XML por eso es necesario para asegurarse de que no importa cuál sea el tamaño del modelo, la cámara siempre se puede ver todo. Esto es con fines de previsualización. Me probable que hacer Una leyenda en la parte superior muestra la escala para mayor claridad.

Creo que necesito algo de función que me diga si el ModelVisual3D cabe dentro de los límites de la FieldOfView de la cámara o tal vez el propio Viewport3D.

Hasta ahora tengo la devolución de llamada estática (las propiedades de dimensión son DependencyPropertys) cuando las dimensiones propiedades cambian definen como a continuación. Es bastante crudo en el momento pero se entiende la idea que estoy viendo. La sección comentada muestra más o menos qué tipo de lógica Busco

    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 alguien sabe lo que debe ir en la sección comentada, es que estaría eternamente agradecido.
Gracias de antemano.

¿Fue útil?

Solución

Lo que hay que conseguir es la medida de la proyección 2D del cubo en el plano de la vista. A continuación, puede hacer una simple comprobación de los valores mínimo y máximo de X e Y para ver si el conjunto del cubo es visible.

Adición de un factor de tolerancia de la medida se hará cargo de los errores de redondeo.

He copiado lo que parece ser la sección correspondiente del código de aquí . A continuación, puede establecer el tamaño de la ventana gráfica en consecuencia.

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);
                }
            }
        }
    }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top