Three.js:scene.toJSON()无法导出BufferGeometry修改后的高度信息如何解决?
解决方案
1. 优化顶点修改逻辑(解决导出失效的核心)
你原代码的问题在于反复创建新的BufferAttribute赋值给几何体,既低效又没触发Three.js的状态更新机制,导致序列化时读取的是旧缓存数据。改成直接操作原顶点数组的方式:
const attPos = mesh.geometry.attributes.position as THREE.BufferAttribute; const posArray = attPos.array; for (let i = 0; i < attPos.count; i++) { const baseIdx = i * 3; // 读取原数组中的XY坐标 const x = posArray[baseIdx]; const y = posArray[baseIdx + 1]; const height = getApiHeight(new THREE.Vector3(x, y, 0)); // 直接修改Z轴高度 posArray[baseIdx + 2] = height + offset; } // 标记属性已更新,让Three.js同步内部缓存 attPos.needsUpdate = true; // 重新计算几何体边界,确保序列化时能正确识别最新顶点 mesh.geometry.computeBoundingBox(); mesh.geometry.computeBoundingSphere();
2. 为什么原方法导出失败?
Three.js的toJSON()会序列化BufferGeometry的属性,但要求属性的状态被正确标记。你原代码中频繁替换position属性却没有触发更新,导致Three.js内部缓存的还是初始顶点数据,自然导出的JSON不包含修改后的高度。
3. 验证效果
修改后调用scene.toJSON(),查看输出的JSON内容,geometry.attributes.position.array里的Z轴值已经是你通过API获取的高度数据了。
内容的提问来源于stack exchange,提问作者Gangula
相关产品推荐
相关产品推荐

