osg截图示例

    xiaoxiao2021-03-25  96

    #include <osgViewer/Viewer> #include <osgViewer/GraphicsWindow> #include <osg/Node> #include <osg/Geode> #include <osg/Group> #include <osg/Camera> #include <osg/Image> #include <osg/BufferObject> #include <osgDB/ReadFile> #include <osgDB/WriteFile> #include <osgUtil/Optimizer> #include <iostream> #include <osgGA/GUIEventHandler> #include <osgGA/TrackballManipulator> osg::ref_ptr<osg::Image> image_c = new osg::Image() ; struct CaptureCallback:public osg::Camera::DrawCallback { CaptureCallback(osg::ref_ptr<osg::Image> image) { image_ = image ; } ~CaptureCallback(){} virtual void operator()(const osg::Camera &camera) const { //得到窗口系统接口 osg::ref_ptr<osg::GraphicsContext::WindowingSystemInterface> wsi = osg::GraphicsContext::getWindowingSystemInterface() ; unsigned int width , height ; //得到分辨率 wsi->getScreenResolution(osg::GraphicsContext::ScreenIdentifier(0) , width , height) ; //分配一个image image_->allocateImage(width , height , 1 , GL_RGB , GL_UNSIGNED_BYTE) ; //读取像素信息抓图 image_->readPixels(0 , 0 , width , height , GL_RGB , GL_UNSIGNED_BYTE) ; } private: osg::ref_ptr<osg::Image> image_ ; }; //抓图事件处理器 class ImageHandler:public osgGA::GUIEventHandler { public: ImageHandler() { } ~ImageHandler(){} bool handle(const osgGA::GUIEventAdapter& ea , osgGA::GUIActionAdapter& aa) { osg::ref_ptr<osgViewer::Viewer> viewer = dynamic_cast<osgViewer::Viewer *>(&aa) ; if (viewer == NULL) { return false ; } //定义一个静态变量 static int _screenCaptureSequence = 0 ; switch (ea.getEventType()) { case osgGA::GUIEventAdapter::KEYDOWN: { if (ea.getKey() == 'c' || ea.getKey() == 'C') { char filename[128] ; sprintf(filename , "ScreenShotM.bmp" , _screenCaptureSequence) ; _screenCaptureSequence++ ; osgDB::writeImageFile(*(image_c.get()) , filename) ; } } break; default: return false ;//一定设为false不然不能旋转 } return true ; } }; int main() { osg::ref_ptr<osg::Node> node = osgDB::readNodeFile("cow.osg") ; osg::ref_ptr<osg::Group> root = new osg::Group ; root->addChild(node.get()) ; osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer ; osgUtil::Optimizer optimizer ; optimizer.optimize(root.get()) ; viewer->getCamera()->setPostDrawCallback(new CaptureCallback(image_c.get())) ; viewer->setSceneData(root.get()) ; viewer->addEventHandler(new ImageHandler()) ; viewer->realize() ; viewer->run() ; return 1 ; }
    转载请注明原文地址: https://ju.6miu.com/read-7400.html

    最新回复(0)