You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ThreeJS triangulateShape返回null,自定义形状生成失败求助

我来帮你搞定这个triangulateShape返回null的问题,我之前用ThreeJS做自定义形状时也踩过这个坑!

问题出在哪?

THREE.ShapeUtils.triangulateShape() 本质是个2D图形三角化工具,它只认二维坐标,你传入的是带z轴的三维点,函数直接无法处理,所以返回null。另外要确认你的点是按顺时针/逆时针的闭合顺序排列的(你的点顺序没问题,是标准的正方形顶点顺序)。

修复步骤&代码示例

核心就是把三维点转换成二维坐标,再给triangulateShape处理:

// 你的原始顶点数据
const vertexStrings = ["-1 0 1", "-1 0 -1", "1 0 -1", "1 0 1"];

// 第一步:把字符串转成ThreeJS的三维向量(方便后续操作)
const points3D = vertexStrings.map(str => {
  const [x, y, z] = str.split(' ').map(parseFloat);
  return new THREE.Vector3(x, y, z);
});

// 第二步:提取二维坐标——因为所有点的y值都是0,形状在XZ平面上,所以取x和z作为2D坐标
const points2D = points3D.map(v => new THREE.Vector2(v.x, v.z));

// 第三步:调用三角化函数,第二个参数是孔洞数组,这里没有孔洞就传空数组
const faces = THREE.ShapeUtils.triangulateShape(points2D, []);

console.log(faces); // 这时候就能得到你预期的 [[0,1,2], [0,2,3]] 啦!

// 第四步:把三角面加到Geometry里(如果需要渲染的话)
const geometry = new THREE.Geometry();
geometry.vertices = points3D;
// 逐个添加三角面
faces.forEach(indices => {
  geometry.faces.push(new THREE.Face3(...indices));
});
geometry.computeFaceNormals(); // 别忘了计算法线,不然渲染出来可能是黑的

额外提醒

  • 如果你的形状是在XY平面(z值都为0),就提取x和y作为二维坐标就行;
  • 如果你的形状有孔洞,第二个参数传入孔洞的二维点数组即可;
  • 一定要确保顶点顺序是顺时针或逆时针的闭合多边形,不能交叉,否则三角化也会失败。

内容的提问来源于stack exchange,提问作者RmR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:19:02