2010-06-04 17 views
6

Ho una scena 3D in cui i miei modelli 3D vengono caricati nel codice sottostante dai file XAML.WPF 3D - Posizionamento di elementi Visual3D in una scena 3D utilizzando le trasformazioni nidificate Model3DGroup?

Ogni modello è costituito da un albero di modelli Model3D nidificati ciascuno dei quali ha varie trasformazioni applicate a esso per posizionare e orientare il sottocomponente successivo del modello nell'albero. Questo modello viene quindi utilizzato come contenuto di un ModelVisual3D in modo che possa essere visualizzato sullo schermo.

Desidero collegare un modello ModelVisual3D a ModelVisual3D "padre". Questo bambino ModelVisual3D deve utilizzare tutte le trasformazioni nidificate del modello principale ModelVisual3D.Content per posizionarsi e orientarsi correttamente nello spazio virtuale. Ad esempio, il primo ModelVisual3D è un braccio robot che ha varie articolazioni mobili e voglio attaccare uno strumento all'estremità di questo braccio: un altro ModelVisual3D. Come posso accedere a questa trasformazione composita dalla proprietà del contenuto ModelVisual3Ds padre per consentirmi di posizionare il prossimo ModelVisual3D correttamente rispetto al suo genitore?

risposta

2

Come è stato senza dubbio osservato, quando si raggruppano Model3D in un Model3DGroup, le proprietà di trasformazione dei bambini si combinano con quelle del genitore.

Sembra che tu stia chiedendo come calcolare la trasformazione netta in un particolare Model3D all'interno di un albero di Model3D che costituisce ciò che chiami il tuo "modello". Per fare questo è necessario conoscere (o essere in grado di scansionare e scoprire) il percorso dalla propria Model3DGroup di root fino al Model3D per cui si desidera trovare la trasformazione.

Una volta ottenuto questo percorso, tutto ciò che è necessario è combinare le proprietà di trasformazione in ciascun livello. Per fare ciò, costruisci semplicemente un gruppo Transform3D e aggiungi le singole trasformazioni.

Ad esempio, se il braccio del robot ha componenti Model3D denominati "upperarm", "LowerArm", e "a mano", e si voleva scoprire la posizione e l'angolo della mano si potrebbe fare:

var combined = new Transform3DGroup(); 
combined.Children.Add(UpperArm.Transform); 
combined.Children.Add(LowerArm.Transform); 
combined.Children.Add(Hand.Transform); 

Ora trovi la (0,0,0) posizione sulla mano come segue:

combined.Transform(new Point3D(0,0,0)); 

Allo stesso modo si possono trovare altri punti e utilizzarli per posizionare l'altra ModelVisual3D.

+0

Grazie, questo è essenzialmente quello che mi sono trovato a fare, anche se ho trovato che per far funzionare tutto questo nel mio sistema ho dovuto post-moltiplicare invece di pre-moltiplicare le trasformazioni così ho avuto per invertire l'ordine di tutte le trasformazioni nel gruppo di trasformazione combinato. – Munro

Problemi correlati