- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
OSG 中读取模型插件的单独使用
模型插件单独使用的原因
因为我的任务的需求,我需要把诸如 3ds,flt 等多种格式的模型添加到数据
库里,这个时候我需要在把模型添加到数据库的时候,自动的把模型的纹理也拷
贝或者移动到相对应的磁盘目录中去。这个时候就必须要获取模型的纹理文件列
表,读取模型的内部信息。而 OSG 的插件机制只是返回 Node 节点,或者
ReadWriter 类,缺少更为精细的模型信息。所以我就借助 OSG 的 3DS,FLT 的模
型插件源码,对这两个插件进行了扩展,获取源码中的纹理路径名,并导出具体
的 DLL 类,重新得到 Node 节点,和原有的 OSG 程序进行了融合。这里写下我的
方法和走的一些弯路,希望能给有这方面的需求的朋友一点经验,。也希望能为
OSG 社区做一点小小的贡献。我的水平不高,对 osg 的理解和使用也很简单,请
大家见谅!
插件的单独使用方法:
测试环境的搭建
我先使用 CMake 配置了 osg 的源程序,然后打开工程,如图一
图一 OSG 源程序
把 Plugins 3ds 目录下的文件都拷贝到了 Examples Huds 里面,这样做的原因有
两个
第一:因为我自己不知道模型文件里面的纹理列表在哪里,需要进行多次尝
试和验证,而 Plugins 3ds 生成的是 dll,不方便测试。需要在一个 exe 程序进
行测试。生成的容器的测试环境不如 Examples 方便。
第二:如果自己新建一个工程,在拷贝 Plugins 3ds 文件的,因为 Plugins
3ds 里工程里有依赖原始的 OSG 源码,新的工程里依赖的却是别人编译好的 OSG
dll,这样程序非常容易失败,我开始的时候就这么做的,可是总在创建纹理函数
时抛异常。因为上面两点原因,所以我就把文件放到了 Examples Huds,需要注
意的是:别忘了修改“Example”链接的 lib 文件,因为有可能插件库里的链接
的 lib 和 Example Huds 不一样,这样测试环境就配置好了。
具体的插件的修改
我在 Examples Huds 里,添加了:ReaderWriter3DS.h 头文件,用于后来的
导出类使用。把 ReaderWriter3DS 作为导出类,就是像这样加上:
#ifdef DLL_API
#else
#define DLL_API _declspec(dllimport)
#endif
#pragma once
class DLL_API ReaderWriter3DS : public osgDB::ReaderWriter 这种修饰符。
同时我修改了:
virtual ReadResult readNode(const std::string file, const
osgDB::ReaderWriter::Options* options) ; const 函数,
因为 const函数里不能对类成员作修改,而我想把 Lib3dsFile *f; 作为
ReaderWriter3DS的成员变量,所以就把这个函数的声明给就改了。3DS的模型格
式比较简单,我很快找到了模型文件的列表,在
osgDB::ReaderWriter::ReadResult ReaderWriter3DS::readNode(const
std::string file, const osgDB::ReaderWriter::Options* options)
函数里添加了获取纹理列表的方法。这样获取模型的纹理列表。
for (Lib3dsMaterial *mat=f-materials; ma
文档评论(0)