HelixToolkit工具包创建的3D对象
从平面圆到立体球
不是简单的算法就可以实现的,需要数学基础
需要借助工具HelixToolkit,不需要计算点和三角区域,自动计算
添加Nuget引用
HelixToolkit.WPF
1、立方体AddBox
参数:中心点位置为xyz的一半,xyz的坐标
////Point3D center, Box模型的中心位置 在xyz一半的位置
////double xlength,
////double ylength,
////double zlength
meshBuilder.AddBox(new Point3D(1.5, 2, 2.5), 3, 4, 5);

2、球体AddSphere
参数:中心位置,半径,表面细分,分的越细越球表面平滑,默认32,其实不用太高的平滑度
// Point3D center, double radius = 1, int thetaDiv = 32, int phiDiv = 32
//meshBuilder.AddSphere(new Point3D(0, 0, 0), 3, 40);//球AddEllipsoid椭球
显示未一个圆
调整光源,自然光没有光影层次
增加一个点光源位置

只有点光源的效果
调低自然光亮度为#DDD暗一点

其它位置也不会太暗,有环境光加亮
<Model3DGroup> <AmbientLight Color="#DDD"/> <PointLight Position="0.2,10,10"/> </Model3DGroup>
3、任意多边形AddPolygon
参数就是一个点的集合
List<Point3D> ps = new List<Point3D>();
ps.Add(new Point3D(0, 0, 0));
ps.Add(new Point3D(2, 0, 0));
ps.Add(new Point3D(3, 5, 0));
ps.Add(new Point3D(0, 1, 0));
meshBuilder.AddPolygon(ps);
点必须是连续的顺时针

3,5,1,Z轴1,不是个平面也是可以的,
不能旋转视角,看不出来

4、圆柱体AddCylinder
参数:空间中两个点可以随意,不一定是垂直水平的
//Point3D p1, 圆柱的起点
//Point3D p2, 圆柱的终点
//double diameter, 圆柱的直径
//int thetaDiv 表面细分 ,表面的光滑度
// 最后两个参数:将圆柱下端、上端密封起来(注意:这时候之前的直径参数变为半径)
meshBuilder.AddCylinder(
new Point3D(0, 0, 0),
new Point3D(0, 0, 4),
1.5,
40, true, true);

空心的,直径
meshBuilder.AddCylinder(
new Point3D(0, 0, 0),
new Point3D(0, 0, 4),
3,
40);

5、圆锥AddCone
圆锥如果上下半径一直,也是一个圆柱
顶部半径为0就是圆锥


//Point3D origin, 源点,起点
//Vector3D direction, 另一端的方向
//double baseRadius, 底座的半径
//double topRadius, 顶部的半径
//double height, 高度
//bool baseCap, 是否封底
//bool topCap, 是否封顶
//int thetaDiv 表面细分
meshBuilder.AddCone(
new Point3D(0, 0, 0),
new Vector3D(0, 0, 1),
2,
0,
5,
true, true, 40
);
细分设置3

就是金字塔形
6、扫掠,由线平移成面
完整代码
private void HTCreate() { ModelUIElement3D modelUIElement3D = new ModelUIElement3D(); GeometryModel3D model3D = new GeometryModel3D(); modelUIElement3D.Model = model3D; // HelixToolkit工具包创建的3D对象 MeshBuilder meshBuilder = new MeshBuilder(); ////Point3D center, Box模型的中心位置 在xyz一半的位置 ////double xlength, ////double ylength, ////double zlength /// //// 添加一个立方体 3*4*5 1.5 2 2.5 //meshBuilder.AddBox(new Point3D(1.5, 2, 2.5), 3, 4, 5); // 添加一个圆球 // Point3D center, double radius = 1, int thetaDiv = 32, int phiDiv = 32 //meshBuilder.AddSphere(new Point3D(0, 0, 0), 3, 40);//球AddEllipsoid椭球 // 添加一个任意多边形 //List<Point3D> ps = new List<Point3D>(); //ps.Add(new Point3D(0, 0, 0)); //ps.Add(new Point3D(2, 0, 0)); //ps.Add(new Point3D(3, 5, 0)); //ps.Add(new Point3D(0, 1, 0)); //meshBuilder.AddPolygon(ps); // 添加一个圆柱 //Point3D p1, 圆柱的起点 //Point3D p2, 圆柱的终点 //double diameter, 圆柱的直径 //int thetaDiv 表面细分 ,表面的光滑度 // 最后两个参数:将圆柱两端密封起来(注意:这时候之前的直径参数变为半径) //meshBuilder.AddCylinder( // new Point3D(0, 0, 0), // new Point3D(0, 0, 4), // 1.5, // 40, true, false); // 添加一个锥形 //Point3D origin, 源点,起点 //Vector3D direction, 另一端的方向 //double baseRadius, 底座的半径 //double topRadius, 顶部的半径 //double height, 高度 //bool baseCap, 是否封底 //bool topCap, 是否封顶 //int thetaDiv 表面细分 meshBuilder.AddCone( new Point3D(0, 0, 0), new Vector3D(0, 0, 1), 2, 0, 5, true, true, 3 ); // 扫掠 指定一条线 沿着某个方向进行面的创建 // 自动创建 Positions / TriangleIndices,返回MeshGeometry3D MeshGeometry3D mesh = meshBuilder.ToMesh(); model3D.Geometry = mesh; DiffuseMaterial material = new DiffuseMaterial(); material.Brush = Brushes.Orange; model3D.Material = material; model3D.BackMaterial = material; this.viewport.Children.Add(modelUIElement3D); }
浙公网安备 33010602011771号