首页 / three.js / 使用示例
动态几何更新
八十一乘八十一的网格,每帧把顶点高度全部重算一遍,再刷新法线与顶点色。 画面是同心波加交叉波纹,右下角实时显示帧率。
源码与运行效果
更新三步
写入 position 数组,把 needsUpdate 置为真,
再调用 computeVertexNormals()。少了最后一步,水面会像一块平面的贴纸,
光照完全不随起伏变化,因为法线还停留在初始状态。
原始高度、原始 XZ 都单独存了数组。如果每帧从当前 position 反推,
误差会逐帧累积,几分钟后波形就散了。保留一份不动的基准值,是这类持续动画的通用做法。
| 数据 | 规模 | 每帧成本 |
|---|---|---|
| 顶点位置 | 6561 个 | 约两万次浮点写入 |
| 法线 | 同上 | 重算全部三角形叉积 |
| 顶点颜色 | 19683 个分量 | 按高度重新取色 |
| 上传 | 三个缓冲 | 每帧一次,走 bufferSubData |
什么时候该换成着色器
八十乘八十的网格在桌面端毫无压力。换成一平方公里级的精细地形, 顶点数上到百万,逐帧在 JS 里改数组就会成为瓶颈: 主线程要算,还要把几兆数据每帧推给显卡。
那种规模改用顶点着色器做位移,CPU 只传一个时间 uniform, 几何体保持静止。当前示例的价值在于逻辑直观,适合验证数据与波形的对应关系。
暂停时别再刷新。示例在暂停状态下仍然重算顶点,只是时间不推进。 真做交互时应在暂停分支里直接跳过更新,省下的 GPU 上传足够让镜头拖动更顺滑。