• osg截取场景图片


    osg截取场景图片

    #include <osgViewer/Viewer>
    #include <osgViewer/ViewerBase>
    #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>
    #include <osg/RenderInfo>
    #include <OpenThreads/Mutex>
    #include <OpenThreads/Thread>
    #include <OpenThreads/ScopedLock>
    
    osg::ref_ptr<osg::Image> image_c = new osg::Image();
    
    struct CaptureCallback :public osg::Camera::DrawCallback
    {
        CaptureCallback()
        {
            
            std::cout << "=----0---=" << std::endl;
        }
    
        CaptureCallback(osg::ref_ptr<osg::Image> image)
        {
            image_ = image;
    
            std::cout << "=-------=" << std::endl;
        }
    
        ~CaptureCallback() {}
    
        virtual void operator()(const osg::Camera &camera) const
        {
            //得到窗口系统接口
            //osg::ref_ptr<osg::GraphicsContext::WindowingSystemInterface> wsi = osg::GraphicsContext::getWindowingSystemInterface();
            unsigned int width=800, height=500;
            //得到分辨率
            //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);
        }
    
    
        //virtual void operator()(osg::RenderInfo& renderInfo) const
        //{
        //    //读取像素信息抓图
        //    OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_mutex);
        //    auto& camera = *renderInfo.getCurrentCamera();
        //    auto traits = camera.getGraphicsContext()->getTraits();
        //    glReadBuffer(traits->doubleBuffer ? GL_BACK : GL_FRONT);
        //    _image->readPixels(pos[0], pos[1], size[0], size[1], _image->getPixelFormat(), _image->getDataType());
        //}
        //osg::Vec2i pos;
        //osg::Vec2i size;
        //osg::observer_ptr<osg::Image> _image;
        //mutable OpenThreads::Mutex  _mutex;
    
    private:
        osg::ref_ptr<osg::Image> image_;
    
    };
    
    //抓图事件处理器
    class ImageHandler :public osgGA::GUIEventHandler
    {
    public:
        ImageHandler()
        {
            _screenCaptureSequence = 0;
        }
        ~ImageHandler() 
        {
        
        }
    
        bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa)
        {
            osg::ref_ptr<osgViewer::Viewer> viewer = dynamic_cast<osgViewer::Viewer *>(&aa);
    
            //std::cout << "======1======" << std::endl;
            if (viewer == NULL)
            {
                return false;
            }
    
            std::cout << "======2======" << ea.getEventType() << std::endl;
            
            if (ea.getEventType()==16)
            {
                char filename[128];
                sprintf(filename, "ScreenShot%4d.bmp", _screenCaptureSequence);
                std::cout << filename << std::endl;
                _screenCaptureSequence++;
                osgDB::writeImageFile(*(image_c.get()), filename);
            }
    
            switch (ea.getEventType())
            {
                case osgGA::GUIEventAdapter::KEYDOWN:
            {
                
            }
            break;
            default:
    
                return false;//一定设为false不然不能旋转
            }
            return true;
        }
    
    private:
        //定义一个静态变量
        int _screenCaptureSequence;
    
    };
    
    int main()
    {
        osg::ref_ptr<osg::Node> node = osgDB::readNodeFile("L:\BIM\robot.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());
    
    
    
    
        //osg::Vec2i pos(400,250);
        //osg::Vec2i size(800,500);
        //osg::observer_ptr<osg::Image> _image = new osg::Image();
        ////mutable OpenThreads::Mutex  _mutex;
    
        //osg::ref_ptr<CaptureCallback> cb = new CaptureCallback();
        //cb->pos = pos;
        //cb->size = size;
        //cb->_image = _image;
        //viewer->getCamera()->setFinalDrawCallback(cb);
        //auto viewer2= dynamic_cast<osgViewer::ViewerBase*>(viewer->getCamera()->getView());
        //auto oldModel = viewer2->getThreadingModel();
        //viewer2->setThreadingModel(osgViewer::ViewerBase::SingleThreaded);
        //viewer2->renderingTraversals();
        //viewer2->setThreadingModel(oldModel);
        //viewer->getCamera()->setFinalDrawCallback(nullptr);
    
    
    
        viewer->getCamera()->setPostDrawCallback(new CaptureCallback(image_c.get()));
        viewer->addEventHandler(new ImageHandler());
    
    
        viewer->setSceneData(root.get());
        viewer->setThreadingModel(osgViewer::ViewerBase::SingleThreaded);
        
        viewer->setUpViewInWindow(200, 200, 800, 500, 0);
        
    
        viewer->realize();
        viewer->run();
        return 1;
    }

     

     

     

     

     

     

     

     

     

     

    ###########################

    QQ 3087438119
  • 相关阅读:
    CentOS升级Python 2.6到2.7
    ps命令使用 进程查看
    MySQL导入sql脚本 导出数据库
    html php 重定向 跳转 刷新
    Linux查看可执行程序所在路径
    解决phpMyAdmin“登录超时 (1440 秒未活动),请重新登录”的问题
    怎样选购冲锋衣
    常见排序算法及其java实现
    java开发环境搭建
    【转】与BT下载相关的概念
  • 原文地址:https://www.cnblogs.com/herd/p/15333959.html
Copyright © 2020-2023  润新知