WPF 3D - 使用嵌套的Model3DGroup转换在3D场景中定位Visual3D元素?

时间:2010-06-04 10:25:13

标签: wpf 3d

我有一个3D场景,我的3D模型正在XAML文件后面的代码中加载。

每个模型由一组嵌套的Model3DGroup组成,每个组都有各种变换应用于它,以定位和定向树中模型的下一个子组件。然后将此模型用作ModelVisual3D的内容,以便可以将其显示在屏幕上。

我想将一个孩子ModelVisual3D附加到'父'ModelVisual3D。这个子ModelVisual3D需要使用父ModelVisual3D.Content的所有嵌套转换来正确定位和定位自己在虚拟空间中。例如,第一个ModelVisual3D是一个机器人手臂,它有各种可移动的关节,我想在这个手臂的末端附加一个工具 - 另一个ModelVisual3D。如何从父ModelVisual3Ds内容属性访问此复合变换,以允许我相对于其父项正确定位下一个ModelVisual3D?

1 个答案:

答案 0 :(得分:2)

毫无疑问,当您在Model3DGroup中对Model3D进行分组时,子项的Transform属性与父项的属性组合。

听起来你问的是如何计算网络变换到模型3D的树中的特定Model3D,这些模型组成了你称之为“模型”的东西。要做到这一点,您需要知道(或能够扫描和发现)从根Model3DGroup到您想要找到转换的Model3D的路径。

获得此路径后,只需在每个级别合并“变换”属性即可。为此,只需构造一个Transform3DGroup并将各个变换添加到它。

例如,如果您的机器人手臂具有名为“UpperArm”,“LowerArm”和“Hand”的Model3D组件,并且您想要找出您可能会做的手的位置和角度:

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

现在您可以在手上找到(0,0,0)位置,如下所示:

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

同样,您可以找到其他点并使用它们来定位您的其他ModelVisual3D。