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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 22:29:55