osgearth,个人笔记.docx
osgearth,个人笔记智能指针使用: osg:Geode* geode=new osg:Geode;/新建Geode指针 osg:ref_ptr<osg:Geode>geodePtr=geode;/构造一个新的ref_ptr对象,并将Geode指针分配给它。新建Geode对象geode的引用计数值变为1 Osg:ref_ptr<osg:Geode> geode1=new osg:Geode;/实现上述两句功能,不会产生内存泄露,当ref_ptr的生命周期结束时会自动释放引用对象 结论:osg中新创建的场景对象建议使用ref_ptr进行内存的分配和管理 对于不使用ref_ptr的对象,引用计数值将变的没有意义,并且它无法自动从场景中卸载 新建对象作为函数结果返回时,建议使用realease传递,并尽快引入到别的场景对象中 叶节点Geode 1、 OSG 定义了osg:Drawable 类,用于保存要渲染的数据。Drawable 是一个无法直接实例化的虚基类。 OSG 核心库从Drawable 派生出三个子类:osg:DrawPixels,封装了glDrawPixels的相关功能;osg:ShapeDrawable,提供了一些已经定义好的几何体的使用接口,如圆柱体和球;osg:Geometry。setVertexArray , setColorArray , setNormalArray用户程序可以使用它们来指定顶点数组,颜色,以及法线数据。setVertexArray和setNormalArray均使用一个Vec3Array 指针作为输入参数,而setColorArray使用一个Vec4Array 指针。 官方OSG四个程序: 1 osgViewer模型查看工具 osgViewer是这四个程序当中用的最多的OSG程序,代码也非常入门与浅显易懂,在开始->运行->CMD中就可以直接启动osgViewer,因为path中添加了它的路径。 下面来看一下osgViewer的功能,如表2.1 表2.1 osgViewer的功能表 命令:注意有的双杠 -image <filename> -dem <filename> 功能 读取纹理文件,比如:osgViewer -image Images/skymap.jpg 以高程图的形式渲染一个镜像/DEM 比如osgViewer -dem a.img -h或-help 命令行参数功能帮助 -help-env 所有可用的环境变量帮助 -help-keys 所有可用键帮助 -help-all 展示所有帮助信息 -SingleThreaded 为viewer选择单线程模式 -CullDrawThreadPerContext 为viewer选择CullDrawThreadPerContext线程模式 -DrawThreadPerContext 为viewer选择DrawThreadPerContext线程模式 -CullThreadPerCameraDrawThreadPerContext 为viewer选择CullThreadPerCameraDrawThreadPerContext线程模式 想用osgEarth做三维地球浏览器,可是一直都不知道osgEarth具体是做什么的,有关的资料也都是英文的,于是就把osgEarth网站上的内容翻译了一下 osgEarth-所需地形 osgEarth是一个为OSG提供的可升级的地形工具包。创建一个简单的XML文件,用形象化的描述、立体图、矢量数据来指明内容,并将其加载到你所喜爱的OSG应用中。osgEarth支持所有类型的数据、并附带很多例子来帮助你研究和运行。 osgEarth可以很容易部署可升级的地形模型: · · · · · · 创建地形模型无论是在本地电脑,或者动态载入 不用书写任何代码便可加载整个地球地形 分层描述所形成的高分辨率插入物 结合多种描述、立体图和飞行模式下的矢量数据源 建立地图块缓存来最大限度的利用性能 为多重纹理效果调整图形的不透明度 但是osgEarth不仅仅可以提供地形: · · · · · 在不同的参考坐标系中重新投影数据 用长坐标来放置额外的模型 可以做快速的交叉测试 把新数据合并到现有的VPB数据库中 可直接访问地形块儿 特定驱动器属性设置,驱动器分为影像/高程驱动器、模型驱动器、特征驱动器、缓冲驱动器以及地形引擎驱动器5大类; 影像/高程驱动器 agglite驱动器,该驱动器将矢量数据栅格化为位图然后然后将其转换为地形瓦片纹理层 ArcGis驱动器 复合驱动器 GDAL驱动器 osg驱动器,直接通过osg的文件读写插件读取相应类型的影响数据或高程 /tilecache驱动器,读取tilecache磁盘缓存数据,通过tilecache工具可以从WMS服务器创建或缓存地图数据到磁盘,然后通过该驱动器进行离线读取。 tileservice驱动器,从NASA服务器读取数据 tms驱动器,通过tms服务的方式读取数据 wms驱动器,通过wms服务的方式读取数据 VPB驱动器,从vpb生成的地形数据库读取相应的影像和高程数据,注意,osgEarth只能读取适用VPB使用terrain选项创建的地形数据库。 模型驱动器: feature_geom驱动器,该驱动器就是将矢量数据创建成几何对象进行渲染 feature_overlay驱动器,该驱动器采用osgSim:OverlayNode将矢量数据作为投影纹理覆盖到地形上。这种覆盖节点的方式对于平面投影坐标模式是很适合的,但对于球体地心。 feature_stencil驱动器,该驱动器采用模板缓冲技术将矢量数据覆盖到地形上 矢量特征数据也要指定自己的驱动器,它不直接创建矢量数据几何体,只是用来读取矢量数据,目前矢量数据驱动器主要是ogr及GDAL, Working with a MapNode at runtime Whether the Map was loaded from an Earth File or created at run time, the Map can modified at runtime. If a Map was loaded from an Earth File, you will first need to get a reference to the MapNode to work with. Use the !Map:findMapNode utility function: /Load the map osg:Node* loadedModel = osgDB:readNodeFile("mymap.earth"); /Find the MapNode osgEarth:MapNode* mapNode = MapNode:findMapNode( loadedModel ); Once you have a reference to the MapNode, you can add image or elevation layers: / Add an OpenStreetMap image source TMSOptions driverOpt; driverOpt.url = "http:/tile.openstreetmap.org/" driverOpt.tmsType = "google" ImageLayerOptions layerOpt( "OSM", driverOpt ); layerOpt.profile = ProfileOptions( "global-mercator" ); ImageLayer* osmLayer = new ImageLayer( layerOpt ); mapNode->getMap->addImageLayer( osmLayer ); You can also remove or re-order layers: / Remove a layer from the map. All other layers are repositioned accordingly mapNode->getMap->removeImageLayer( layer ); / Move a layer to position 1 in the image stack mapNode->getMap->moveImageLayer( layer, 1 );