
地理信息引擎
文章平均质量分 68
hankern
Code World,Cool Life
展开
-
osgEarth的Rex引擎原理分析(二)osg是如何根据文件扩展名寻找需要加载的动态链接库插件的
在(一)中有createLibraryNameForFile,它会根据文件扩展名构造需要加载的动态链接库osgDB/Registry.cpp ReaderWriter::ReadResult Registry::read(const ReadFunctor& readFunctor){ ... std::string libraryName = createLib...原创 2018-11-10 21:21:31 · 1101 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(三十六)为什么要删除设置过的垂直水准面
目标:(二十九)中的问题86椭球体 水平面 应该不是删除,而是信息创建出一个没有垂直水准面的Profile 待继续分析列表:9、earth文件中都有哪些options((九)中问题)10、如何根据earth文件options创建不同的地理信息引擎节点((九)中问题)11、rex地理信息引擎的四梁八柱((九)中问题)12、osgEarth::Terra...原创 2019-01-01 16:03:25 · 395 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(三十四)资源释放器子节点的作用
目标:(十二)中的问题19资源释放器器子节点在rex引擎的setMap中创建,用于释放过期对象的opengl资源osgEarthDrivers/engine_rex/RexTerrainEngineNode.cppvoidRexTerrainEngineNode::setMap(const Map* map, const TerrainOptions& options){...原创 2019-01-01 15:59:37 · 879 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(四十)osgEarth::Drivers::RexTerrainEngine::TileDrawable分析
目标:(三十)中的问题93起到组织瓦片几何图形的作用,不做具体渲染在绘制时,TerrainCuller会从其中提取几何图形信息。osgEarthDrivers/engine_rex/TerrainCuller.cppDrawTileCommand*TerrainCuller::addDrawCommand(UID uid, const TileRenderModel* model...原创 2019-01-05 18:01:58 · 584 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(三十九)ModifyBoundingBoxCallback的使用时机和场合
目标:(三十)中的问题90在计算TIleNode的裁剪遍历时,需要计算瓦片的可视性,这时就需要计算瓦片的包围立方体。每一个几何图形Drawable都会有一个默认的计算包围立方体的方法,这里ModifyBoundingBoxCallback主要是起到修正包围立方体的作用。在rex引擎构造时生成,放入上下文环境中,供使用osgEarthDrivers/engine_rex/RexTerr...原创 2019-01-05 17:59:48 · 382 阅读 · 1 评论 -
osgEarth的Rex引擎原理分析(三十三)分页瓦片卸载器子节点的作用
目标:(十二)中的问题22分页瓦片卸载器是在Rex引擎的setMap函数中创建的,创建之初就关联了活跃瓦片寄存器和资源释放器。作用见下面分析。osgEarthDrivers/engine_rex/RexTerrainEngineNode.cppvoidRexTerrainEngineNode::setMap(const Map* map, const TerrainOptions&a...原创 2019-01-01 08:21:54 · 589 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(三十八)MapFram和MapInfo的关系
目标:(三十)中的问题89osgEarth::MapInfo主要用于记录Map的参数配置信息、投影信息(大地、正交、立方体)和高程插值信息。一般从Map生成MapInfo mapInfo(context->getMap());osgEarth/MapInfo class OSGEARTH_EXPORT MapInfo { osg::ref_ptr&l...原创 2019-01-04 06:38:08 · 454 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(三十二)请求四个状态的含义(IDLE RUNNING MERGING FINISHED)
目标:(二十三)中问题75请求经过PagerLoader加载时初始化为RUNNINGosgEarthDrivers/engine_rex/Loader.cppboolPagerLoader::load(Loader::Request* request, float priority, osg::NodeVisitor& nv){ request->setSta...原创 2018-12-23 06:47:19 · 481 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(三十一)osgEarth::TerrainLayer中的_memCache(osgEarth::MemCache)详解
目标:(二十一)中的问题66继承关系:osgEarth::Cache osgEarth::MemCachecache中的数据是通过cachebin来实现存放的,cachebin有两种,继承关系为:osgEarth::CacheBin MemCacheBin(osgEarth/MemCache.cpp)在osgEarth::Cache中有维护这osgEart...原创 2018-12-09 07:04:55 · 820 阅读 · 2 评论 -
osgEarth的Rex引擎原理分析(三十七)osgEarth如何对投影坐标系和大地坐标系进行显示处理的
目标:(二十九)中的问题87osgEarth如何对投影坐标系和大地坐标系进行显示处理的为什么一个能显示成球,一个显示成平面<map name="MBTiles" type="geocentric" version="2"> <options> <profile>epsg:4326</profile>原创 2019-01-01 16:05:19 · 2581 阅读 · 2 评论 -
osgEarth的Rex引擎原理分析(四十一)osg::State和osg::StateSet的关系
目标:(三十四)中的101osg::State是osg封装的opengl状态机,是全局的。osg状态机会在各个StateSet中切换,以完成图形的绘制。osg/State/** Encapsulates the current applied OpenGL modes, attributes and vertex arrays settings, * implements lazy...原创 2019-01-13 07:25:44 · 1057 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(五十二)CGCS2000与WGS84坐标系的比较
目标:(四十六)中的119文章《2000中国大地坐标系及其与WGS84的比较》对此有详细的比较https://max.book118.com/html/2017/0614/114928909.shtm结论是:实现上相容的(仅在扁率上有微小差异);精度上是一致的。...原创 2019-05-25 20:33:15 · 1071 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(四十八)osgEarth::Drivers::RexTerrainEngine::DrawState的作用
目标:(四十五)中的110每帧都会创建一个DrawState创建在TerrainRenderData::setup(这里存在内存泄漏的问题,因为只有new没有delete,不存在的,_drawState是智能指针,超出范围时会自动销毁,也就是在TerrainRenderData销毁时销毁)osgEarthDrivers/engine_rex/TerrainRenderData....原创 2019-02-17 12:56:00 · 654 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(四十七)Horizon Cull是什么意思
目标:目标:(四十五)中的109Horizon Cull是地平线裁剪的意思,顾名思义,低于水平线的物体都会被裁剪掉。所谓的地平线就是相机位置到地球表面的切线,下图竖直的黑线即是地平点,视点到所有地平点组成一个圆锥。下图中蓝色阴影部分表示地面线以下的点待继续分析列表:9、earth文件中都有哪些options((九)中问题)10、如何根据earth文件options...原创 2019-02-17 06:26:10 · 714 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(五十一)osg::Program与osgEarth::VirtualProgram的关系
目标:(四十五)中的问题113osgEarth::VirtualProgram在apply时用到了osg::Program,也就是VirtualProgram最终是要通过osg::Program实现着色器功能,只不过VirtualProgram中还封装了一些其他内容(比如继承、抽象属性,着色器代码管理等),方便使用而已。待继续分析列表:9、earth文件中都有哪些optio...原创 2019-02-22 06:18:31 · 926 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(四十六)如何定制椭球体并进行椭球体间坐标转换
目标:目标:(四十五)中的108可以用于CGCS2000和WGS84的坐标转换osg::EllipsoidModel默认创建wgs84椭球体将CGCS2000和WGS84的经纬高坐标分别转换为XYZ,然后比较其差值osg/CoordinateSystemNodeclass EllipsoidModel : public Object{inline void conve...原创 2019-02-16 18:29:27 · 972 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(五十)rex引擎shader文件中的#pragma vp_entryPoint vp_location等含义
目标:(四十五)中的问题114#pragma vp_entryPointvp_location指示该shader是顶点shader还是片段shader,以及在相应着色器中的位置。比如"vertex_model"表示在顶点着色器的模型处理阶段,"vertex_view"表示在顶点着色器的视图处理阶段,"vertex_clip"表示在顶点着色器的裁剪/投影处理阶段;"tess_contr...原创 2019-02-21 22:08:31 · 1017 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(四十四)如何控制父子TileNode节点的显隐
目标:(三十七)中的105rex渲染出的地球是靠一块块TileNode瓦片拼接起来的,瓦片之间存在父子关系,一般显示父TileNode就不应显示子TileNode,反之亦然。那么rex是如何做这种显隐控制呢?1、每一个TileNode瓦片在遍历时,会根据是否有子节点及子节点的准备情况来决定是否遍历其_surface(负责具体的显示内容)。osgEarthDrivers/engine_...原创 2019-02-16 07:06:14 · 612 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(四十三)osgEarth的Geographic、Geodetic、Geocentric和Project的关系
目标:(三十六)中的103Geographic采用经纬高,高度是平均海平面高(需要有垂直水准面辅助)Geodetic采用经纬高,高度是相对椭球体的法线高ECEF(也即Geocentric)采用地心直角坐标系XYZProject采用投影坐标系 osgEarth/SpatialReference class OSGEARTH_EXPORT SpatialRefere...原创 2019-01-13 16:25:33 · 1852 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(二十八)活跃瓦片寄存器的作用
目标:(十二)中的问题18翻译为活跃瓦片注册表应该更合适RexTerrainEngineNode中的_liveTiles是osgEarth::Drivers::RexTerrainEngine::TileNodeRegistry,在setMap时创建这个_liveTiles,并放入上下文环境,并随上下文环境在其它地方使用,比如:TileNode的create函数中活跃瓦片寄存器负责管理...原创 2018-11-25 11:59:04 · 406 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(二十七)绑定渲染器的作用
目标:(十二)中的问题25应该是渲染采样器的绑定,这里绑定应该理解为是否为采样器保留了纹理单元,采样器包含COLOR、CLOLOR_PARENT、ELEVATION、NORMAL、CONVERAGE和SHARED五种。大概流程是这样的,rex引擎在setMap时进行绑定初始化,一般都会对五种采样器都进行绑定的,rex的渲染采样器绑定完成后对TileNode设置渲染模型有指导作用。每个T...原创 2018-11-25 07:42:25 · 469 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(九)地图节点MapNode的构建过程
目标:(一)中问题6地图map图层构建完成后,就可以用这个map来构建地图节点osgEarth::MapNode了。osgEarthDrivers/earth/EarthFileSerialize2.cpposg::Node*EarthFileSerializer2::deserialize( const Config& conf, const std::string&...原创 2018-11-11 14:26:05 · 2492 阅读 · 1 评论 -
osgEarth的Rex引擎原理分析(八)TerrainLayer和ElevationLayer的关系
目标:解决(七)中的问题8osgEarth::TerrainLayer是一个基础的图层osgEarth/TerrainLayerclass OSGEARTH_EXPORT TerrainLayer : public VisibleLayer osgEarth::ElevationLayer和osgEarth::ImageLayer都继承自这个基础类。osgEarth...原创 2018-11-11 14:22:17 · 1890 阅读 · 1 评论 -
osgEarth的Rex引擎原理分析(七)地图map图层的构建过程
目标:解决(一)中的问题地图map主要用于存放高层、影像、矢量等图层信息,为构建地图节点MapNode做准备。osgEarthDrivers/earth/EarthFileSerialize2.cpposg::Node*EarthFileSerializer2::deserialize( const Config& conf, const std::string& r...原创 2018-11-11 06:13:04 · 2086 阅读 · 2 评论 -
osgEarth的Rex引擎原理分析(一)地球初始化
分析Rex引擎的起点,要从下面代码开始(或者其它类似)。osg::Node* node = MapNodeHelper().load(arguments, &viewer); 它会解析earth文件,搭建起地球的四梁八柱框架,接下来的帧循环会围绕这个框架进行影像、高程瓦片的调度。这个函数会启动一个读取调用链条(中间省略一些不重要的链条节点)osgDB::readRefNo...原创 2018-11-10 19:58:20 · 3852 阅读 · 3 评论 -
osgEarth的Rex引擎原理分析(六)earth文件如何解析成Config
目标:解决(一)中的问题构建地图节点的依据是ConfigosgEarthDrivers/earth/EarthFileSerialize2.cpposg::Node*EarthFileSerializer2::deserialize( const Config& conf, const std::string& referrer ) const{ osg::...原创 2018-11-10 22:15:28 · 1053 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(五)osgDB::Registry和osgEarth::Registry的关系
都是程序中的唯一实例,通过instance方法保证唯一性。osgDB::Resigstry主要用于存放文件的读写器。osgEarth::Registry主要用于存放地球相关的全局参数信息。 待继续分析列表:1、osg是如何根据文件扩展名寻找需要加载的动态链接库插件的((一)中问题)2、加载动态库插件的过程是什么((一)中问题)3、osgDB::Registry的作用是什...原创 2018-11-10 21:52:47 · 789 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(四)osgDB::Registry的作用是什么
osgDB::Registry在一个osg应用中只有一个实例,保证了不同对象访问到的是同一个东西。osgDB/Registry.cppRegistry* Registry::instance(bool erase){ static ref_ptr<Registry> s_registry = new Registry; if (erase) { ...原创 2018-11-10 21:47:00 · 1265 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(三)加载动态库插件的过程是什么
osgDB/Registry.cpp ReaderWriter::ReadResult Registry::read(const ReadFunctor& readFunctor){ ... std::string libraryName = createLibraryNameForFile(readFunctor._filename); if (loadLi...原创 2018-11-10 21:33:14 · 967 阅读 · 1 评论 -
osgEarth的Rex引擎原理分析(十六)请求合并队列_mergeQueue
目标:(十四)中的33请求合并队列_mergeQueue是在帧循环的更新遍历时构建的。这个是有分页数据库DatabasePager的更新遍历实现的,而不是依靠场景树节点的更新遍历。osgEarthDrivers/engine_rex/Loader.cppboolPagerLoader::addChild(osg::Node* node){ osg::ref_ptr<...原创 2018-11-18 19:30:34 · 634 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(十五)分页瓦片加载器在更新遍历时对请求处理过程
目标:(十四)中的34osgEarthDrivers/engine_rex/Loader.cppvoidPagerLoader::traverse(osg::NodeVisitor& nv){ for(count=0; count < _mergesPerFrame && !_mergeQueue.empty(); ++count)...原创 2018-11-18 19:31:10 · 586 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(二十四)TileNode节点下的场景树分析
目标:(十八)中的问题54osgEarth::Drivers::RexTerrainEngine::TileNode是rex引擎下的一个重要节点,这个节点还不是真正在Earth中看到的瓦片,其内部还有场景树,具体包括一个SurfaceNode和四个下一级LOD的TileNode子节点。SurfaceNode负责本级瓦片的渲染,结构如下:osgEarth::Drivers::RexTerra...原创 2018-11-24 17:43:37 · 541 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(二十三)PagerLoader的traverse过程详解
目标:(十七)中问题48主要包含两个过程:1、已处理过请求的加载这是真正意义上的加载,刚创建出来的请求是从缓存或文件没有关联影像、高程等数据的,需要经过多线程处理后才有数据(详见(十七))。对于这些处理过的请求,在PagerLoader的更新遍历traverse中会进行实质性的处理。具体如下:osgEarthDrivers/engine_rex/Loader.cppvoidP...原创 2018-11-23 07:00:20 · 627 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(二十二)已处理的请求队列_requests
目标:(十四)中问题36这个_requests是PagerLoader的成员变量,用于存放所有在TileNode创建时创建的请求。在DatabasePager对请求进行处理的过程中(详见(十七)),会用到这个队列。这个队列不同于PagerLoader中的队列_mergeQueue:后者是已经对请求中的内容经过了缓存或文件加载,可以应用到TileNode节点上了,而前者主要还是一个内容为空的...原创 2018-11-23 06:19:41 · 431 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(十四)分页瓦片加载器子节点的作用
目标:(十二)中的问题21在rex引擎的setMap中创建了分页瓦片加载器子节点osgEarthDrivers/engine_rex/RexTerrainEngineNode.cppvoidRexTerrainEngineNode::setMap(const Map* map, const TerrainOptions& options){ PagerLoader*...原创 2018-11-17 13:49:08 · 786 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(二十)osgEarth::TerrainEngineNode中setMap方法作用
目标:(十二)中的问题12不同于派生类RexTerrainEngineNode中setMap的内容(详见(十二)),在RexTerrainEngineNode执行setMap时会首先调用TerrainEngineNode的setMap,这里主要完成以下工作:1、设置地图图层_map2、创建地形功能接口类osgEarth::Terrain,这个类可以查询内存的地形场景树、订阅瓦片事件(比...原创 2018-11-22 20:38:23 · 727 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(十二)rex地理信息引擎的四梁八柱
目标:(九)中问题11在(九)中创建rex引擎节点时,会调用osgEarth::TerrainEngineNode的构造函数,该函数负责设置rex引擎的名称、id、着色器和其它一些变量设置,还会添加地形_terrain子节点。rex引擎的四梁八柱是从这里开始的osgEarth/MapNode.cppvoidMapNode::init(){ _terrainEngine-...原创 2018-11-17 09:30:18 · 1345 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(十一)如何根据earth文件options创建不同的地理信息引擎节点
目标:问题(九)中10在对MapNode做初始化时,需要创建地理信息引擎节点。voidMapNode::init(){ _terrainEngine = TerrainEngineNodeFactory::create( terrainOptions );}osgEarth::TerrainEngineNodeFactory创建地理信息引擎节点的过程如下:osgE...原创 2018-11-15 07:21:14 · 1289 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(十九)request请求加载瓦片优先级的含义
目标:(十七)中的问题40 这要先从TileNode的load说起,它会计算出一个priority,但这个优先级还不是request的优先级osgEarthDrivers/engine_rex/TileNode.cppvoidTileNode::load(TerrainCuller* culler){ const SelectionInfo& si = ...原创 2018-11-21 06:51:21 · 714 阅读 · 0 评论 -
osgEarth的Rex引擎原理分析(五十二)osgEarth::VirtualProgram默认出现在哪些位置
目标:(五十一)中的问题121默认出现在五个地方:1、osgEarth::Drivers::RexTerrainEngine::RexTerrainEngineNode节点会设置VirtualProgram,该vp是抽象的,也就是能够被继承使用,在自身节点的渲染中不会起作用osgEarthDrivers/engine_rex/RexTerrainEngineNode.cppRexT...原创 2019-07-11 22:56:41 · 835 阅读 · 0 评论