CesiumJS 体素渲染怎么做?5 分钟让体数据动起来
【免费下载链接】cesiumAn open-source JavaScript library for world-class 3D globes and maps :earth_americas:项目地址: https://gitcode.com/GitHub_Trending/ce/cesium
CesiumJS 的体素渲染(Voxel Rendering)可以把 CT、地质网格这类"体积数据"直接画进三维地球场景,不用手写 WebGL,几行代码即可出效果。
先说清楚:它解决什么问题
传统三维渲染只画表面,而体素渲染把数据当成一个个三维小方块(体素,voxel)逐点存储、逐点采样,直接呈现"内部结构"。就像看蛋糕:表面网格只给你看外壳,体素渲染则能把每一层的夹心切开给你看。
它的核心是一条跑在 GPU 上的光线步进(ray marching)管线:从相机视线出发,在体数据里逐点采样合成颜色和透明度。CesiumJS 用VoxelPrimitive(体素图元)封装了这条管线,你只需要提供数据和一个 provider。
5 分钟上手路径
准备什么数据
体素数据有两种来源:
- 3D Tiles 数据集:仓库自带示例在
Apps/SampleData/Cesium3DTiles/Voxel/,包含 Box、Cylinder、Ellipsoid 三套 tileset,入口都是tileset.json; - 程序生成数据:自定义一个
VoxelProvider,实现requestData,把属性打包成 TypedArray 后用VoxelContent.fromMetadataArray返回。
最小可运行示例
用仓库示例数据只需一个 provider 加一个图元:
const provider = await Cesium.Cesium3DTilesVoxelProvider.fromUrl( "SampleData/Cesium3DTiles/Voxel/VoxelBox3DTiles/tileset.json" ); viewer.scene.primitives.add( new Cesium.VoxelPrimitive({ provider }) ); viewer.camera.flyToBoundingSphere(provider.boundingSphere);看到什么效果
一个半透明的体积块出现在地球上空,可自由旋转、缩放、切片观察内部。想换风格时,给VoxelPrimitive传一个CustomShader,在片元着色器里通过fsInput.metadata读属性,例如用透明度通道按行进距离做指数衰减,就能模拟光散射的体积雾效果。写法可参考packages/sandcastle/gallery/voxels/示例。
参数速查:VoxelPrimitive 与 Provider 关键配置
| 参数 | 所属 | 作用 | 建议值 / 说明 |
|---|---|---|---|
provider | VoxelPrimitive | 数据来源 | Cesium3DTilesVoxelProvider或自定义实现 |
shape | Provider | 体数据形状,控制网格如何映射到三维空间 | BOX/ELLIPSOID/CYLINDER |
minBounds/maxBounds | Provider | 体积的边界 | 物理单位值,非形状空间值 |
dimensions | Provider | 每个瓦片的体素个数 | 示例用 8×8×8、4×4×4,越小越流畅 |
paddingBefore/paddingAfter | Provider | 瓦片四周冗余采样 | 多瓦片数据集设 1,避免接缝采样断裂 |
availableLevels | Provider | 层级深度 | 超出层级时requestData返回 reject |
customShader | VoxelPrimitive | 用着色器控制颜色与透明度 | 不传则按 metadata 类型走默认着色 |
nearestSampling | VoxelPrimitive | 最近邻采样,边界更锐利 | 色块数据置true,连续数据保持默认 |
modelMatrix | VoxelPrimitive | 整体变换 | 默认单位矩阵 |
实战避坑:这些细节别踩
- 现象:体素完全没渲染,控制台报上下文错误。原因:体素渲染依赖 WebGL2。对策:确保初始化时
contextOptions里没把requestWebGl1设为true。 - 现象:体积位置或大小完全不对。原因:
minBounds/maxBounds已改为物理值而不是形状空间值。对策:按世界坐标给边界,椭球体的 z 边界记得从 0 开始往上给。 - 现象:颜色错乱、纹理偏移。原因:metadata 是按 X → Y → Z 顺序平铺的一维数组,长度必须严格等于
dimensions.x * y * z * 通道数。对策:用(z*dy + y)*dx + x公式核对索引,多算一个体素就会全错位。 - 现象:数据边缘发虚、有毛边。原因:默认线性采样把相邻体素混色了。对策:对离散分类数据设置
voxelPrimitive.nearestSampling = true。
还能组合出什么玩法
- 地下地质体数据可视化:柱状或盒状体素很适合表达钻孔柱状层和地下岩体,用
CYLINDER形状加自定义传输函数,把深度、密度映射成颜色,逐层剖开看构造。 - 医学影像三维重建:CT、MRI 天然是逐层体数据,装进体素渲染后可以做 MPR 多平面切片、等值面观察,灰度值直接当传输函数输入。
- 气象网格动态展示:温度、湿度这类网格场数据可以体数据流式加载,配合时钟属性做时间序列动画,观察锋面移动。
体素相关 API 目前标注为 experimental,升级 CesiumJS 版本时留意版本变更日志。想动手的话,从源码 packages/sandcastle/gallery/voxels/ 这个示例读起,是理解整条管线最快的入口。
【免费下载链接】cesiumAn open-source JavaScript library for world-class 3D globes and maps :earth_americas:项目地址: https://gitcode.com/GitHub_Trending/ce/cesium
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考