[原][资料整理][osg]osgDB文件读取插件,工作机制,支持格式,自定义插件
参考:
当使用osgDB读取文件时,会自动根据文件的扩展名来到插件目录中寻找相应的插件,来实现。
比如:
osgviewer cow.osg
调用了osgdb_osg插件去读*.osg文件。
osgviewer model.flt
调用了osgdb_flt插件去读*.flt文件。
使用代码我们是使用如下代码读取写入模型:
//读取
#include <osgDB/ReadFile> osg::ref_ptr<Node> node = osgDB::readNodeFile("cow.osg");
osg::ref_ptr<Image> image = osgDB::readImageFile("lz.rgb"); //保存
#include <osgDB/WriteFile>
osgDB::writeNodeFile(*node, "saved.osg");
使用OSG插件是用户无需过分关心的事情,机制已经建立,当读某文件时,它会自己去寻找相应的插件,当你需要读定特文件的时候,就要确认这个文件的插件是否存在,如果不存在需要编译。
OSG支持的模型类型
|
Plugin name |
Description |
Extensions |
Read |
Write |
Notes |
|
3dc |
3DC point cloud reader |
.3dc .asc |
yes |
no |
|
|
3ds |
3D Studio |
.3ds |
yes |
yes |
|
|
ac3d |
AC3D modeler |
.ac |
yes |
yes |
|
|
bsp |
Quake3 BSP |
.bsp |
yes |
no |
|
|
dae |
COLLADA 1.4.x |
.dae |
yes |
yes |
Requires Collada DOM library. See Collada plugin details |
|
dw |
Design Workshop Database |
.dw |
yes |
no |
|
|
dxf |
Autodesk DXF Reader |
.dxf |
yes |
no |
|
|
fbx |
Autodesk FBX |
.fbx |
yes |
yes |
Requires Autodesk's FBX SDK. If using OpenSceneGraph 2.8.x you'll need version 2010.2 of the SDK. Otherwise checkReaderWriterFBX.h to see which version of the SDK is required (currently 2012.1). If you have problems loading an FBX model please check that it works in Autodesk's FBX QuickTime Viewer first to see if the model was correctly exported. |
|
geo |
Geo |
.gem .geo |
yes |
no |
|
|
Inventor |
Open Inventor format |
.iv .wrl |
yes |
yes |
.wrl Only VRML1.0 |
|
ive |
Native osg binary |
.ive |
yes |
yes |
May also read/write (internal) images |
|
logo |
Logo database |
.logo |
yes |
no |
|
|
lwo |
Lightwave Object |
.lwo .lw .geo |
yes |
no |
|
|
lws |
Lightwave Scene |
.lws |
yes |
no |
|
|
md2 |
Quake MD2 |
.md2 |
yes |
no |
|
|
obj |
Alias Wavefront |
.obj |
yes |
yes |
Also writes materials to .mtl |
|
ogr |
.ogr |
yes |
no |
||
|
Openflight |
Multigen Openflight |
.flt |
yes |
yes |
See OpenFlight plugin details |
|
osg |
Native osg ascii |
.osg |
yes |
yes |
Currently the writer supports OVERRIDE/PROTECTED flags in "StateSets" only for "Modes" and not for "StateAttributes". |
|
pfb |
Performer loader |
All extensions supported by Performer loaders |
yes |
no |
Requires Performer library |
|
shp |
ESRI Shapefile |
.shp |
yes |
no |
|
|
stl |
Stereolithography file |
.stl .sta |
yes |
no |
|
|
vrml |
VRML2 |
.wrl |
yes |
no |
Requires OpenVRML library |
|
x |
DirectX 3D model |
.x |
yes |
no |
图片和视频
|
Plugin name |
Description |
Extensions |
Read |
Write |
Notes |
|
bmp |
Window bitmap |
.bmp |
yes |
yes |
|
|
dds |
DirectX image format |
.dds |
yes |
yes |
|
|
gdal |
GDAL image loaders |
All extensions supported by GDAL |
yes |
no |
|
|
gif |
GIF Image |
.gif |
yes |
no |
|
|
hdr |
High Dynamic Range image |
.hdr |
yes |
yes |
|
|
jp2 |
.jps .jpc |
yes |
yes |
||
|
jpeg |
Jpeg image |
.jpeg .jpg |
yes |
yes |
|
|
Openflight |
Image attribute files |
.attr |
yes |
yes |
Stores additional attributes that are not stored in .rgb files |
|
pic |
PIC image |
.pic |
yes |
no |
|
|
png |
Portable Network Graphics |
.png |
yes |
yes |
|
|
pnm |
.pnm. ppm .pgm .pbm |
yes |
yes |
||
|
rgb |
.rgb .sgi .rgba .int .inta .bw |
yes |
yes |
||
|
tga |
Targa image |
.tga |
yes |
no |
|
|
tiff |
Tiff image |
.tiff .tif |
yes |
yes |
|
|
quicktime |
Quicktime movie loader |
.mov .mpg .mpv .mp4 .m4v .dc .avi .flv .swf |
yes |
yes |
|
|
Quicktime image loader |
rgb. rgba .jpg .jpeg .tif .tiff .gif .png .pict .pct .tga .psd |
yes |
yes |
||
|
xine |
Xine image stream |
.mpg .mpv .db .flv .mov .avi .wmv. xine |
yes |
no |
压缩以及网络传输类型
|
Plugin name |
Description |
Extensions |
Read |
Write |
Notes |
|
curl |
HTTP Protocol Model |
.curl |
yes |
no |
|
|
osga |
|||||
|
txp |
Terrapage file |
.txp |
yes |
no |
Produced by Terra Vista terrain building tools |
|
net |
|||||
|
zip |
|||||
|
tgz |
|||||
|
osgtgz |
字体类型
|
Plugin name |
Description |
Extensions |
Read |
Write |
Notes |
|
freetype |
Freetype font loader |
.ttf .ttc .pfb .pfa .cid .cff .cef .fon .fnt |
yes |
no |
|
|
txf |
GLU texture font |
.txf |
yes |
no |
加载时可以显式加的矩阵操作
|
Plugin name |
Description |
Extensions |
Read |
Write |
Notes |
|
rot |
Rotates to the loaded model |
.rot |
|||
|
scale |
Scales the loaded model |
.scale |
|||
|
trans |
Translates the loaded model |
.trans |
|||
|
normals |
Shows normals of the loaded model |
.normals |
以下来源:图形码农
osgDB负责维护插件的信息注册表,并负责检查将要被载入的OSG插件接口的合法性。
应用程序从文件中读取各部分数据库信息时,需要在不干扰当前渲染的前提下以后台线程的方式进行。
osgDB::DatabaseParger提供了这样的功能。
插件的工作机制
osg插件是一组动态链接库,其中实现了osgDB头文件ReaderWriter定义的接口。OSG不可能查找并加载所有的插件以获取它们支持的文件格式,这样,在程序启动时将会是一个很大的开销。因此,OSG使用职责链(Chain of Responsibility)的设计模式,以加载尽量少的插件。当用户程序尝试使用osgDB读取或写入文件时,OSG将按照如下步骤来查找合适的插件。
- OSG搜索已注册的插件列表,查找支持文件格式的插件。开始时已注册插件列表仅包含了Registry类构造函数中注册的插件。如果OSG找到了可以支持此文件格式的插件,并成功执行了I/O操作,那么它将返回相应的数据。
- 如果没有发现可以支持此格式的已注册插件,或者I/0操作失败,那么OSG将根据前面所述的文件命名规则创建插件文件的名称,并尝试读取相应的插件库。如果读取成功,OSG将添加此插件到已注册插件列表中。
- OSG将重复步骤(1),如果文件I/O的操作再次失败,OSG将返回失败信息。
总的来说,用户不必了解OSG内部如何实现文件I/O操作,就可以使用插件顺利工作。反之,如果文件I/O操作失败,用户也可以根据给出的错误信息跟踪插件源代码中的相关内容。其在程序中代码的实现顺序如下图所示:

主要的实现的代码是在ReaderWriter::ReadResult Registry::read(const ReadFunctor& readFunctor)函数中
ReaderWriter::ReadResult Registry::read(const ReadFunctor& readFunctor)
{
// first attempt to load the file from existing ReaderWriter's
//看是否有可用的ReaderWriter,对当前的数据进行解析,如果解析成功,就返回结果
AvailableReaderWriterIterator itr(_rwList, _pluginMutex);
for(;itr.valid();++itr)
{
ReaderWriter::ReadResult rr = readFunctor.doRead(*itr);
if (readFunctor.isValid(rr)) return rr;
else results.push_back(rr);
} // now look for a plug-in to load the file.
//根据文件名称创建新的动态库名称,然后加载动态库,增加_rwList对象个数
std::string libraryName = createLibraryNameForFile(readFunctor._filename);
if (loadLibrary(libraryName)!=NOT_LOADED)
{
//重新遍历一下,使用新的ReaderWriter进行数据的解析
for(;itr.valid();++itr)
{
ReaderWriter::ReadResult rr = readFunctor.doRead(*itr);
if (readFunctor.isValid(rr)) return rr;
else results.push_back(rr);
}
}
}
自定义文件插件:
自定义文件插件主要是自定义一个插件读写类,继承osgDB::ReaderWriter类,然后根据需求重写如readNode等函数方法即可
在建立插件读写类时需要注意:
- 需要建立一个dll项目工程,输出的dll必须为osgdb_扩展名.dll或osgdb_扩展名d.dll的形式
- 为了实现插件注册,需要定义全局变量,方法如下REGISTER_OSGPLUGIN(VR, ReaderWriterVR),在该全局变量的初始化过程中,会使用Registery::addReaderWriter函数自动注册插件所对应的扩展名。
- 在应用程序使用中,需要注册插件,方法如下 osgDB::Registry::instance->addFileExtensionAlias("VR", "VR")
[原][资料整理][osg]osgDB文件读取插件,工作机制,支持格式,自定义插件的更多相关文章
- Cordova与现有框架的结合,Cordova插件使用教程,Cordova自定义插件,框架集成Cordova,将Cordova集成到现有框架中
一.框架集成cordova 将cordova集成到现有框架中 一般cordova工程是通过CMD命令来创建一个工程并添加Android.ios等平台,这样的创建方式可以完整的下载开发过程中所需要的的插 ...
- 浅析一个lua文件窥slua工作机制
slua的东西不是几句话能讲得完,这里只说结论不说原因,原因有空写个Little Slua工程来解释,下面注释中有几个关键点:LuaVar系列类:LuaFunction,LuaTable,LuaDel ...
- wordpress必装的插件 wp最常用的十个插件
wordpress是世界上著名的博客系统,简称wp.一般新安装完wordpress以后,往往需要首先安装一些插件,这样才可以使用wordpress的更多功能.wp最常用的十个插件有哪些呢,可能根据每个 ...
- Android插件化(三)载入插件apk中的Resource资源
Android载入插件apk中的Resource资源 简单介绍 怎样载入未安装apk中的资源文件呢?我们从android.content.res.AssetManager.java的源代码中发现,它有 ...
- [osg]osgDB的加载机制,使用3DS插件做参考(转,整理现有osgDB资料)
参考:http://blog.sina.com.cn/s/blog_7cdaf8b60102uzu3.html http://blog.csdn.net/wang15061955806/article ...
- jt格式文件读取,osg显示插件更新
osgdb_jt 最近还是更新了一下 osgdb_jt 插件.解码jt格式核心库jt_toolkit,通过静态链接到Plugin jt产生osgdb_jt插件,使得osg可以可视化jt格式文件. 用法 ...
- [原][osgearth]osgearthviewer读取earth文件,代码解析(earth文件读取的一帧)
跑osgearthviewer程序 使用一个earth文件做参数传入 跟进代码. 首先osgearthviewer程序加载earth的方式分为两种: 1.根据earth文件(load方式) 2.使用S ...
- osg osgDB::Options noTexturesInIVEFile ForceReadingImage dds_flip
osgDB::writeNodeFile(node, path, new osgDB::Options("noTexturesInIVEFile")); noTexturesInI ...
- Java资料整理
Java资料整理 原创 2017年08月25日 17:20:44 14211 1.LocalThread的应用场景,数据传输适合用LocalThread么 2.linux的基本命令 软链接.更 ...
随机推荐
- mysql5.7切换导致gtid不一致
今天在公司的工程环境中做了个案例,手动切换关闭主库的mysql服务,从库上升为主库之后,发现主库处于read_only状态,通过高可用的组件观察了剩余主从库的alive以及delay的状态发现均正常. ...
- linux系统编程之信号(一)
今天起,开始新的知识的学习,对于上个系列进程的学习还差一个理论上的总结,这个会下次补回来,以便通过实践之后,再用理论将其巩固一下,好了,话不多说,开始进入这个主题的学习----信号,很重要,但不是太容 ...
- 51nod 2486 小b和矩阵
小b有一个m行n列的矩阵. 她会从(1,1)开始,顺时针螺旋访问该矩阵,每个元素恰好被访问一次. 请你按小b的访问顺序输出每个元素. 收起 输入 第一行输入两个数m和n,其中0<m,n≤50 ...
- DevExpress20:XtraCharts控件实现图表
一.总体概述 官方文档: https://docs.devexpress.com/WindowsForms/8117/controls-and-libraries/chart-control Char ...
- Codeforces Round #604 (Div. 2) C. Beautiful Regional Contest
链接: https://codeforces.com/contest/1265/problem/C 题意: So the Beautiful Regional Contest (BeRC) has c ...
- [Flutter] Router Navigation
Basic navigation by using 'Navigator.push' & 'Navigator.pop()', for example, we have two screen, ...
- neo4j 启动与关闭
neo4j开启与关闭 进入neo4j目录bin下. cd到bin目录下,执行启动命令: ./neo4j stop 另外neo4j还有其他命令,执行方式相同: neo4j { console | sta ...
- 孤独 & 失望
哪有人喜欢孤独,不过是害怕失望.
- C语言 选择排序算法原理和实现 从数组中 找出最小的元素然后交换位置
#include <stdio.h> int main(void) { /* 选择排序算法 原理:从数组中 找出最小的元素然后交换位置: */ int a[10] = {9,5,10,7, ...
- GoCN每日新闻(2019-09-29)
1. 干货满满的Go Modules和goproxy.cn https://juejin.im/post/5d8ee2db6fb9a04e0b0d9c8b 2. gnet: 一个轻量级且高性能的 Go ...