Domanda

Ho un parallelepipedo che le sue dimensioni sono importati da XML quindi ho bisogno di essere sicuro che non importa quale sia la dimensione del modello, la telecamera può sempre vedere tutto. Questo è per scopi di anteprima. Io probabilmente rendo una didascalia sopra la parte superiore che mostra la scala per chiarezza.

Credo che ho bisogno di qualche funzione che mi dirà se il ModelVisual3D si inserisce all'interno dei limiti della FieldOfView della fotocamera o forse il Viewport3D stesso.

Finora ho il callback statico (le proprietà delle dimensioni sono DependencyPropertys) quando dimensioni proprietà cambiano definiscono come sotto. E 'piuttosto grezzo al momento, ma si ottiene l'idea che sto guardando. La sezione commentata mostra circa che tipo di logica che sto cercando

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

Se qualcuno sa quello che dovrebbe andare dove la sezione commentata out sarei eternamente grato.
Grazie in anticipo.

È stato utile?

Soluzione

Quello che vi serve per entrare in possesso di è la misura della proiezione 2D del cubo sul piano della vista. È quindi possibile fare un semplice controllo sui valori minimi e massimi X & Y per vedere se tutto il cubo è visibile.

L'aggiunta di un fattore di tolleranza nella misura in cui si prenderà cura di eventuali errori di arrotondamento.

Ho copiato quello che sembra essere relativa sezione di codice da qui . È quindi possibile impostare la dimensione della finestra di conseguenza.

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);
                }
            }
        }
    }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top