osgEarth的Rex引擎原理分析(七十六)RexTerrainEngineNode和TerrainCuller中_terrain的关系

本文深入探讨osgEarth的Rex引擎,分析RexTerrainEngineNode中的_terrain作为osg::Group如何管理TileNode,以及TerrainCuller中的_terrain如何作为osgEarth::Drivers::RexTerrainEngine::TerrainRenderData管理绘制数据。两者在控制绘制状态和图层方面起关键作用。

目标:(七十二)中的问题149

RexTerrainEngineNode中的_terrain本质是osg::Group,主要是用来管理各级TileNode的。

TerrainCuller中的_terrain本质是osgEarth::Drivers::RexTerrainEngine::TerrainRenderData,主要用来管理rex绘制的数据,包括绘制状态DrawState(当前帧号、绘制绑定等)、绘制图层(一般指image层,不含elevation层,因为添加的图层都是RENDERTYPE_TILE类型的,而elevation层是RENDERTYPE_NONE)。并且将绘制状态DrawState等赋给绘制图层,在图层绘制时会使用到这些变量,起到控制每帧绘制状态的作用。

 

 

待继续分析列表:

9、earth文件中都有哪些options((九)中问题)

10、如何根据earth文件options创建不同的地理信息引擎节点((九)中问题)

11、rex地理信息引擎的四梁八柱((九)中问题)

12、osgEarth::TerrainEngineNode中setMap方法作用((十二)中问题)

13、RexTerrainEngineNode中_mapFrame的作用((十二)中问题)

14、地形变形(Terrain morphing)((十二)中问题)

15、地球瓦片过期门限的含义((十二)中问题)

16、高分辨率优先的含义((十二)中问题)

17、OSGEARTH_DEBUG_NORMALS环境变量的作用((十二)中问题)

18、活跃瓦片寄存器的作用((十二)中问题)

19、资源释放器子节点的作用((十二)中问题)

20、共享几何图形池子节点的作用((十二)中问题)

21、分页瓦片加载器子节点的作用((十二)中问题)

22、分页瓦片卸载器子节点的作用((十二)中问题)

23、栅格化器子节点的作用((十二)中问题)

24、地形子节点的作用((十二)中问题)

25、绑定渲染器的作用((十二)中问题)

26、地图回调函数的作用((十二)中问题)

27、如何将地图图层添加到rex引擎中((十二)中问题)

28、选择信息的作用((十二)中问题)

29、瓦片包围盒修改回调函数的作用((十二)中问题)

30、刷新rex引擎((十二)中问题)

31、刷新边界作用((十二)中问题)

32、osgEarth::Metrics类的意义((十四)中问题)

33、请求合并队列_mergeQueue((十四)中问题)

34、分页瓦片加载器在更新遍历时对请求处理过程((十四)中问题)

35、分页瓦片加载器在更新遍历时对已处理请求裁剪过程((十四)中问题)

36、已处理的请求队列_requests((十四)中问题)

37、DatabasePager中的_fileRequestQueue和_httpRequestQueue((十六)中问题)

38、瓦片请求的生成到处理过程详解((十六)中问题)

<think>我们正在讨论的是osgEarth中的TMSElevationLayer,特别是setMinLevelsetMaxLevel两个方法。 根据用户的问题,需要说明这两个方法的使用方法、作用以及相关注意事项。 首先,TMSElevationLayer是用于加载TMS(Tile Map Service)格式的高程数据(地形)的图层类。它继承自ElevationLayer,而ElevationLayer又继承自TileLayer。在TileLayer中,有设置最小最大层级的函数。 作用: 1. setMinLevel(unsigned int level): 设置图层加载的最小瓦片级别(层级)。低于此级别的瓦片不会被加载。 2. setMaxLevel(unsigned int level): 设置图层加载的最大瓦片级别(层级)。高于此级别的瓦片不会被加载。 使用方法: 在代码中,可以通过创建TMSElevationLayer的实例,然后调用这两个方法来设置。 注意事项: 1. 级别(Level)从0开始,0级表示最粗粒度的瓦片(覆盖范围最大,分辨率最低),级别越高,瓦片分辨率越高。 2. 设置合理的层级范围可以避免加载不必要的数据,提高性能。 3. 如果设置的最大层级超过了数据源实际提供的最大层级,则不会加载任何数据(或者只会加载到数据源的最大层级,具体取决于驱动实现)。 4. 同样,如果设置的最小层级高于数据源的最小层级,则最低层级的瓦片将不会被加载(可能会显示空白或使用其他图层的数据)。 下面结合代码示例进行说明: 示例代码: ```cpp #include <osgEarth/TMSElevationLayer> #include <osgEarth/Map> // 创建TMS高程图层 osgEarth::TMSElevationLayer* tmsElevation = new osgEarth::TMSElevationLayer(); // 配置TMS的URL tmsElevation->setURL("http://tileserver/tms.xml"); // 假设的TMS服务地址 // 设置最小层级为3,即从第3级开始加载(0,1,2级不加载) tmsElevation->setMinLevel(3); // 设置最大层级为15,即最多加载到第15级(16级及以上不加载) tmsElevation->setMaxLevel(15); // 将图层添加到地图 osgEarth::Map* map = ...; // 获取地图指针 map->addLayer(tmsElevation); ``` 另外,也可以通过TMSOptions来设置: ```cpp #include <osgEarth/TMS> osgEarth::TMSOptions options; options.url() = "http://tileserver/tms.xml"; options.minLevel() = 3; options.maxLevel() = 15; osgEarth::TMSElevationLayer* tmsElevation = new osgEarth::TMSElevationLayer(options); map->addLayer(tmsElevation); ``` 注意事项补充: 1. 在设置层级时,需要确保数据源在指定的层级范围内有数据,否则可能导致地形显示不完整。 2. 当多个高程图层叠加时,每个图层都可以设置自己的层级范围,osgEarth会进行融合。 3. 如果同时设置了TileSource的DataExtent(数据范围,包括层级范围),那么实际加载的层级范围是两者(setMinLevel/setMaxLevelDataExtent)的交集。 引用站内资料: 在引用[2]中提到了osgEarth的缓存机制(MemCache),设置层级范围也会影响缓存的数据量[^2]。 关于性能优化: 合理设置最小最大层级是优化性能的重要手段,避免加载过细或过粗的瓦片,减少内存占用网络请求。 总结: setMinLevelsetMaxLevel用于控制TMSElevationLayer加载瓦片的层级范围,从而控制数据加载的粒度性能。 相关问题: 1. 如何根据当前视图动态调整地形瓦片的加载层级? 2. 在osgEarth中如何合并多个高程图层的显示? 3. osgEarth中地形瓦片的缓存机制是如何工作的?[^2] </think> ### OSGEarth::TMSElevationLayer 中 `setMinLevel` `setMaxLevel` 详解 #### 🎯 作用与功能 这两个方法用于控制 TMS 高程瓦片图层的加载范围: 1. **`setMinLevel(level)`** - 设置**最低加载层级**(最粗糙分辨率) - 低于此层级的瓦片不会被加载 - 例如:`setMinLevel(5)` 表示跳过 0-4 级瓦片 2. **`setMaxLevel(level)`** - 设置**最高加载层级**(最精细分辨率) - 高于此层级的瓦片不会被加载 - 例如:`setMaxLevel(18)` 表示停止加载 19 级及以上瓦片 #### 📝 使用方法 ##### 代码示例 ```cpp #include <osgEarth/TMS> #include <osgEarth/ElevationLayer> // 创建 TMS 高程图层 osgEarth::TMSElevationLayer* tmsLayer = new osgEarth::TMSElevationLayer(); // 设置服务地址(示例URL) tmsLayer->setURL("http://tileserver/{z}/{x}/{y}.terrain"); // 设置层级范围:仅加载 5-18 级瓦片 tmsLayer->setMinLevel(5); // 最低层级 tmsLayer->setMaxLevel(18); // 最高层级 // 添加到地图 osgEarth::Map* map = ...; map->addLayer(tmsLayer); ``` ##### Earth 文件配置 ```xml <elevation name="tms_terrain" driver="tms"> <url>http://tileserver/{z}/{x}/{y}.terrain</url> <min_level>5</min_level> <!-- 最低层级 --> <max_level>18</max_level> <!-- 最高层级 --> </elevation> ``` #### ⚠️ 核心注意事项 1. **层级范围有效性** - 层级值必须满足:$0 \leq \text{minLevel} \leq \text{maxLevel} \leq \text{服务最高层级}$ - 超出实际层级范围会导致空白区域(如 `maxLevel=25` 但服务只支持到 20 级) 2. **性能优化平衡** - **`minLevel` 过高** → 远距离地形粗糙 (示例:`minLevel=10` 时,远山呈块状) - **`maxLevel` 过高** → 内存/显存消耗剧增[^2] (每提升 1 级,瓦片数量增加约 4 倍) 3. **引擎层级限制** osgEarth Rex 引擎默认支持最大 21 级,如需更高层级需修改配置: ```cpp osgEarth::Registry::instance()->setMaxTextureLevel(23); ``` 4. **坐标系一致性** 确保层级定义与 TMS 服务的原始坐标系匹配(如 Web Mercator 的层级定义不同于经纬度坐标系)[^3] 5. **多图层协同** 当多个高程图层叠加时,实际显示层级范围由各图层的 `minLevel/maxLevel` 共同决定 #### 💡 应用场景示例 ```cpp // 根据视点距离动态调整层级 osgEarth::ViewPoint vp = earthManipulator->getViewpoint(); double range = vp.range()->as(osgEarth::Units::METERS); if (range > 10000) { // 远距离:加载粗糙瓦片 tmsLayer->setMinLevel(3); tmsLayer->setMaxLevel(10); } else { // 近距离:加载精细瓦片 tmsLayer->setMinLevel(10); tmsLayer->setMaxLevel(18); } ``` #### 📚 引用说明 - 层级限制影响内存缓存机制[^2] - 与视点距离 (`range`) 协同实现动态加载
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值