程序生成地形与夸张
没有地形服务也能有起伏:高度图由一个正弦函数在内存里算出来, 滑杆把真实高度放大到十二倍,山脊的立体感立刻出来。
高度图瓦片是怎么算的
回调收到瓦片的行列号 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 服务,
它带法线与水面掩膜,渲染质量和加载速度都更好。