五、导入现有模型
在Helixtoolkit中手搓模型太难了,如果能导入现有模型简直不要太方便。helixtoolkit就提供了Assimp支持:HelixToolkit.SharpDX.Assimp,支持导入3DS、CMO、OBJ、FBX、DAE、glTF、LWO、OFF、STL等模型。
1、Importer类
Importer类提供多种 Load
方法,支持从文件路径、文件流加载模型,并加载其中的纹理、材质和动画数据。输出为HelixToolkit 的场景节点树HelixToolkitScene。
// 通过文件路径加载,使用默认配置
public HelixToolkitScene? Load(string filePath);// 通过文件路径加载,指定是否并行处理及后处理步骤
public HelixToolkitScene? Load(string filePath, bool parallelLoad, PostProcessSteps postprocessSteps, params PropertyConfig[] configs);// 通过文件路径和自定义配置加载
public HelixToolkitScene? Load(string filePath, ImporterConfiguration config);// 通过文件流加载,支持格式提示和自定义纹理路径解析器
public ErrorCode Load(Stream fileStream, string filePath, string formatHint, out HelixToolkitScene? scene, ITexturePathResolver? texturePathResolver = null);
HelixtoolkitScene是模型与WPF交互的桥梁,其中包含许多场景节点SceneNode以及动画Animations。利用提供的ScenNodeGroupModel3D类型可以将场景节点添加进模型容器中,最后使用Element3DPresenter控件将其显示出来。
参考代码如下:
public SceneNodeGroupModel3D ModelGroup { get; } = new();
private HelixToolkitScene? scene;private void LoadFile()
{string relativePath = "./Models/3ds/Car.3DS";var importer = new Importer();scene = importer.Load(relativePath);if (scene is null){return;}ModelGroup.AddNode(scene.Root);
}//xaml中
<hx:Element3DPresenter Content="{Binding ModelGroup}" />
2、选中部件
SceneNode是所有其他节点的基类,我们将场景中的3D几何图形节点MeshNode抽取出来即可,注意嵌套关系,GroupNode中会包含GroupNode,GroupNode包含MeshNode。
[ObservableProperty]private Geometry3D? selectedGeometry;[ObservableProperty]private System.Windows.Media.Media3D.Transform3D? selectedTransform;public Material SelectedMaterial { get; } =new PhongMaterial() { EmissiveColor = Color.Yellow };private void TraverseNodes(SceneNode node){if (node is MeshNode meshNode){node.MouseDown += (s, e) =>{SelectedGeometry = meshNode.Geometry;SelectedTransform = new System.Windows.Media.Media3D.MatrixTransform3D(meshNode.TotalModelMatrix.ToMatrix3D());};node.IsHitTestVisible = true;//可选中}// 检查节点是否有子项if (node is GroupNode groupNode){foreach (var child in groupNode.Items){TraverseNodes(child, meshNodes);}}}//XAML中
<hx:MeshGeometryModel3DGeometry="{Binding SelectedGeometry}"IsSelected="True"Material="{Binding SelectedMaterial}"Transform="{Binding SelectedTransform}"/>