2010-06-04 10 views
6

Ich habe eine 3D-Szene, wo meine 3D-Modelle in den Code hinter XAML-Dateien geladen werden.WPF 3D - Positionierung von Visual3D-Elementen in einer 3D-Szene mit verschachtelten Model3DGroup-Transformationen?

Jedes Modell besteht aus einem Baum verschachtelter Model3DGroups, auf die jeweils verschiedene Transformationen angewendet werden, um die nächste Unterkomponente des Modells im Baum zu positionieren und auszurichten. Dieses Modell wird dann als Inhalt eines ModelVisual3D verwendet, damit es auf dem Bildschirm angezeigt werden kann.

Ich möchte ein Kind ModelVisual3D an ein 'Eltern' ModelVisual3D anhängen. Dieses untergeordnete ModelVisual3D muss alle verschachtelten Transformationen des übergeordneten ModelVisual3D.Content verwenden, um sich im virtuellen Raum korrekt zu positionieren und zu orientieren. Zum Beispiel ist der erste ModelVisual3D ein Roboterarm, der verschiedene bewegliche Gelenke hat und ich möchte ein Werkzeug am Ende dieses Armes anbringen - ein weiteres ModelVisual3D. Wie kann ich aus der übergeordneten Content-Eigenschaft ModelVisual3Ds auf diese zusammengesetzte Transformation zugreifen, um das nächste ModelVisual3D korrekt relativ zu seinem übergeordneten Element positionieren zu können?

Antwort

2

Wie Sie zweifellos beobachtet haben, wenn Sie Model3Ds in einer Model3DGroup gruppieren, werden die Transformationseigenschaften der untergeordneten Elemente mit denen des übergeordneten Elements kombiniert.

Es klingt wie Sie fragen, wie man die Netto-Transformation zu einem bestimmten Model3D innerhalb einer Struktur von Model3Ds berechnen, die bilden, was Sie Ihr "Modell" nennen. Dazu müssen Sie den Pfad von Ihrer root Model3DGroup bis zum Model3D, für das Sie die Transformation suchen möchten, kennen (oder in der Lage sein, diesen zu scannen und zu erkennen).

Sobald Sie diesen Pfad haben, ist es lediglich erforderlich, die Transformationseigenschaften auf jeder Ebene zu kombinieren. Konstruieren Sie dazu einfach eine Transform3DGroup und fügen Sie ihr die einzelnen Transformationen hinzu.

Zum Beispiel, wenn Ihr Roboterarm hat Model3D Komponenten namens „upperarm“, „LowerArm“ und „Hand“, und man wollte die Position und den Winkel der Hand, um herauszufinden, was Sie tun könnten:

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

Jetzt können Sie die (0,0,0) Standort auf der Hand finden Sie wie folgt vor:

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

Ebenso können Sie andere Punkte finden und nutzen sie Ihre anderen ModelVisual3D zu positionieren.

+0

Danke, das ist im Wesentlichen, was ich selbst gefunden habe, obwohl ich festgestellt habe, dass für dieses in meinem System zu arbeiten, ich habe Post-Multiplikation im Gegensatz zu Vormultiplizieren der Transformationen, die ich hatte Umkehren der Reihenfolge aller Transformationen in der kombinierten Transformationsgruppe. – Munro

Verwandte Themen