zoukankan      html  css  js  c++  java
  • [原][资料整理][osg]osgDB文件读取插件,工作机制,支持格式,自定义插件

    参考:

    osgPlugins相关

    osg读取文件的原理(插件工作机制)

    当使用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

    http://www.inivis.com/

    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将按照如下步骤来查找合适的插件。

    1. OSG搜索已注册的插件列表,查找支持文件格式的插件。开始时已注册插件列表仅包含了Registry类构造函数中注册的插件。如果OSG找到了可以支持此文件格式的插件,并成功执行了I/O操作,那么它将返回相应的数据。
    2. 如果没有发现可以支持此格式的已注册插件,或者I/0操作失败,那么OSG将根据前面所述的文件命名规则创建插件文件的名称,并尝试读取相应的插件库。如果读取成功,OSG将添加此插件到已注册插件列表中。
    3. 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")
  • 相关阅读:
    最高级的自律是享受孤独
    【黑马】交换两个变量的值
    字符串换行
    互联网视频直播/点播流媒体服务器使用http和rtmp做点播时有什么区别?
    视频互联网直播/点播服务器中关于内容分发CDN的相关问题汇总
    网页直播系统推流端和拉流端都有哪些环节?
    线上课堂教育行业选择互动直播时有哪些直播方案?
    自建视频流媒体服务器需要满足哪些条件?
    互联网直播点播平台在进行iframe直播分享时如何禁止本地视频自动播放?
    视频直播/点播流媒体服务器是否可以对接RTSP视频流?
  • 原文地址:https://www.cnblogs.com/lyggqm/p/11003820.html
Copyright © 2011-2022 走看看