前言
我们接着昨天的继续,昨天主要是讲解了DatabasePager类中的特定的成员变量以及run函数的第一部分,对所要请求加载的数据按照是否是网络数据进行分类加载模式。今天我们就看看数据是怎们加载到osg环境中的。
还是在DatabasePager::DatabaseThread::run()函数中,首先我们保证了databaseRequest是线程安全的,因为run()函数是创建一个唯一的写入_loadedModel指针的线程。首先还是先依据前面的数据来源是否为网络来判断readFromFileCache是否为true来区分加载方式。我们进入从缓存中读取文件的方法ReaderWriter::ReadResult FileCache::readNode(),就会发现这个方法就是判断当前文件是为缓存文件,然后调用Registry::instance()->readNode()。而这个Registry::instance()->readNode()函数也就是当readFromFileCache为false(不是网络文件)时在DatabasePager::DatabaseThread::run()函数中调用的是同一个函数(Registry::instance()->readNode())。所以osg加载数据文件的原理就在这。那我们就深入探究一下osg到底是怎么加载模型文件的。
Registry注册机
首先我们先介绍一下Registry::instance()(单例模式—以后会统一的讲解一下osg中的设计模式)。这个Registry即是osg的插件注册的管理器。也就是说我们使用osg加载数据文件的时候,osg是通过某一种插件来进行加载的。我们通过观察osgDB::Registry类的构造函数就会发现osg是不是默认就会加载插件到环境中,为什么不加载呢,因为osg的插件非常的庞大大概有121种,如果osg启动的时候就要预加载这么多的插件就会导致osg的启动速度非常的缓慢,所以osg采用了职责链的设计模式以加载尽量少的插件。我们就来介绍一个osg是如果查找适合目前功能的插件的。也就是Registry::LoadStatus Registry::loadLibrary(const std::string& fileName)
1、 osg会先搜索已经注册的插件列表_dlList,判断插件是否已经被加载到环境中,如果osg找到了符合次格式的插件,getLibraryItr(fileName)
2、 如果osg没有在_ dlList中找到所需插件,那么osg就会根据文件的名称来去plugins文件夹下寻找(osgDB_+此文件的后缀 )同名的插件,load到环境中。DynamicLibrary* DynamicLibrary::loadLibrary(const std::string& libraryName)
3、 如果还是没有找到相应的插件,就代表此文件I/O的操作再次失败,OSG将返回失败信息。
注:通过查看 Registry ::addFileExtensionAlias成员变量,就可以知道我们平时加载的模型文件对应的插件名称。他们会被osg保存成一个map(_extAliasMap。)
而我们的osg读取文件的前期操作就是要进行插件的选择预加载,例如加载stl模型,osg会去plugins目录下查找osgDB_stl.dll插件进行加载。然后通过插件类集成的load函数来进行文件的读取加载操作。我们可以把读取过程总结为下面一张图片,请大家仔细理解
原文链接
相关推荐
2. 加载地形数据:通过OSGEarth::TerrainLayer,我们可以指定DEM文件或在线服务URL,OSGEarth会自动处理数据并构建地形表面。 3. 添加图像覆盖:使用OSGEarth::ImageLayer,我们可以加载卫星图像或者地图瓦片,将其...
1. **创建场景根节点**: 在OpenSceneGraph中,所有的图形元素都位于一个场景图中,需要创建一个`osg::Group`作为根节点。 2. **添加地图节点到场景**: 将`MapNode`插入场景图的根节点,使地图在3D视图中可见。 **第...
加载地形时,我们需要读取高度图,然后创建一个`osg::Image`对象,接着利用`osgterrain::HeightField`将图像数据转换为地形高度场。最后,将`HeightField`与`Terrain`节点关联,设定相应的坐标系统和比例,完成地形...
### OsgEarth2.8 在vs2013 Qt5.4环境下加载谷歌影像与高程数据 #### 一、OsgEarth2.8简介 OsgEarth是基于OpenSceneGraph(OSG)的一个插件集,用于创建地理空间3D应用程序。OsgEarth为开发者提供了丰富的API来处理...
### 数据加载及组织解析 osgEarth #### 一、osgEarth的数据加载流程 osgEarth是一款基于OpenSceneGraph(OSG)的高性能地理空间可视化库,它能够有效地管理和渲染大量的地理空间数据。用户可以通过简单的配置文件...
Qt加载Osg的老方式是使用osg3.4以及以前的某些版本中提供的osgQt项目加载osg,不过这种方式,在3.6等新版本中不再支持,更改起来比较麻烦,由于osg::GraphicsContext类不再提供osg::GraphicsContext::...
同一个osg::Geometry或osg::Geode或osg::Group对象 在不同的位置 用不同的颜色、大小、角度显示
2. **矢量数据加载**:osgEarth支持KML、GML、Shapefile等多种矢量数据格式。`EarthFeatureLayer`用于加载这些数据,创建点、线、面等几何对象,并根据属性信息进行着色和样式设置。 3. **地形数据加载**:地形数据...
2. **数据加载**:osgEarth则提供了丰富的数据加载接口,如`osgEarth::Spatiagram`用于加载地形数据,`osgEarth::MapNode`用于加载地图,`osgEarth::VectorLayer`用于加载矢量数据。 3. **地球可视化**:通过`osg...
1. **配置osgearth**:osgearth是一个基于OpenSceneGraph(osg)的地球可视化库,它可以加载各种地理数据,包括TMS瓦片。首先,你需要在项目中引入osgearth库,并确保其已正确安装和配置。 2. **创建TMS瓦片源**:...
通过osg::ShapeDrawable实现简单的点线面标绘。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
首先,需要包含`osgDB`库,并创建一个`osg::Node`指针,然后调用这个函数,传入点云数据文件的路径。例如: ```cpp osg::ref_ptr<osg::Node> pointCloudNode = osgDB::readNodeFile("path_to_your_point_cloud_...
osgEarth是一个基于OpenSceneGraph(OSG)的开源库,它提供了一种方便的方式来加载和显示地球数据,包括遥感图像、地形、3D模型等。而Qt则是一个流行的跨平台应用程序开发框架,广泛用于创建用户界面。将这两者结合...
osgEarth的插件机制允许扩展其功能,例如增加新的数据源、地图服务或特效。 9. **脚本支持**: 支持Lua和Python脚本,方便用户编写自定义逻辑,控制场景行为,无需深入学习C++。 10. **API详解**: osgEarth ...
osgearth 数据加载及解析 osgEarth 是一个基于 OpenSceneGraph(OSG)的三维地球视图引擎,提供了一个灵活的解决方案来加载和解析地形数据。osgEarth 的数据加载流程可以分为四个步骤:读取 earth 文件、构建 map、...
在OSG中,纹理主要通过`osg::Texture2D`类来实现,它可以加载和管理纹理图像。 ### 自动方式添加纹理 自动方式是OSG最简单且常用的纹理映射方法。当你加载一个带有纹理坐标的数据文件(如OBJ或STL格式)时,OSG会...
例如,你可以使用osg::Geode和osg::Shape类创建几何物体,使用osg::Texture和osg::Image加载纹理,使用osg::Switch控制节点的可见性,以及使用osg::MatrixTransform进行几何变换。 多窗口渲染的一个常见应用场景是...
- **osg::Fog**: OSG提供了`osg::Fog`类,用于设置场景中的雾效。你可以创建一个`osg::Fog`对象,设置其颜色(通常为灰色或白色)、类型(线性或指数)以及距离参数。 - **Fog属性**: 雾的密度可以通过`setDensity...
Qt加载Osg的老方式是使用osg3.4以及以前的某些版本中提供的osgQt项目加载osg,不过这种方式,在3.6等新版本中不再支持,更改起来比较麻烦,osg::GraphicsContext类不再提供osg::GraphicsContext::...
本文将深入探讨osgTerrain的核心概念、工作原理以及如何利用osg::HeightField进行地形高度数据的处理。 osgTerrain是OpenSceneGraph的扩展,用于高效地渲染大规模地形。它支持多分辨率的地形表示,即LOD(Level of ...