OSG读取模型插件的单独使用

OSG读取模型插件的单独使用

ID:38144016

大小:319.66 KB

页数:5页

时间:2019-05-27

OSG读取模型插件的单独使用_第1页
OSG读取模型插件的单独使用_第2页
OSG读取模型插件的单独使用_第3页
OSG读取模型插件的单独使用_第4页
OSG读取模型插件的单独使用_第5页
资源描述:

《OSG读取模型插件的单独使用》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、OSG中读取模型插件的单独使用模型插件单独使用的原因因为我的任务的需求,我需要把诸如3ds,flt等多种格式的模型添加到数据库里,这个时候我需要在把模型添加到数据库的时候,自动的把模型的纹理也拷贝或者移动到相对应的磁盘目录中去。这个时候就必须要获取模型的纹理文件列表,读取模型的内部信息。而OSG的插件机制只是返回Node节点,或者ReadWriter类,缺少更为精细的模型信息。所以我就借助OSG的3DS,FLT的模型插件源码,对这两个插件进行了扩展,获取源码中的纹理路径名,并导出具体的DLL类,重新得到Node节点,和原有的OSG

2、程序进行了融合。这里写下我的方法和走的一些弯路,希望能给有这方面的需求的朋友一点经验,。也希望能为OSG社区做一点小小的贡献。我的水平不高,对osg的理解和使用也很简单,请大家见谅!插件的单独使用方法:测试环境的搭建我先使用CMake配置了osg的源程序,然后打开工程,如图一图一OSG源程序把Plugins3ds目录下的文件都拷贝到了ExamplesHuds里面,这样做的原因有两个第一:因为我自己不知道模型文件里面的纹理列表在哪里,需要进行多次尝试和验证,而Plugins3ds生成的是dll,不方便测试。需要在一个exe程序进行测

3、试。生成的容器的测试环境不如Examples方便。第二:如果自己新建一个工程,在拷贝Plugins3ds文件的,因为Plugins3ds里工程里有依赖原始的OSG源码,新的工程里依赖的却是别人编译好的OSGdll,这样程序非常容易失败,我开始的时候就这么做的,可是总在创建纹理函数时抛异常。因为上面两点原因,所以我就把文件放到了ExamplesHuds,需要注意的是:别忘了修改“Example”链接的lib文件,因为有可能插件库里的链接的lib和ExampleHuds不一样,这样测试环境就配置好了。具体的插件的修改我在Example

4、sHuds里,添加了:ReaderWriter3DS.h头文件,用于后来的导出类使用。把ReaderWriter3DS作为导出类,就是像这样加上:#ifdefDLL_API#else#defineDLL_API_declspec(dllimport)#endif#pragmaonceclassDLL_APIReaderWriter3DS:publicosgDB::ReaderWriter这种修饰符。同时我修改了:virtualReadResultreadNode(conststd::string&file,constosgDB::

5、ReaderWriter::Options*options);const函数,因为const函数里不能对类成员作修改,而我想把Lib3dsFile*f;作为ReaderWriter3DS的成员变量,所以就把这个函数的声明给就改了。3DS的模型格式比较简单,我很快找到了模型文件的列表,在osgDB::ReaderWriter::ReadResultReaderWriter3DS::readNode(conststd::string&file,constosgDB::ReaderWriter::Options*options)函数里添

6、加了获取纹理列表的方法。这样获取模型的纹理列表。for(Lib3dsMaterial*mat=f->materials;mat;mat=mat->next){drawStateMap[mat->name]=reader.createStateSet(mat,options);stringfile=mat->texture1_map.name;myTexfileList.push_back(file);}这里我想补充说明的是:我发现Lib3dsMaterial里其实有很多纹理文件,如图二所示:图二:材质结构体的部分信息可是不知道为什

7、么,只有texture1_map真正使用了,所以我就只获取了这个纹理文件的名字,然后用专门的模型查看器(3DMAX之类)验证获取的外部纹理文件的名字是否正确。正确后就可以导出如下三个文件。图三:导出dll,lib截图导出的dll与OSG程序结合这里在网友“礼拜六”的指点下,我才知道原来可以这么用(见笑了!),具体的代码片段如下:ReaderWriter3DS*rw=newReaderWriter3DS();osgDB::ReaderWriter::ReadResultrr=rw->readNode("E:\Plane\z9.3

8、DS",NULL);osg::Node*node=rr.getNode();这样就可以获得Node节点了,以后的方法就是OSG的方法了,这样在Examplehud里面测试成功后,我就对Plugins3ds进行了真正的修改,导出类库,以后再OSG里,

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。