查看: 2393|回复: 6

[求助]导出纹理为jpg失败,使用错误还是BUG?

[复制链接]

该用户从未签到

发表于 2013-8-7 14:53:16 | 显示全部楼层 |阅读模式
本帖最后由 servicebbs 于 2013-8-7 14:53 编辑

问题是这样的,我有一个ive格式的模型文件,叫a.ive,文件里含有jpeg格式未压缩纹理信息。文件中的设置:
DataVariance STATIC
unRefImageDataAfterApply TRUE
现在我想把a.ive中的纹理导出为jpg文件,所以我写了下面的代码:
  1. osg::ref_ptr<osgDB::ReaderWriter::Options> options = new osgDB::ReaderWriter::Options;
  2. options->setOptionString("OutputTextureFiles");
  3. osgDB::Registry::instance()->setOptions(options);

  4. osg::ref_ptr<osg::Node> model = osgDB::readNodeFile("C:\\a.ive");
  5. osgDB::writeNodeFile(*model.get(), "C:\\b.OSG");

  6. mRoot->addChild(model);
复制代码
运行后模型显示正确,b.OSG能够导出,并且其中包含纹理文件(*.jpg)引用信息,但是C:\\images目录中没有纹理文件(*.jpg),查看输出信息,发现错误信息如下(多条):
123.png

然后我跟踪代码,发现osgDB_jpeg.dll插件加载没有问题,失败是因为相对路径的疸,在插件的ReaderWriterJPEG.cpp文件的函数:
  1. virtual WriteResult writeImage(const osg::Image &img,const std::string& fileName, const osgDB::ReaderWriter::Options *options) const
  2. {
  3.    std::string ext = osgDB::getFileExtension(fileName);
  4.    if (!acceptsExtension(ext)) return WriteResult::FILE_NOT_HANDLED;

  5.    osgDB::ofstream fout(fileName.c_str(), std::ios::out | std::ios::binary);
  6.    if(!fout) return WriteResult::ERROR_IN_WRITING_FILE;

  7.    return writeImage(img,fout,options);
  8. }
复制代码
其中fileName变量保存的是相对路径,如”images\xiaofangche08.jpg”,导致osgDB:fstream初始化失败。如果这里把fileName变量内容改为”C:\ges\xiaofangche08.jpg”并在C盘添加ges目录,则能够成功正确输出xiaofangche08.jpg文件,由此可判断就是因为相对目录引起的纹理输出失败。
同时,这个文件中的readImage函数中,就有把相对目录转为绝对路径的操作:
std::string fileName = osgDB::findDataFile( file, options );
而writeImage却没有,而且因为部署的原因,也不太可能直接把ive或osg文件中纹理引用变成绝对路径,

所以,请问一下,是我使用上的问题还是这里代码有些错误,谢谢。


该用户从未签到

 楼主| 发表于 2013-8-8 14:38:48 | 显示全部楼层
各位啊,大家没人碰到这个问题吗?,我试了多个版本,包括3.2.0-rc1

该用户从未签到

发表于 2013-8-10 17:36:52 | 显示全部楼层
FlySky的书中不是有导出纹理图片的现成例子吗,我这两天正在研究呢,不过只适用于一部分IVE文件,具体原因还不知道。

该用户从未签到

发表于 2013-8-12 10:25:13 | 显示全部楼层
您自己已经解释了自己的问题,writeImageFile认为相对路径就是相对当前的工作目录,因此工作目录下没有images子目录时就会返回失败

该用户从未签到

 楼主| 发表于 2013-8-12 11:42:24 | 显示全部楼层
307351614 发表于 2013-8-10 17:36
FlySky的书中不是有导出纹理图片的现成例子吗,我这两天正在研究呢,不过只适用于一部分IVE文件,具体原因还 ...

是这本书吗“Open Scene Graph 3.0三维视景仿真技术开发详解”

该用户从未签到

 楼主| 发表于 2013-8-12 11:43:30 | 显示全部楼层
array 发表于 2013-8-12 10:25
您自己已经解释了自己的问题,writeImageFile认为相对路径就是相对当前的工作目录,因此工作目录下没有imag ...

确实是这样,我弄错了工作路径

该用户从未签到

 楼主| 发表于 2013-8-12 11:43:51 | 显示全部楼层
解决了,结贴,感谢各位
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表