经纬志
首页 / three.js / 使用示例

动态几何更新

八十一乘八十一的网格,每帧把顶点高度全部重算一遍,再刷新法线与顶点色。 画面是同心波加交叉波纹,右下角实时显示帧率。

three.js 0.160.0 · 更新 2026-10-28
源码与运行效果
运行效果

更新三步

写入 position 数组,把 needsUpdate 置为真, 再调用 computeVertexNormals()。少了最后一步,水面会像一块平面的贴纸, 光照完全不随起伏变化,因为法线还停留在初始状态。

原始高度、原始 XZ 都单独存了数组。如果每帧从当前 position 反推, 误差会逐帧累积,几分钟后波形就散了。保留一份不动的基准值,是这类持续动画的通用做法。

数据规模每帧成本
顶点位置6561 个约两万次浮点写入
法线同上重算全部三角形叉积
顶点颜色19683 个分量按高度重新取色
上传三个缓冲每帧一次,走 bufferSubData

什么时候该换成着色器

八十乘八十的网格在桌面端毫无压力。换成一平方公里级的精细地形, 顶点数上到百万,逐帧在 JS 里改数组就会成为瓶颈: 主线程要算,还要把几兆数据每帧推给显卡。

那种规模改用顶点着色器做位移,CPU 只传一个时间 uniform, 几何体保持静止。当前示例的价值在于逻辑直观,适合验证数据与波形的对应关系。

暂停时别再刷新。示例在暂停状态下仍然重算顶点,只是时间不推进。 真做交互时应在暂停分支里直接跳过更新,省下的 GPU 上传足够让镜头拖动更顺滑。