osgEarth数据加载及组织解析

2020-02-21 17:00

osgEarth数据加载及组织解析

1.osgEarth的数据加载流程

由前文可知,用户可以使用osgEarth自己的earth文件,简单指定各种数据源,而不用关心数据如何渲染,便能在三维球上显示各种地形数据。本节,将会解读osgEarth如何解析earth文件,利用用户提供的数据源,来构建三维球上的各种地形。

图3.1所示是加载数据的整体流程,本节将就这四个步骤进行具体的解读。

读取earth文件记录数据属性、渲染属性的Conf分解Conf属性构建map对象map对象options对象根据map对象及options对象,创建mapNode节点mapNode节点将mapNode节点加入场景图中,通过分页LOD动态调度进行组织渲染拥有地形的三维场景 图3.1 osgEarth数据加载整体流程

1.1 读取earth文件

osgEarth继承了OSG的插件机制,所以osgEarth提供了专门读取earth文件的osgdb_earth插件。通过查找并调用此插件,达到读取earh文件的目的。图3.2展示了查找读取earth插件的具体流程:

MapNodeHelper::load()ExampleResources.cppReadNodeFunctor(fileName, options)readNodeFile(filename,Registry::instance()->getOptions())ReadFile.hRegistry.hreadNodeFile()ReadFile.cppReaderWriter::ReadResult readNode()options->getReadFileCallback()readNodeImplementation()readImplementation()会根据文件后缀名来查read(readFunc找读写插件,然后调用readFunctor.doRead(*itr)tor)实现文件读取。根据文件名构建ReadNodeFunctor仿函数,具体的读取函数由ReadNodeFunctoR.doRead()完成Registry.cppdoRead(ReaderWriter& rw))_readFileCallback.valid()Registry.h 图3.2 查找读取earth插件的具体流程

这个具体流程展示了osgEarth如何找到读取earth的插件——osgdb_earth.dll。这个流程其实也是osg插件机制中的具体流程,主要在read函数中根据文件后缀名查找读写插件,查找策略见前文2.1.3的OSG插件机制,找到插件后便根据文件名构建ReadNodeFunctor的仿函数,然后调用doRead()函数来具体读取。

无论读取earth文件,还是读取影像数据、高程数据或一般的文字,都是这样一个流程,通过找到具体插件后调用插件里的doRead函数。

在osgdb_earth中,主要就是将earth文件中的内容转换成后面构造map需要的conf对象。图3.3展示了一个包含标签比较全面的earth文件,图3.4为转换后的conf结果结构图:

图3.3 普通earth文件内部代码

图3.4 earth文件转换后的conf对象结构图

如图所示,将earth文件中的标签转换成就conf对象就是将标签语言的嵌套转换成父子关系,然后每个对象包含自己的属性值。

1.2 构建map

由上一节可知,通过earth插件,将earth文件中的数据属性,渲染属性等构成conf对象。接下来,就是根据这些属性,来构造一个包含影像、高程、模型等的map。图3.5展示了osgEarth构造map流程:

deserialize()Mapmap.cppaddImageLayer()addElevationLayer()layerDriverConf为XML一条元素中的所有属性集layerDriverConfaddModelLayer()addTerrainMaskLayer()imageElevation/ heightfieldmodel图3.5 通过属性构造map对象

由图可知,此时构造的map,并没有实际的读取数据,仅仅是将从earth文件中获取的conf对象属性进行分类,构造了一个逻辑map,主要指定了map包含什么图层,每个图层的名字、数据源和所需driver插件。

1.3 构建mapNode

这一步将是加载数据中的重点。在这一步,将会通过上一步获取的map对象及options对象,调用具体的driver插件,来构成地形节点。

构建mapNode的过程可以分为两步,第一步是在osgViewer(OSG最基本的场景图形浏览器,osgEarth最基本的场景图形浏览器是在osgViewer基础上改进的osgEarth_viewer,其主要是加载组织地形数据等,核心渲染功能还是osgViewer)渲染前的预处理,主要在地形引擎的preInitialize()中完成。osgEarth2.4的默认地形引擎为MpterrainEngineNode,所以一般是在MpterrainEngineNode::preInitialize()中完成第一步。这其中,主要完成地形节点的初步框架构建,及底图影像的加载。如图3.6所示

创建地形节点加载底图影像属性Configmaskimages 为XML文件中的所有image元素ConfigSet images = conf.children( \Default_tile_size 256遍历ImageLayerImageLayerOptionsElevatioImageLayer.hnLayerElevationLayerOptionsModelSoElevationLayer.hurceLayerModelSourceOptionsDefault_tile_size 16ConfigSet heightfields =conf.children(\ConfigSet models = conf.children( \ConfigSet overlays = conf.children( \ConfigSet masks = conf.children( \遍历layerDriverConf遍历layerDriverConfoverlay遍历layerDriverConfModelSourceLayer.hMaskLayer遍历layerDriverConfMaskLayerOptionsEarthFileSerializer2.cppMaskLayer.h创建mapNode节点创建模型节点创建overlay模型节点图3.6 构建mapNode第一步逻辑

第二步便是在osgviewer开始渲染,创建漫游,相机开始添加场景时,进行后续的添加,并使用TileKey管理构建四叉树组织。此时根据视点范围及距离,通过OSG的PagedLOD分页机制,动态调度选择加载区域瓦片节点。关于数据如何按四叉树进行组织,分页LOD如何动态调度选择加载数据将在后文进行详细解读。此处主要关注构建mapNode的流程和最后mapNode的逻辑节点树。如图3.7所示。

创建地形节点创建第一层TileKey创建根节点以分页lod加入瓦片模型影像图层:以设置纹理贴图创建瓦片模型高程图层图3.7 构建mapNode第二步逻辑

下面便来解读每一步的详细流程。


osgEarth数据加载及组织解析.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:三年内累积一年工作经验即可申请

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: