经纬志
首页 / Cesium / 使用示例

程序生成地形与夸张

没有地形服务也能有起伏:高度图由一个正弦函数在内存里算出来, 滑杆把真实高度放大到十二倍,山脊的立体感立刻出来。

CesiumJS 1.121 · 更新 2026-10-27
源码与运行效果
运行效果

高度图瓦片是怎么算的

回调收到瓦片的行列号 x、y 和层级 level, 需要返回一个长度为 32×32 的高程数组。先把格子坐标换算成经纬度: 经度按 2^level 等分全球 360 度,纬度从北极往下等分 180 度。

换算完成后就可以按任意公式填高程。示例用的是一圈随距离衰减的余弦地形, 叠加两组不同频率的正弦扰动,做出主峰、次峰和沟谷。

夸张系数作用在哪

terrainExaggeration 只影响渲染时的高程缩放,不改原始高度图。 所以拖动滑杆不需要重新生成瓦片,是即时的。缩放的基准由 terrainExaggerationRelativeHeight 决定,设成当地平均海拔, 地形不会整体上浮或下沉。

不同版本的属性名有差别:老版本挂在 globe 上, 新版本迁到了 scene.verticalExaggeration。示例两处都写, 用 typeof 判断后再赋值,跨版本都能用。

可调参数

位置改什么效果
夸张滑杆1 到 12起伏高度按倍数放大
heightAt 里的 3400改成 8000整体山高变化,注意别超过瓦片分辨率
CENTER_LNG / CENTER_LAT换中心位置地形整体搬到别处
SIZE = 32改成 64地形更细腻,瓦片数据量翻四倍
enableLighting改 false地形变成一块平色,起伏全靠轮廓

地形边缘有台阶。高度图分辨率固定为 32×32,一个瓦片覆盖的经纬范围 随层级变大,层级越低一块瓦片覆盖越广、台阶越明显。 区域内做细节时把相机拉近到高层的瓦片即可,或者把 width/height 提高到 64。

和真实地形服务的差异

CustomHeightmapTerrainProvider 每次请求都重新计算整块高度图, 没有预生成的 LOD 数据,适合演示、算法验证和内部工具。 真实业务应该用 CesiumTerrainProvider 接 quantized-mesh 服务, 它带法线与水面掩膜,渲染质量和加载速度都更好。