【问题标题】:WPF 3D - Positioning Visual3D elements in a 3D scene using nested Model3DGroup transforms?WPF 3D - 使用嵌套的 Model3DGroup 变换在 3D 场景中定位 Visual3D 元素?
【发布时间】:2010-06-05 08:55:18
【问题描述】:

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

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

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

【问题讨论】:

    标签: wpf 3d


    【解决方案1】:

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

    听起来您在问如何在构成您所谓的“模型”的 Model3D 树中计算网络变换到特定 Model3D。为此,您需要知道(或能够扫描和发现)从根 Model3DGroup 到要为其查找变换的 Model3D 的路径。

    一旦您有了这条路径,您所要做的就是在每个级别组合 Transform 属性。为此,只需构造一个 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。

    【讨论】:

    • 谢谢,这基本上就是我发现自己正在做的事情,尽管我发现为了在我的系统中工作,我需要后乘而不是预乘变换所以我不得不颠倒组合变换组中所有变换的顺序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-03
    • 2014-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多