WPF 实战使用 HelixToolkit 工具包快速创建 3D 对象

66 阅读5分钟

前言

在3D图形开发中,创建复杂的几何对象往往需要扎实的数学基础和大量的计算工作。然而,借助强大的开源工具包 HelixToolkit,开发者可以轻松实现从平面圆到立体球的转变,而无需手动计算点和三角区域。

本文将介绍如何通过 HelixToolkit 在 WPF 中快速创建常见的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);
}

总结

通过本文的学习,我们了解了如何使用 HelixToolkit 工具包在 WPF 中高效创建各种3D几何对象。从立方体到球体,从简单的圆柱到复杂的扫掠形状,HelixToolkit 提供了丰富的 API 和简便的操作方式,极大地简化了 3D 图形开发的复杂性。同时,通过调整光源和材质,我们可以进一步增强 3D 对象的视觉效果。希望本文能为大家的 3D 开发提供有价值的参考,我们可以探索更多 HelixToolkit 的强大功能!

最后

如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。

也可以加入微信公众号 [DotNet技术匠] 社区,与其他热爱技术的同行一起交流心得,共同成长!

优秀是一种习惯,欢迎大家留言学习!