Terrain(地形)

概述:对于地形来说,无非是对地形中每个顶点的有效管理,而UV的控制也是为了控制顶点的y坐标。

 

位置计算:

1.需要的参数:

(1).TILE_EDGE_VTX_NUM:Tile每行顶点数,边数 = 顶点数-1

(2).tileSize:Tile的宽度

(3).viPosition:Tile相对于整个地形的位置

(4).WORLD_SCALE:整个地形放大的倍数

其中1和4是固定参数,可以调节4对地形进行缩放。2和3需要在CPU端计算获取,2是每一个环的Tile宽度相等,不同环之间成2的倍数关系。

2.过程:

(1).渲染的时候,以每个Tile块为单位进行Instance渲染,在渲染前计算出viPosition作为每个Tile块相对于整个地形的位置。

(2).对每个顶点计算

第一步:通过顶点的索引计算出顶点相对于Tile的位置

第二步:然后乘tileSize以及加viPosition,这个时候的结果是此顶点相对整个地形的位置

第三步:顶点乘WORLD_SCALE,这个时候其实是对整个地形的放大,得到一个真实的地形。

 

纹理计算:

一共有四张纹理,两张高度图,两张地形贴图纹理

1.高度计算:

需要的参数:

pos:顶点计算时,第二步的产物,此时的地形还没有放大。

Coarse_HUV_Repeat_Interval:粗糙高度图UV坐标的跨度,这个是控制纹理覆盖的面积的。

Detail_HUV_Repeat_Interval:同理这是细节高度图UV坐标的跨度,一般来说这个跨度应该比粗糙的小。

Coarse_Height_Scale:这个是控制获取到的高度的比例的,与粗糙高度图匹配

Detail_Height_Scale:同上,与细节高度纹理匹配

 

 

在 Cesium 中加载 `.terrain` 格式的地形数据,是通过使用 `CesiumTerrainProvider` 来实现的。`.terrain` 是 Cesium 官方支持的一种地形数据格式,通常由 [Cesium ion](https://cesium.com/platform/cesium-ion/) 或者使用 [Cesium Terrain Builder (CTB)](https://github.com/geo-data/cesium-terrain-builder) 工具生成。 --- ### ✅ 示例代码:加载 `.terrain` 地形数据 ```html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <script src="https://cesium.com/downloads/cesiumjs/releases/1.111/Build/Cesium/Cesium.js"></script> <link href="https://cesium.com/downloads/cesiumjs/releases/1.111/Build/Cesium/Widgets/widgets.css" rel="stylesheet"> </head> <body> <div id="cesiumContainer"></div> <script> // 设置 Cesium 静态资源路径 Cesium.Ion.defaultAccessToken = 'YOUR_ION_TOKEN'; // 如果使用 ion 服务 const viewer = new Cesium.Viewer('cesiumContainer', { terrain: Cesium.Terrain.fromWorldTerrain() // 默认使用 Cesium 全球地形 }); // 加载本地或远程的 .terrain 地形数据 const terrainProvider = new Cesium.CesiumTerrainProvider({ url: 'http://localhost:8000/path/to/your/terrain-root', // 指向 .terrain 文件的根目录 requestWaterMask: true, // 如果需要水体效果 requestVertexNormals: true // 如果需要光照效果 }); viewer.terrain = terrainProvider; </script> </body> </html> ``` --- ### 🔍 代码解释: - `CesiumTerrainProvider`:用于加载 `.terrain` 类型的地形数据。 - `url`:指向地形数据的根目录,通常是一个包含 `root.terrain` 和多个 `.terrain` 分块文件的服务器路径。 - `requestWaterMask`:启用后可以渲染水体效果(如河流、湖泊)。 - `requestVertexNormals`:启用后可以渲染光照效果,使地形更立体。 - `viewer.terrain = terrainProvider`:将新的地形设置为当前 Viewer 使用的地形。 --- ### 🧰 如何构建 `.terrain` 数据? 你可以使用 [Cesium Terrain Builder (CTB)](https://github.com/geo-data/cesium-terrain-builder) 将 DEM(数字高程模型)文件(如 GeoTIFF)转换为 `.terrain` 格式。 #### 示例命令: ```bash ctb-tile -f Mesh -C -o output_dir input_dem.tif ``` - `-f Mesh` 表示生成 `.terrain` 网格数据。 - `-C` 表示压缩地形数据。 - `output_dir` 是输出目录。 - `input_dem.tif` 是输入的 DEM 文件。 --- ### 📁 `.terrain` 目录结构示例: ``` terrain-root/ ├── root.terrain ├── 0/ │ └── 0.terrain ├── 1/ │ └── 0.terrain │ └── 1.terrain ... ``` 你需要将该目录部署到一个支持跨域请求(CORS)的 Web 服务器上,例如使用 Python 简单服务器: ```bash cd terrain-root python3 -m http.server 8000 ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值