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只在几何体拓扑(比如顶点数、面数)变化时才生效,单纯改顶点坐标不需要这个。
额外排查点
如果按上面的方法还是不行,你可以检查这几点:
- 确认你修改的是场景中实际渲染的那个网格的几何体——有没有可能你修改的是一个副本,而场景里的是另一个实例?
- 检查是否有其他代码(比如动画循环、模型加载回调)在重置顶点坐标,把你修改的值覆盖回去了;
- 如果你的网格是
SkinnedMesh(蒙皮网格),顶点坐标会被骨骼动画覆盖,这时候你需要修改绑定姿势,或者先禁用蒙皮再修改顶点。
内容的提问来源于stack exchange,提问作者Yücel Sabah
相关产品推荐
相关产品推荐

