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);
}

 

posted on 2025-03-30 15:26  张彦山  阅读(467)  评论(0)    收藏  举报