查看: 1637|回复: 12

屏幕截图程序

[复制链接]

该用户从未签到

发表于 2010-10-18 14:42:50 | 显示全部楼层 |阅读模式
按照http://bbs.vrchina.net/redirect.php?tid=3396&goto=lastpost这里编写的,但是不知道为什么根本没有文件生成,哪边出问题了?那位帮忙看看呀。
#include <osgViewer/Viewer>
#include <osg/Camera>
#include <osg/Image>
#include <osgDB/ReadFile>
#include <osgDB/WriteFile>

class PostDrawCallback:public osg::Camera:rawCallback
{
   public:
       PostDrawCallback():
       virtual void operator()(const osg::Camera &camera)
       {
           osg::ref_ptr<osg::Image>image = new osg::Image;
           unsigned int w=1600,h=900;  
           image->allocateImage( w, h, 1, GL_RGB, GL_UNSIGNED_BYTE);
           image->readPixels( 0, 0, w, h, GL_RGB, GL_UNSIGNED_BYTE);
           osgDB::writeImageFile( *(image.get()), "cc.bmp" );
       }
};
class ImageHandler:public osgGA::GUIEventHandler
{
public:
ImageHandler(){};
~ImageHandler(){};
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() == 'c')
{
viewer->getCamera()->setPostDrawCallback(new PostDrawCallback);
}
}
default:
return false;
}
}
};

int main( int, char ** )
{
osgViewer::Viewer viewer;
viewer.setSceneData( osgDB::readNodeFile( "cow.osg" ) );
if (!viewer.getSceneData())
{
osg::notify( osg::FATAL ) << "Unable to load data file. Exiting." << std::endl;
return 1;
}
viewer.addEventHandler( new ImageHandler );
return viewer.run();
}

该用户从未签到

发表于 2010-10-18 16:38:54 | 显示全部楼层
没问题啊,好着呢啊~~没有这个"cc.bmp" 文件么

该用户从未签到

 楼主| 发表于 2010-10-18 16:46:40 | 显示全部楼层
2# tianxiao888
不能截图呀。就是没有截图文件"cc.bmp",不知道什么原因,您能指点下么。

该用户从未签到

发表于 2010-10-18 17:17:55 | 显示全部楼层
virtual void operator()(const osg::Camera &camera) const

该用户从未签到

 楼主| 发表于 2010-10-19 08:53:41 | 显示全部楼层
4# aya_daxiang
谢谢啊!这样就能生成图片了,但是能解释一下原理吗?不懂为什么会这样。

该用户从未签到

发表于 2010-10-19 09:27:43 | 显示全部楼层
呵呵,这个在osg/camera里就是这样定义的,具体原因我不是很清楚。

该用户从未签到

发表于 2010-10-19 12:45:07 | 显示全部楼层
因为您的目的是override(重写)已有的operator()虚函数,让它在派生类里有不同的行为;而您忘记const的结果却导致编译器认为您又overload(重载)了一个新的operator(),和之前的那个没有关系了

该用户从未签到

发表于 2010-10-19 13:35:48 | 显示全部楼层
奥,不细心真忽略了

该用户从未签到

 楼主| 发表于 2010-10-20 11:52:16 | 显示全部楼层
7# array
谢谢您啊,明白了,哈哈

该用户从未签到

发表于 2010-11-24 17:09:18 | 显示全部楼层
按 C键 后  为什么  这个函数体内一直执行呢?一直在写出图片啊? 怎么让按下C键 执行一次呢?

virtual void operator()(const osg::Camera &camera)
       {
           osg::ref_ptr<osg::Image>image = new osg::Image;
           unsigned int w=1600,h=900;  
           image->allocateImage( w, h, 1, GL_RGB, GL_UNSIGNED_BYTE);
           image->readPixels( 0, 0, w, h, GL_RGB, GL_UNSIGNED_BYTE);
           osgDB::writeImageFile( *(image.get()), "cc.bmp" );
       }

该用户从未签到

发表于 2010-11-24 22:16:34 | 显示全部楼层
执行一次很简单啊,自己写一个函数执行一次,不用回调。

该用户从未签到

发表于 2010-11-25 08:29:17 | 显示全部楼层
virtual void operator()(const osg::Camera &camera) const
       {
           osg::ref_ptr<osg::Image>image = new osg::Image;
           unsigned int w=1600,h=900;  
           image->allocateImage( w, h, 1, GL_RGB, GL_UNSIGNED_BYTE);
           image->readPixels( 0, 0, w, h, GL_RGB, GL_UNSIGNED_BYTE);
           osgDB::writeImageFile( *(image.get()), "cc.bmp" );
           camera.setPostDrawCallback(0);//添加函数执行一次
       }

该用户从未签到

发表于 2010-11-25 09:02:12 | 显示全部楼层
camera.setPostDrawCallback(0);//添加函数执行一次

这样写 编译都过不了 - -
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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