osgEarth基础入门
2015年3月21日
16:19
osgEarth是基于三维引擎osg开发的三维数字地球引擎库,在osg基础上实现了瓦片调度插件,可选的四叉树调度插件,更多的地理数据加载插件(包括GDAL,ogr,WMS,TMS,VPB,filesystem等),再结合一套地理投影转换插件,这样就能够实现高效处理加载调度地理数据在三维地球上的显示,实现三维虚拟地球。
想要实现一个简单的基于osgEarth的三维地球,有两种方式,这两种方式是互通的。一种基于XML标签的earth文件加载,另外一种是采用C++代码,本质是一样的,osgEarth内部支持直接解析XML标签文件,转换为代码实现,具体参考tests文件夹例子,代码则参考application下面例子。但是大多数情况下,你需要更灵活掌控性更强的代码来实现功能,因为只有一个加载了基础数据的三维地球是只能看,不能解决实际问题的,需要界面通常采用QT,更多的三维渲染和仿真业务则由osg来完成。因此学好osg是做这一切的基础。
osgEarth的特点:支持加载常见的栅格数据(影像和DEM),但是大数据必须建立金字塔,设置为地理投影,想要高效率最好处理为瓦片,这样也便于部署在服务端。矢量数据,最好尽可能的简化,因为大的矢量会十分影响渲染速度,当然也可以对矢量栅格化处理加快速度,对于模型的话,大数据量一定要做LOD或者pageLod。
osgEarth程序的常规流程:
创建osgViewer---->创建MapNode---->设置Earth操作器---->设置场景参数----->run
MapNode是继承自osg的Node,是osgEarth中地球节点,你所添加的影像,DEM,模型都包含在MapNode中,因为它们都加入到Map中,Map则类似二维中的Map可以添加各种图层。剩余的不管是模型节点Node,或者是标注Node,还是其他的都是可以直接添加到MapNode中或者另外的Group中。
Earth操作器则和其他osg操作器一样,只不过专门为三维地球浏览定制,具体参数可以设置。
场景参数则主要有自动地形裁剪,最小裁剪像素等其他优化场景的参数。
下面就简单阐述一个小例子说明:
代码功能主要实现了查询实时高程,并显示XYZ坐标的功能。
使用命令app.exe test.earth即可得到下面的效果。
//引入osg和osgEarth的头文件和命名空间 #include <osgGA/StateSetManipulator> #include <osgGA/GUIEventHandler> #include <osgViewer/Viewer> #include <osgViewer/ViewerEventHandlers> #include <osgUtil/LineSegmentIntersector> #include <osgEarth/MapNode> #include <osgEarth/TerrainEngineNode> #include <osgEarth/ElevationQuery> #include <osgEarth/StringUtils> #include <osgEarth/Terrain> #include <osgEarthUtil/EarthManipulator> #include <osgEarthUtil/Controls> #include <osgEarthUtil/LatLongFormatter> #include <iomanip> using namespace osgEarth; using namespace osgEarth::Util; using namespace osgEarth::Util::Controls; static MapNode*