查看: 1837|回复: 3

分享:简易实用实现截屏

[复制链接]

该用户从未签到

发表于 2012-8-16 10:08:32 | 显示全部楼层 |阅读模式
本帖最后由 gis_wudi 于 2012-8-16 10:11 编辑

在做一个功能的时候,意外的发现,直接将一个image对象,关联到主相机,即可在任意的时候,实现截屏的功能,
而不用像网上有关贴子中描述,在相机的回调中去完成截屏的动作
分享一下
g_Image = new osg::Image;
viewer->getCamera()->attach(osg::Camera::COLOR_BUFFER, g_Image.get());
简洁方便,暂时还没有发现其他问题

该用户从未签到

发表于 2012-8-16 10:19:12 | 显示全部楼层
确实啊!书上的截屏例子感觉复杂很多啊

该用户从未签到

发表于 2012-8-16 10:30:59 | 显示全部楼层
  1. #include "stdafx.h"
  2. #include <osgViewer/Viewer>
  3. #include <osg/Node>
  4. #include <osgDB/ReadFile>
  5. #include <osgDB/WriteFile>

  6. #include <osgGA/GUIEventAdapter>

  7. osg::ref_ptr<osg::Image> image_c=new osg::Image;

  8. //抓图事件处理器
  9. class ImageHandler:public osgGA::GUIEventHandler
  10. {
  11. public:
  12.         ImageHandler(){}
  13.         ~ImageHandler(){}

  14.         //重载handle()函数
  15.         bool ImageHandler::handle(const osgGA::GUIEventAdapter&ea, osgGA::GUIActionAdapter& aa)
  16.         {
  17.                 osg::ref_ptr<osgViewer::Viewer> viewer = dynamic_cast<osgViewer::Viewer*>(&aa);

  18.                 if (viewer==NULL)
  19.                 {
  20.                         return false;
  21.                 }

  22.                 //定义一个静态变量
  23.                 static int _screenCaptureSequence=0;

  24.                 switch(ea.getEventType())
  25.                 {
  26.                 case osgGA::GUIEventAdapter::KEYDOWN:
  27.                         {
  28.                                 if (ea.getKey()=='c'||ea.getKey()=='C')
  29.                                 {
  30.                                         char filename[128];
  31.                                         //确定一个合理的文件名,以保证能够连续抓图
  32.                                         sprintf(filename,"ScreenShot%04d.bmp",_screenCaptureSequence);
  33.                                         _screenCaptureSequence++;

  34.                                         //写入文件
  35.                                         osgDB::writeImageFile(*(image_c.get()),filename);
  36.                                 }
  37.                         }
  38.                         break;
  39.                 default:
  40.                         return false;
  41.                 }
  42.                 return true;
  43.         }
  44. };

  45. int _tmain(int argc, _TCHAR* argv[])
  46. {
  47.         osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;
  48.         osg::ref_ptr<osg::Group> root = new osg::Group;

  49.         osg::ref_ptr<osg::Node> node = osgDB::readNodeFile("cow.osg");

  50.         root->addChild(node.get());

  51.     viewer->getCamera()->attach(osg::Camera::COLOR_BUFFER, image_c.get());
  52.         viewer->setSceneData(root.get());
  53.         //添加抓图事件
  54.         viewer->addEventHandler(new ImageHandler());

  55.         viewer->run();
  56.         return 0;
  57. }
复制代码
经实验确实可以这样做!省了个绘制回调

该用户从未签到

发表于 2012-8-21 09:45:36 | 显示全部楼层
使用RenderTarget来实现截屏可以直接参考osgposter例子,它实现了截屏输出超大海报图
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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