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

点云分块绘制

20 万个高程采样点一次性写进缓冲,再用 setDrawRange 逐块放开。 拖动滑杆可以看到点数与画面的关系,重播按钮演示一次完整的加载过程。

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

为什么不是每次重建几何体

缓冲上传只发生一次,之后每帧改的都是 geometry.drawRange.count。 GPU 侧没有任何重新分配,命令只告诉它「从第 0 个点开始,画前 N 个」。 点云动辄几百万点,重建 BufferGeometry 会造成明显的卡顿, 而改绘制范围是常数级开销。

加载进度用时间增量推进,2.6 秒跑完一轮。真实项目里进度来自分块请求的回调, 每收到一块就把 count 加上这一块的点数,画面与网络进度自然同步。

参数取值说明
网格规模500 × 40020 万点,单个 Float32 缓冲约 2.4 MB
点的尺寸0.075开 sizeAttenuation,远处自然变小
透明度0.92关闭深度写入,避免点的边缘互相遮挡
雾30 – 62远端点淡出,减轻密集区的视觉噪声

颜色即高程

逐点写入 color 属性,材质打开 vertexColors。 色相从 0.58 的蓝走到 0.08 的橙,明度随海拔升高, 这样即使去掉光照也能读出地势起伏。点云没有法线,不适合用 MeshStandardMaterial 那一套光照。

先算包围球。直接构造的 BufferGeometry 包围球是空的, 视锥剔除会误判。写入 position 后调用一次 computeBoundingSphere(), 否则相机转到某些角度时整片点云会突然消失。