【问题标题】:Triangulation of 3D points with K vertices per face每个面有 K 个顶点的 3D 点的三角剖分
【发布时间】:2017-07-12 14:37:48
【问题描述】:

我正在使用 Three.js。我有一组 3D 点 (x, y, z) 和一组面孔。一张脸由 K 个点 组成。它可以是凸的也可以是凹的。 我在 Three.js 文档中找不到任何可以帮助我的东西。一种解决方案是对这些形状进行三角剖分,但到目前为止我还没有找到任何简单的 3D 三角剖分算法。

另一种解决方案是这样做:

var pointsGeometry = new THREE.Geometry();

pointsGeometry.vertices.push(new THREE.Vector3(10, 0, 0));
pointsGeometry.vertices.push(new THREE.Vector3(10, 10, 0));
pointsGeometry.vertices.push(new THREE.Vector3(0, 10, 0));
pointsGeometry.vertices.push(new THREE.Vector3(1, 3, 0));
pointsGeometry.vertices.push(new THREE.Vector3(-1, 3, 0));
pointsGeometry.vertices.push(new THREE.Vector3(10, 0, 0));

var material = new THREE.MeshBasicMaterial({color: 0x00ff00});

var mesh = new THREE.Shape/ShapeGeometry/Something(pointsGeometry, material);
group.add(mesh);

scene.add(group);

我有很多这样的形状,它们组成了一个封闭的表面。

有什么建议吗?

感谢您的关注。 祝你有美好的一天。

【问题讨论】:

    标签: javascript three.js geometry shape triangulation


    【解决方案1】:

    正如您所指出的,有两种方法可以实现:

    • 使用 3D 三角测量算法(Three.js 未提供);
    • 使用通常用于 Three.js Shape 对象的 2D 三角测量算法,并对几何体的每个面应用一些变换。

    最后一个看起来很酷,但不幸的是,当我尝试时,我意识到这并不是那么微不足道。我想出了类似于 Paul-Jan 所说的话:

    对于几何图形的每个面:

    1. 计算人脸的质心;
    2. 计算人脸法线;
    3. 计算人脸矩阵;
    4. 将 3D 点投影到人脸的 2D 平面上;
    5. 创建几何体(使用Shape 三角剖分算法进行三角剖分);
    6. 将面矩阵应用于新创建的几何体
    7. 创建一个Mesh 并将其添加到Object3D(我尝试将所有几何图形合并为1,但使用ShapeBufferGeometry 失败)

    检查this fiddle

    注意顶点的winding order 或将THREE.Material.side 放到THREE.DoubleSide 以防止面被剔除。

    【讨论】:

    • 我已经知道这些点是共面的,所以我可以很容易地计算平面的法线,将平面和点投影到 X、Y 平面。我已经有一个自己的二维三角测量算法。之后我不需要将点反转到前一个平面,因为我只需要它们的顺序,之后,按照点的顺序,我可以轻松地形成三角形并将它们发送到 three.js 并使用缓冲区几何构建一个对象(看起来我无法标记你)但是谢谢,演示很棒,我要用我的数据测试它,看看它是否适合我的系统:)
    【解决方案2】:

    我认为您可能想重新访问 Three.js 文档,尤其是 Shape 对象。该页面上的示例代码使用bezierCurveTo,但如果您改用lineTo,您可以将点序列输入它并创建凹多边形(包括孔)。

    【讨论】:

    • OP 必须处理 3D 点,但 triangulation algorithm of Three.js Shape 可以处理 2D 点。在传递到Shape 之前,多边形的每个面都需要进行转换。
    • 啊,好点子。我当时的表情是你可以只给它输入 3D 点,事情就会自动解决,谢谢指正!现在,您必须首先将每个面的点投影到它们自己的平面上,然后再将形状转换回正确的方向。对于大量的面孔来说不是很实用。
    • @Paul-Jan 感谢您的回答,是的,遗憾的是它不适用于 3d 点。后来我得出了同样的结论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-13
    • 1970-01-01
    • 1970-01-01
    • 2020-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多