首页 / three.js / 使用示例
点云分块绘制
20 万个高程采样点一次性写进缓冲,再用 setDrawRange 逐块放开。
拖动滑杆可以看到点数与画面的关系,重播按钮演示一次完整的加载过程。
源码与运行效果
为什么不是每次重建几何体
缓冲上传只发生一次,之后每帧改的都是 geometry.drawRange.count。
GPU 侧没有任何重新分配,命令只告诉它「从第 0 个点开始,画前 N 个」。
点云动辄几百万点,重建 BufferGeometry 会造成明显的卡顿,
而改绘制范围是常数级开销。
加载进度用时间增量推进,2.6 秒跑完一轮。真实项目里进度来自分块请求的回调,
每收到一块就把 count 加上这一块的点数,画面与网络进度自然同步。
| 参数 | 取值 | 说明 |
|---|---|---|
| 网格规模 | 500 × 400 | 20 万点,单个 Float32 缓冲约 2.4 MB |
| 点的尺寸 | 0.075 | 开 sizeAttenuation,远处自然变小 |
| 透明度 | 0.92 | 关闭深度写入,避免点的边缘互相遮挡 |
| 雾 | 30 – 62 | 远端点淡出,减轻密集区的视觉噪声 |
颜色即高程
逐点写入 color 属性,材质打开 vertexColors。
色相从 0.58 的蓝走到 0.08 的橙,明度随海拔升高,
这样即使去掉光照也能读出地势起伏。点云没有法线,不适合用 MeshStandardMaterial 那一套光照。
先算包围球。直接构造的 BufferGeometry 包围球是空的,
视锥剔除会误判。写入 position 后调用一次 computeBoundingSphere(),
否则相机转到某些角度时整片点云会突然消失。