使用HelixToolKit时如何将SceneNode整体绑定到MeshGeometryModel3D
实现方案
你可以先将分散的多个Mesh几何数据合并为单个MeshGeometry3D实例,即可直接绑定到<MeshGeometryModel3D>组件:
1. 实现Mesh合并方法
// 注意匹配你实际使用的Helix Toolkit/SharpDX命名空间 using HelixToolkit.Wpf.SharpDX; using System.Linq; public static MeshGeometry3D MergeMeshes(IEnumerable<MeshGeometry3D> meshes) { var mergedMesh = new MeshGeometry3D(); var allPositions = new List<Vector3>(); var allNormals = new List<Vector3>(); var allTexCoords = new List<Vector2>(); var allIndices = new List<int>(); int currentIndexOffset = 0; foreach (var mesh in meshes) { allPositions.AddRange(mesh.Positions); if(mesh.Normals != null) allNormals.AddRange(mesh.Normals); if(mesh.TextureCoordinates != null) allTexCoords.AddRange(mesh.TextureCoordinates); allIndices.AddRange(mesh.Indices.Select(idx => idx + currentIndexOffset)); currentIndexOffset += mesh.Positions.Count; } mergedMesh.Positions = allPositions.ToArray(); mergedMesh.Normals = allNormals.Any() ? allNormals.ToArray() : null; mergedMesh.TextureCoordinates = allTexCoords.Any() ? allTexCoords.ToArray() : null; mergedMesh.Indices = allIndices.ToArray(); return mergedMesh; }
2. 生成合并后的几何对象
在你拿到拆分后的geometry数组后,调用上述方法得到整体几何对象:
// 你之前获取拆分mesh的代码 geometry = _sceneModel.Traverse().Where(x => (x is MeshNode)).Select(m => ((MeshNode)m).Geometry).ToArray(); // 合并为单块几何 var mergedHouseGeometry = MergeMeshes(geometry); // 将mergedHouseGeometry赋值给ViewModel中用于绑定的属性即可
3. XML绑定代码
直接将合并后的几何对象绑定到对应属性:
<h:MeshGeometryModel3D Geometry="{Binding MergedHouseGeometry}" Material="{Binding HouseMaterial}" Transform="{Binding ModelTransform}" />
补充说明:如果你的不同子部件需要使用不同材质,不要使用合并方案,改为在ViewModel中声明
Model3DGroup或者ObservableCollection<MeshGeometryModel3D>存储所有子部件的实例,再将集合绑定到Viewport3DX的ItemsSource属性即可实现整体加载和控制。
内容的提问来源于stack exchange,提问作者jm007
相关产品推荐
相关产品推荐

