怎么在浏览器里看到地下:Cesium地下空间可视化完整指南
【免费下载链接】cesiumAn open-source JavaScript library for world-class 3D globes and maps :earth_americas:项目地址: https://gitcode.com/GitHub_Trending/ce/cesium
做地质研究、管地下管线的时候,你大概遇到过这种场面:要给别人讲地层结构或矿井布局,要么翻出笨重的桌面三维软件,要么只能拿平面图对着念。其实不用这么麻烦——Cesium地下空间可视化就是干这个的:在 WebGL 里把地表调成半透明,把矿井、管线模型埋到地面以下,再让镜头跟着你一路钻进地下。这篇指南会带你从"地球内部分层"一路做到"矿井地下漫游",全程只需要几行 API。
能力速览:Cesium 能帮你把地下翻出来吗
一句话定位:Cesium 是 Apache 2.0 协议的 JavaScript 库,主业是在浏览器里做世界级 3D 地球和地图,而它内置的 Globe 透明化能力正好能反过来"看穿"这颗地球。
和地下场景直接相关的核心能力有 4 条:
- 🌍地表透明化(Translucency):地球正面可以整体半透明,也能只让一个经纬度矩形区域透明
- ⛏️地下背景与深度渐变(undergroundColor):给地下空间指定背景色,并按相机距离控制不透明度
- 🎮相机可入地:关掉屏幕空间控制器的碰撞检测后,视点可以飞到负高程
- 📦灵活的地下内容:从椭球图元(做地球内核)到 glTF/GLB 模型(做矿井、隧道)都能放
| 你想做的事 | 对应的解法 |
|---|---|
| 展示地核、地幔分层 | entity + ellipsoid,三个半径不同的椭球套娃 |
| 地下矿井/管线模型可见 | translucency 透明化 + model 实体置于负高程 |
| 镜头钻进地下去"走" | enableCollisionDetection = false |
| 制造纵深感、避免一锅黑 | undergroundColorAlphaByDistance 距离渐变 |
五分钟跑通一个能看地下的场景
先把仓库拉下来跑起来:
git clone https://gitcode.com/GitHub_Trending/ce/cesium cd cesium && npm install && npm start接着写最小示例。这里的关键是两件事:让相机能进地下,让地表透起来。
const viewer = new Cesium.Viewer("cesiumContainer"); // 关闭碰撞检测,否则镜头会被地面"挡住"进不去 viewer.scene.screenSpaceCameraController.enableCollisionDetection = false; // 打开地球透明化,正面透明度 0.25 viewer.scene.globe.translucency.enabled = true; viewer.scene.globe.translucency.frontFaceAlpha = 0.25;就这四行,地球表面已经变成一层"玻璃"。仓库里自带的 globe-interior 示例 就是在这个骨架上再加三层椭球做地球内部结构,可以直接照着改。
实战核心:地下可视化三件事
三行代码让地表透明
效果:地面变半透明后,藏在下面的模型、矢量面、管线立刻显形,就像给地球开了 X 光。
核心代码:最省事的就是前面用过的translucency.enabled = true加frontFaceAlpha(0~1,越小越透)。如果你想只对某一地区透明、别处保持原样,就把范围锁死在一个矩形里:
globe.translucency.rectangle = Cesium.Rectangle.fromDegrees(-120, 0, -30, 45),即西经 120°~30°、北纬 0°~45° 的区块。
提示:还有一种"颜色遮罩"玩法——用影像图层的colorToAlpha把海洋这种纯色区域抠掉(官方 globe-interior 示例里就是把蓝色海洋抠成透明),适合只想"挖掉某类地物"的场景。
怎么把模型放进地下
效果:矿井、隧道模型被埋在地表以下,地表透明后从上方"看穿",镜头再飞近就能贴着模型走。
核心代码:给实体一个负高程的位置,再挂上模型即可。仓库自带一座真实的铅矿模型:
// 高程 -500 表示埋在地面以下 500 米 const position = Cesium.Cartesian3.fromDegrees(-3.825, 53.117, -500); viewer.entities.add({ position, model: { uri: "../../SampleData/models/ParcLeadMine/ParcLeadMine.glb", }, });提示:模型坐标系对准经纬度时,先用 DebugModelMatrixPrimitive 这类调试手段确认矩阵没跑偏,能省半天排查时间。
怎么做出纵深感
效果:镜头进入地下后,屏幕不再是"一锅黑",而是近处隐约可见、深处逐渐沉入背景色,天然带出空间纵深。
核心代码:给地下指定一个背景色,再用按距离变化的不透明度拉开层次:
globe.undergroundColor = Cesium.Color.BLACK; // 地下背景色 // 相机附近 1 千米内完全透明,1000 千米外完全不透明 globe.undergroundColorAlphaByDistance.near = 1000; globe.undergroundColorAlphaByDistance.nearValue = 0.0; globe.undergroundColorAlphaByDistance.far = 1000000; globe.undergroundColorAlphaByDistance.farValue = 1.0;提示:调 near/far 两个距离就是调"雾墙"的厚度,近处太黑就往前挪 nearValue,远处太透就压低 farValue。
避坑指南:地下漫游的三个高频问题
现象一:相机死活钻不进地下,拖到地面就停住原因:screenSpaceCameraController的碰撞检测默认开启,地面会一直"顶"住镜头;另外frontFaceAlpha = 1时地表不透明,就算进去了也看不见东西。 解法:enableCollisionDetection = false打开入口,再配translucency保证通透,两者缺一不可。
现象二:一进地下就一片死黑,模型像贴在黑纸片上原因:默认地下背景是单一黑色,没有距离层次,深度信息全丢了。 解法:启用上一条讲的undergroundColorAlphaByDistance渐变;模型多的话,把undergroundColor换成深灰(如Color.LIGHTSLATEGRAY)再对比一下,模型轮廓会清楚很多。
现象三:地下数据一多,帧率肉眼可见地掉原因:地下模型默认全量细节加载,相机又离得近,绘制量直接爆表。 解法:大块地下数据别用单个 glb,拆成 3D Tiles 做流式加载与 LOD,视口外自动剔除;同时给地下场景加一层雾(scene.fog),远处的几何体被雾吃掉,视觉上和性能上都是双收益。
资源与下一步
想继续深挖,直接去这些地方翻:
- 官方文档目录:Documentation/
- 地球内部示例:packages/sandcastle/gallery/globe-interior/
- 地下背景色示例:packages/sandcastle/gallery/underground-color/
- Globe 透明化 API 源码:packages/engine/Source/Scene/Globe.js
- 矿井样本模型:Apps/SampleData/models/ParcLeadMine/
下一步你可以直接动手:
- 打开 globe-interior 示例,在工具栏切换 "Translucency mask" 和 "Translucency rectangle",对比两种透明化方式的差异
- 把
frontFaceAlpha从 0.25 一路调到 0.05,感受透明度对地下模型可读性的影响 - 换成你自己的管线或隧道 glTF 模型,放到负高程上,再叠加 underground-color 示例里的距离渐变,做出属于自己项目的地下漫游效果
【免费下载链接】cesiumAn open-source JavaScript library for world-class 3D globes and maps :earth_americas:项目地址: https://gitcode.com/GitHub_Trending/ce/cesium
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考