把 3D 场景带出浏览器:CesiumJS 5 种导出方式与参数怎么选
【免费下载链接】cesiumAn open-source JavaScript library for world-class 3D globes and maps :earth_americas:项目地址: https://gitcode.com/GitHub_Trending/ce/cesium
评审要一张场景图、汇报要一段飞行视频、交付要一份数据文件——这是 CesiumJS 项目落地时最常遇到的三种需求。引擎本身不负责文件封装,但画面、时钟和数据都在手里,截图、录像、GeoJSON 导出这几件事都能直接做。
能力速览
先建立全貌:
| 导出目标 | 机制 | 产出 |
|---|---|---|
| 静态图 | 当前帧 canvas 转码 | PNG |
| 视频 | 帧序列 + 浏览器 MediaRecorder | WebM / MP4 |
| 地理数据 | 数据源序列化 | GeoJSON / CZML / KML |
| 批量图 | 脚本循环相机位姿 + 重复截图 | 多张 PNG |
| 离屏批处理 | 独立 Scene 实例渲染 | 不受视图干扰的 PNG |
如何把当前画面存成一张清晰的静态图
先等所有瓦片、模型和纹理加载完成,再取画布内容:
const url = canvas.toDataURL('image/png');图片清晰度等于画布物理像素,想更清晰就调大容器尺寸或 devicePixelRatio,而不是事后放大。注意一点:若 canvas 上叠加过其他 2D 内容,导出图会一起带出,截图前确认场景干净。
相机运动与动画过程怎么录成视频
引擎不内置编码器,录视频靠浏览器:用canvas.captureStream()或MediaRecorder按帧采样,相机沿 KML 路径飞行、实体随时钟变化时,录出的就是连续动态画面。帧率建议 30,这是文件大小和流畅度的折中点;60 帧更顺但体积接近翻倍。如果场景本身没动、时钟也没走,画面会是重复帧,录之前先确认动态源。
三种数据格式怎么选
引擎的数据源模块同时覆盖三种格式,都在packages/engine/Source/DataSources/下:GeoJSON 走GeoJsonDataSource,CZML 走CzmlDataSource,KML 由KmlDataSource负责。
- GeoJSON:点、线、面等纯几何要素,最通用
- CZML:在 GeoJSON 之上加时间动态,适合带时间轴的实体
- KML:兼容 Google Earth 等第三方工具
选哪种取决于下游流程吃哪种输入,而不是哪种"更全"。
多视角、多张图时如何批量导出
做法很直接:把相机移动到预设位姿,等该视角渲染稳定,再重复调用上面的截图,循环完成。视角数量多时,可以考虑用离屏的 Scene 实例渲染而不是切换主视图,但代价是多占一份显存,只在中小规模场景划算。
参数与权衡:帧率、分辨率、格式的取舍
- 帧率:视频默认 30,低于 24 会明显卡顿,高于 60 对大多数汇报场景没有收益
- 分辨率:由画布物理像素决定,交付印刷用途再单独提高
- 格式:纯几何选 GeoJSON;带时间动态选 CZML;要给外部 GIS 工具选 KML
三个常见坑:截图时机过早导致图里缺瓦片或缺模型;纹理来自跨域且未走 CORS,toDataURL会抛异常;高分辨率叠高帧率录像时,编码跟不上渲染帧率,视频会比预期卡。
下一步
核对 KmlDataSource.js 里对实体属性的支持范围,或查阅官方 API 文档确认你所在版本的导出方法名。
【免费下载链接】cesiumAn open-source JavaScript library for world-class 3D globes and maps :earth_americas:项目地址: https://gitcode.com/GitHub_Trending/ce/cesium
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考