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

Mun*_*nro 6 3d wpf

我有一个3D场景,我的3D模型被加载到XAML文件后面的代码中.

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

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

Ray*_*rns 3

正如您毫无疑问所观察到的,当您将 Model3D 分组到 Model3DGroup 中时,子级的 Transform 属性将与父级的 Transform 属性结合起来。

听起来您好像在问如何计算网络变换到 Model3D 树中的特定 Model3D,这些 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);
Run Code Online (Sandbox Code Playgroud)

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

 combined.Transform(new Point3D(0,0,0));
Run Code Online (Sandbox Code Playgroud)

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