2010-06-04 11 views
6

Tengo una escena en 3D donde mis modelos 3D se cargan en el código detrás de los archivos XAML.WPF 3D - Posicionamiento de elementos de Visual3D en una escena 3D utilizando transformaciones Model3DGroup anidadas?

Cada modelo está compuesto por un árbol de Model3DGroups anidado, cada uno de los cuales tiene varias transformaciones aplicadas para posicionar y orientar el siguiente subcomponente del modelo en el árbol. Este modelo se usa luego como el contenido de un ModelVisual3D para que pueda mostrarse en la pantalla.

Quiero adjuntar un ModelVisual3D hijo a un ModelVisual3D "principal". Este niño ModelVisual3D necesita usar todas las transformaciones anidadas del ParentVisual3D.Content padre para posicionarse y orientarse correctamente en el espacio virtual. Por ejemplo, el primer ModelVisual3D es un brazo de robot que tiene varias articulaciones móviles y quiero colocar una herramienta en el extremo de este brazo, otro ModelVisual3D. ¿Cómo puedo acceder a esta transformación compuesta desde la propiedad de contenido ParentVisual3Ds principal para permitirme posicionar el próximo ModelVisual3D correctamente en relación con su elemento primario?

Respuesta

2

Como sin duda ha observado, al agrupar Model3Ds en un Model3DGroup, las propiedades de transformación de los elementos secundarios se combinan con las del elemento primario.

Parece que está preguntando cómo calcular la transformación de red a un Model3D particular dentro de un árbol de Model3Ds que conforman lo que está llamando su "modelo". Para hacer esto, necesita saber (o ser capaz de escanear y descubrir) la ruta desde su raíz Model3DGroup hasta el Model3D para el que desea encontrar la transformación.

Una vez que tienes esta ruta, todo lo que se requiere es combinar las propiedades de transformación en cada nivel. Para hacer esto, simplemente construya un Transform3DGroup y agregue las transformaciones individuales a él.

Por ejemplo, si su brazo robot tiene componentes Model3D llamados "LowerArm" "upperarm", y "mano", y que quería saber la posición y el ángulo de la mano que podría hacer:

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

ya se puede encontrar el (0,0,0) ubicación en la mano de la siguiente manera:

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

del mismo modo se pueden encontrar otros puntos y utilizarlos para posicionar su otra ModelVisual3D.

+0

Gracias, esto es esencialmente lo que me he encontrado haciendo, aunque he encontrado que para que esto funcione en mi sistema he necesitado post-multiplicar en lugar de pre-multiplicar las transformaciones, así que he tenido para invertir el orden de todas las transformadas en el grupo de transformación combinada. – Munro