CesiumJS 体素渲染怎么做?5 分钟让体数据动起来
2026/9/11 6:09:04 网站建设 项目流程

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 关键配置

参数所属作用建议值 / 说明
providerVoxelPrimitive数据来源Cesium3DTilesVoxelProvider或自定义实现
shapeProvider体数据形状,控制网格如何映射到三维空间BOX/ELLIPSOID/CYLINDER
minBounds/maxBoundsProvider体积的边界物理单位值,非形状空间值
dimensionsProvider每个瓦片的体素个数示例用 8×8×8、4×4×4,越小越流畅
paddingBefore/paddingAfterProvider瓦片四周冗余采样多瓦片数据集设 1,避免接缝采样断裂
availableLevelsProvider层级深度超出层级时requestData返回 reject
customShaderVoxelPrimitive用着色器控制颜色与透明度不传则按 metadata 类型走默认着色
nearestSamplingVoxelPrimitive最近邻采样,边界更锐利色块数据置true,连续数据保持默认
modelMatrixVoxelPrimitive整体变换默认单位矩阵

实战避坑:这些细节别踩

  • 现象:体素完全没渲染,控制台报上下文错误。原因:体素渲染依赖 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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询