HelixToolkit导入模型后如何编辑场景并对指定对象执行旋转变换?
HelixToolkit场景节点变换操作方案
方案1:直接修改目标节点变换(推荐,无需修改场景结构)
你不需要把节点摘出来套组,直接修改节点自身的Transform属性即可实现旋转,代码如下:
var imp = new HelixToolkit.SharpDX.Core.Assimp.Importer(); var scene = imp.Load(".\\test.obj"); foreach (var node in scene.Root.Traverse().ToList()) { if (node.Name.Contains("gate")) { // 直接赋值旋转矩阵即可 node.Transform = new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(1,0,0), 45)).Value; // 如果需要保留节点原有变换,做叠加可以用以下写法 // node.Transform = new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(1,0,0), 45)).Value * node.Transform; } } this.ModelGroup.AddNode(scene.Root);
方案2:需要套组单独管理节点的实现
如果你确实需要把目标节点封装到独立组里做后续批量操作,按以下规则修改:
- 场景图内部的组节点用原生
GroupNode类型,不要用SceneNodeGroupModel3D(这个是WPF层面对接视图的绑定容器,不是场景图节点) - 导入的
scene.Root本身就是GroupNode类型,强转后可调用AddChild方法添加子节点
代码如下:
var imp = new HelixToolkit.SharpDX.Core.Assimp.Importer(); var scene = imp.Load(".\\test.obj"); var rootGroup = scene.Root as GroupNode; foreach (var node in scene.Root.Traverse().ToList()) { if (node.Name.Contains("gate")) { node.RemoveSelf(); var mg = new GroupNode(); mg.AddChild(node); mg.Transform = new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(1,0,0), 45)).Value; // 将组加回场景根节点 rootGroup.AddChild(mg); } } this.ModelGroup.AddNode(scene.Root);
如果你一定要用SceneNodeGroupModel3D容器,可以直接把它加到顶层绑定容器,不需要进导入的场景树:
// 省略节点查找、移除、封装到mg的逻辑 this.ModelGroup.AddNode(scene.Root); this.ModelGroup.AddNode(mg); // 直接加平级的组到视图容器
核心注意点
SceneNode的Transform属性是矩阵类型,WPF的变换对象调用.Value即可获取对应矩阵直接赋值- 场景树内部的节点增删都通过
GroupNode的AddChild、RemoveChild、RemoveSelf方法实现
内容的提问来源于stack exchange,提问作者Dawnkeeper
相关产品推荐
相关产品推荐

