查看: 2115|回复: 5

求教:OSG如何实现连续截图

[复制链接]

该用户从未签到

发表于 2013-1-29 20:24:45 | 显示全部楼层 |阅读模式
看了《OpenSceneGraph三维渲染引擎编程指南》中关于抓图的示例
想改一下 做成 每隔几秒 自动截图的功能
不知道在OSG中该如何实现

是用回调吗?

请大家指教!!!

该用户从未签到

发表于 2013-1-30 08:09:23 | 显示全部楼层
在frameEvent中进行判断 时间 满足就截图

该用户从未签到

 楼主| 发表于 2013-1-31 10:11:21 | 显示全部楼层
liuzhiyu123 发表于 2013-1-30 08:09
在frameEvent中进行判断 时间 满足就截图

新手学习 还是不太明白
主要是想做OSG输出avi视频的功能
看以前的帖子 好像就是用连续截图再转换成视频的
老师能否对Frame事件讲的具体点
谢谢

该用户从未签到

发表于 2013-1-31 13:02:09 | 显示全部楼层
直接在Camera的PostDrawCallback里面做就可以了,每帧都截图或者按照2楼所说根据时间来截图都是可以的

该用户从未签到

 楼主| 发表于 2013-1-31 23:14:50 | 显示全部楼层
array 发表于 2013-1-31 13:02
直接在Camera的PostDrawCallback里面做就可以了,每帧都截图或者按照2楼所说根据时间来截图都是可以的

谢谢
我还是参考《OpenSceneGraph三维渲染引擎编程指南》中 抓图的示例 改的
但总是在按下t,停止截图,执行完 handle中的return true后 总会在
GraphicsThreader.cpp中   _operationQueue->releaseAllOperations(); 处中断
求教这是什么问题,怎么解决
谢谢
a.jpg
struct CaptureDrawCallback : public osg::Camera:rawCallback
{
        osg::ref_ptr<osg::Image> _image;

        CaptureDrawCallback(osg::ref_ptr<osg::Image>image)
        {
                _image=image;
        }

        ~CaptureDrawCallback()
        {

        }


        virtual void operator()(const osg::Camera & camera)const
        {
                if(start)
                {
                                       //截图、写入avi
                                 }
        }


};


//抓图事件处理器
class ImageHandler: public osgGA::GUIEventHandler
{
public:
        bool handle(const osgGA::GUIEventAdapter & ea,osgGA::GUIActionAdapter& aa)
        {
                                //''''''略
                switch(ea.getEventType())
                {
                        case osgGA::GUIEventAdapter::KEYDOWN:
                                {
                                        if(ea.getKey()=='s'||ea.getKey()=='S')
                                        {
                                               
                                                start=true;

                                        }

                                        if(ea.getKey()=='t'||ea.getKey()=='T')
                                        {
                                                start=false;
                                                if (pComStream)
                                                {
                                                        AVIStreamClose(pComStream);
                                                }
                                                if (ps)
                                                {
                                                        AVIStreamClose(ps);
                                                }

                                                if(pfile != NULL)
                                                        AVIFileRelease(pfile);

                                                AVIFileExit();

                                        }       

                                }
                                break;
                       
                        default:
                                return false;
                }

                return true;
        }

};

int _tmain(int argc, _TCHAR* argv[])
{
        //'''''省去
        viewer->getCamera()->setPostDrawCallback(new CaptureDrawCallback(image_c.get()));
       
        viewer->setSceneData(root.get());

        viewer->addEventHandler(new ImageHandler());

        viewer->realize();

        viewer->run();
        return 0;
}

该用户从未签到

发表于 2013-2-4 09:29:57 | 显示全部楼层
您的程序和Operation并无关系,为什么会停在这里?您调试的方法有问题吧?或者您用的AVIGenerator库是不是非Debug版本的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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