查看: 926|回复: 4

场景导出为.IVE时,纹理丢失

[复制链接]

该用户从未签到

发表于 2015-4-4 15:10:04 | 显示全部楼层 |阅读模式
1、像如下直接导出的话,是没问题的
int main()
{
        osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;
        viewer->setCameraManipulator(new osgGA::TrackballManipulator);

        osg::ref_ptr<osg::Group>root = new osg::Group;
        osg::ref_ptr<osg::Node>node = new osg::Node;
        node = osgDB::readNodeFile("jiangnanan.ive");
       
        root->addChild(node);
        viewer->setSceneData(root);

        osgDB::writeNodeFile(*(node.get()), “jiangnananWithTrees.ive”);

        viewer->realize();
        return viewer->run();
}
2、但是我把导出函数写到事件类中,然后添加事件导出时,纹理就会丢失。
int main()
{
        osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;

        osg::ref_ptr<osg::Group>root = new osg::Group;
        osg::ref_ptr<osg::Node>node = new osg::Node;
        node = osgDB::readNodeFile("jiangnanan.ive");
       
        root1->addChild(node);
        viewer->setSceneData(root1);

        viewer->addEventHandler(new SaveCurrentScene("jiangnananWithTrees.ive",node));
       
        //光照效果
        viewer->realize();
        return viewer->run();
}
类定义如下:按空格键是将节点导出
class SaveCurrentScene :public osgGA::GUIEventHandler
{
public:
        SaveCurrentScene(std::string filename,osg::ref_ptr<osg::Node>node) :
                _filename(filename),
                _node(node)
        {

        }
        virtual bool handle(const osgGA::GUIEventAdapter& ea,
                osgGA::GUIActionAdapter& aa)
        {
                osgViewer::Viewer* viewer = dynamic_cast<osgViewer::Viewer*>(&aa);
                if (!viewer)
                        return false;
                switch (ea.getEventType())
                {
                case osgGA::GUIEventAdapter::KEYDOWN:
                        if (ea.getKey()==osgGA::GUIEventAdapter::KEY_Space)
                        {
                                bool isWriteSuccess;
                                isWriteSuccess = osgDB::writeNodeFile(*(_node.get()), _filename);
                                if (isWriteSuccess)
                                        std::cout << "current scene writes to file successfully!" << std::endl;
                                else
                                        std::cout << "current scene writes to file unsuccessfully!" << std::endl;
                                return true;
                        }
                        break;
                default:
                        break;
                }
                return false;
        }
private:
        std::string _filename;
        osg::ref_ptr<osg::Node>_node;
};

该用户从未签到

 楼主| 发表于 2015-4-4 15:12:40 | 显示全部楼层
前辈们,帮帮我啊,这几天一直找不到解决方案!
array说:OSG内部的优化机制导致image对象在运行时载入显存后被自动释放以节省CPU空间,可以设置image对象为static以避免这一情况”。但是怎么去设置图片呢?

该用户从未签到

发表于 2015-4-5 11:40:53 | 显示全部楼层
直接遍历设置texture->setUnRefImageDataAfterApply(false);

该用户从未签到

 楼主| 发表于 2015-4-5 15:11:25 | 显示全部楼层
FlySky 发表于 2015-4-5 11:40
直接遍历设置texture->setUnRefImageDataAfterApply(false);

是不是需要定义节点访问器?我不是很理解

该用户从未签到

发表于 2015-4-6 00:37:03 | 显示全部楼层
你设置image为static也是需要遍历的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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