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

Three.js:绝对修改加载网格的顶点坐标(扭曲网格)并使用修改后的顶点

解决Three.js中修改顶点坐标后视口无变化的问题

嘿,我碰到过类似的问题,这大概率是因为你没找对Three.js里更新顶点坐标的正确姿势!让我帮你拆解一下:

核心问题:你可能用错了更新标记

Three.js里不同类型的几何体,顶点更新的方式完全不一样,这也是很多人踩坑的地方:

情况1:你用的是BufferGeometry(现在Three.js官方推荐的类型)

如果是BufferGeometry,直接修改顶点后,你需要标记position属性的needsUpdate为true,而不是几何体本身的needsUpdate(后者只针对拓扑结构变化,比如顶点数量增减)。

正确代码示例:

// 假设你的网格实例是mesh
const posAttr = mesh.geometry.attributes.position;

// 遍历所有顶点,修改y坐标
for (let i = 0; i < posAttr.count; i++) {
  const currentY = posAttr.getY(i);
  posAttr.setY(i, currentY - 5.5);
}

// 关键:告诉Three.js这个属性需要更新
posAttr.needsUpdate = true;

// 额外:如果你的材质依赖法线,记得重新计算并更新法线属性
// mesh.geometry.computeVertexNormals();
// mesh.geometry.attributes.normal.needsUpdate = true;

情况2:你用的是旧版的Geometry(已废弃,但部分老项目还在使用)

如果是旧的Geometry,你需要设置verticesNeedUpdate = true,而不是needsUpdate,这是专门用来标记顶点坐标变化的开关:

// 遍历顶点修改y值
mesh.geometry.vertices.forEach(vertex => {
  vertex.y -= 5.5;
});

// 关键标记
mesh.geometry.verticesNeedUpdate = true;

// 若需要更新法线(比如材质用了平滑着色)
// mesh.geometry.computeFaceNormals();
// mesh.geometry.computeVertexNormals();
// mesh.geometry.normalsNeedUpdate = true;

为什么你之前的操作没用?

  • updateMatrixWorld()是用来更新物体的世界空间矩阵的,和顶点坐标修改完全无关,所以调用它不会解决问题;
  • 你设置的geometry.needsUpdate只在几何体拓扑(比如顶点数、面数)变化时才生效,单纯改顶点坐标不需要这个。

额外排查点

如果按上面的方法还是不行,你可以检查这几点:

  1. 确认你修改的是场景中实际渲染的那个网格的几何体——有没有可能你修改的是一个副本,而场景里的是另一个实例?
  2. 检查是否有其他代码(比如动画循环、模型加载回调)在重置顶点坐标,把你修改的值覆盖回去了;
  3. 如果你的网格是SkinnedMesh(蒙皮网格),顶点坐标会被骨骼动画覆盖,这时候你需要修改绑定姿势,或者先禁用蒙皮再修改顶点。

内容的提问来源于stack exchange,提问作者Yücel Sabah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 17:37:30