如何使用HelixToolkit.Wpf.SharpDX动态向HelixViewport添加MeshGeometry3D
解决HelixToolkit.Wpf.SharpDX动态添加MeshGeometry3D到HelixViewport的问题
HelixToolkit.Wpf.SharpDX的3D模型体系和WPF原生控件不同,不能直接用ModelVisual3D或直接操作HelixViewport3D.Children实现需求,正确做法如下:
核心步骤
- 用库自带的
MeshGeometryModel3D包装MeshGeometry3D几何数据 - 将包装后的模型添加到
HelixViewport3D.Items集合而非Children
完整代码示例
// 假设XAML中已定义HelixViewport3D,x:Name="viewport" // 1. 创建MeshGeometry3D几何数据(示例为简单立方体) var cubeMesh = new MeshGeometry3D(); cubeMesh.Positions = new Point3DCollection { new Point3D(-1, -1, -1), new Point3D(1, -1, -1), new Point3D(1, 1, -1), new Point3D(-1, 1, -1), new Point3D(-1, -1, 1), new Point3D(1, -1, 1), new Point3D(1, 1, 1), new Point3D(-1, 1, 1) }; cubeMesh.TriangleIndices = new Int32Collection { 0,1,2, 0,2,3, // 前面 4,5,6, 4,6,7, // 后面 0,4,7, 0,7,3, // 左面 1,5,6, 1,6,2, // 右面 3,2,6, 3,6,7, // 上面 0,1,5, 0,5,4 // 下面 }; cubeMesh.Normals = new Vector3DCollection(Enumerable.Repeat(new Vector3D(0,0,-1),4) .Concat(Enumerable.Repeat(new Vector3D(0,0,1),4)) .Concat(Enumerable.Repeat(new Vector3D(-1,0,0),4)) .Concat(Enumerable.Repeat(new Vector3D(1,0,0),4)) .Concat(Enumerable.Repeat(new Vector3D(0,1,0),4)) .Concat(Enumerable.Repeat(new Vector3D(0,-1,0),4))); // 2. 用MeshGeometryModel3D包装几何数据 var cubeModel = new MeshGeometryModel3D(); cubeModel.Geometry = cubeMesh; // 3. 设置材质(必须,否则模型无法显示) cubeModel.Material = new PhongMaterial { DiffuseColor = new Color4(Colors.Coral.ToColor3(), 1.0f), SpecularColor = new Color4(Colors.White.ToColor3(), 1.0f), SpecularShininess = 80f }; // 4. 添加到HelixViewport3D viewport.Items.Add(cubeModel); // 添加多个模型只需重复上述步骤,创建新的MeshGeometry3D和MeshGeometryModel3D后Add到Items即可
常见错误说明
- 误用WPF原生
ModelVisual3D:HelixToolkit.Wpf.SharpDX有独立的模型体系,需使用库内的MeshGeometryModel3D等类型 - 错误操作
HelixViewport3D.Children:该集合用于添加WPF原生Visual3D元素,库的3D模型应添加到Items集合
内容的提问来源于stack exchange,提问作者luffy
相关产品推荐
相关产品推荐

