2010-06-04 4 views
6

J'ai une scène 3D où mes modèles 3D sont chargés dans le code derrière des fichiers XAML.WPF 3D - Positionnement d'éléments Visual3D dans une scène 3D à l'aide de transformations Model3DGroup imbriquées?

Chaque modèle est composé d'un arbre de Model3DGroups imbriqués dont chacun a diverses transformations qui lui sont appliquées pour positionner et orienter le sous-composant suivant du modèle dans l'arbre. Ce modèle est ensuite utilisé comme contenu d'un ModelVisual3D afin qu'il puisse être affiché à l'écran.

Je souhaite attacher un modèle ModelVisual3D à un 'parent' ModelVisual3D. Cet objet ModelVisual3D doit utiliser toutes les transformations imbriquées du parent ModelVisual3D.Content pour se positionner et s'orienter correctement dans l'espace virtuel. Par exemple, le premier ModelVisual3D est un bras de robot qui a divers joints mobiles et je veux attacher un outil sur l'extrémité de ce bras - un autre ModelVisual3D. Comment puis-je accéder à cette transformation composite à partir de la propriété de contenu parent ModelVisual3Ds pour me permettre de positionner la prochaine ModelVisual3D correctement par rapport à son parent?

Répondre

2

Comme vous l'avez sans doute remarqué, lorsque vous regroupez Model3Ds dans un Model3DGroup, les propriétés Transform des enfants se combinent avec celles du parent.

Il semble que vous demandiez comment calculer la transformation nette vers un Model3D particulier dans un arbre de Model3Ds qui composent ce que vous appelez votre «modèle». Pour ce faire, vous devez savoir (ou être capable de scanner et de découvrir) le chemin depuis votre racine Model3DGroup jusqu'à la Model3D pour laquelle vous voulez trouver la transformation. Une fois que vous avez ce chemin, tout ce qui est nécessaire est de combiner les propriétés de transformation à chaque niveau. Pour ce faire, construisez simplement un Transform3DGroup et ajoutez-y les transformations individuelles.

Par exemple, si votre bras de robot a des composants Model3D nommés « bras supérieur », « LowerArm » et « main », et que vous vouliez connaître la position et l'angle de la main que vous pourriez faire:

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

vous pouvez maintenant trouver le (0,0,0) emplacement sur la main comme suit:

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

de même, vous pouvez trouver d'autres points et les utiliser pour positionner votre autre ModelVisual3D.

+0

Merci, c'est essentiellement ce que je me suis retrouvé à faire, bien que j'ai trouvé que pour que cela fonctionne dans mon système, j'ai dû post-multiplier plutôt que de pré-multiplier les transformations que j'ai eu pour inverser l'ordre de toutes les transformées dans le groupe de transformation combiné. – Munro