如何在openscenegraph上运行时更改背景

时间:2015-05-29 14:51:03

标签: opengl rendering openscenegraph

我尝试在查看器上添加一个3d对象并动态更改背景。我使用opencv VideoCapture捕获网络摄像头。

我做了以下步骤:

  1. 打开视频捕获并获取框架
  2. 创建openscenegraph root
  3. 将子项添加到root(从.osg文件3d对象中读取)
  4. 为背景
  5. 创建texture2d对象
  6. 设置背景图片
  7. 创建相机以查看背景
  8. 将相机添加到根
  9. 设置查看者的数据(viewer.setScenedat(root)
  10. 运行viewer.run()

    这些步骤将第一帧添加为背景,并将3d对象添加到场景中。但我无法改变每一帧的背景。我该怎么做?

  11. 代码:

    cv::VideoCapture cap(0);  
    cv::Mat frame;
    
    if(!cap.isOpened())  
    {
        std::cout << "Webcam cannot open!\n";
        return;
    }  
    
    osgViewer::Viewer viewer;
    osg::ref_ptr<osg::Group> root = new osg::Group();
    osg::ref_ptr<osg::Texture2D> bg = new osg::Texture2D();
    
    root->addChild(osgDB::readNodeFile("object.osg"));
    bg->setFilter(osg::Texture::FilterParameter::MIN_FILTER, osg::Texture::FilterMode::LINEAR);
    bg->setFilter(osg::Texture::FilterParameter::MAG_FILTER, osg::Texture::FilterMode::LINEAR);    
    bg->setDataVariance(osg::Object::DYNAMIC);
    
    cap >> frame;
    osg::ref_ptr<osg::Image> osgImage = new osg::Image;
    osgImage->setImage(frame.cols, frame.rows, 3,
        GL_RGB, GL_RGB, GL_UNSIGNED_BYTE,
        (uchar*)(frame.data),
        osg::Image::AllocationMode::NO_DELETE, 1);
    bg->setImage(osgImage);
    
    osg::ref_ptr<osg::Camera> bg_cam = new osg::Camera();
    bg_cam->setProjectionMatrixAsOrtho2D(-0.5, 0.5, -0.5, 0.5);
    bg_cam->setViewMatrixAsLookAt(
        osg::Vec3(0.5, 0.5, -1.0),
        osg::Vec3(0.5, 0.5, 0.0),
        osg::Vec3(0.0, -1.0, 0.0)
        );
    bg_cam->setRenderOrder(osg::Camera::PRE_RENDER);
    bg_cam->setReferenceFrame(osg::Camera::ABSOLUTE_RF);
    bg_cam->addChild(initializeBackground(bg));
    root->addChild(bg_cam);
    
    viewer.setSceneData(root);
    viewer.getCamera()->setProjectionMatrixAsPerspective(
        40., 1., 1., 100.);
    viewer.getCamera()->setClearMask(GL_DEPTH_BUFFER_BIT);
    viewer.getCamera()->setClearColor(osg::Vec4(1.0, 0.0, 0.0, 1.0));
    
    viewer.run();
    

1 个答案:

答案 0 :(得分:1)

viewer.getCamera()->setClearMask(GL_DEPTH_BUFFER_BIT);
viewer.getCamera()->setClearColor(osg::Vec4(1.0, 0.0, 0.0, 1.0));
 bg->setDataVariance(osg::Object::DYNAMIC);
viewer.realize();  // set up windows and associated threads. 

while(!viewer.done())
{
    cap >> frame;     

    osg::ref_ptr<osg::Image> osgImage = new osg::Image;
    osgImage->setImage(frame.cols, frame.rows, 3,
        GL_RGB, GL_BGR, GL_UNSIGNED_BYTE,
        (uchar*)(frame.data),
        osg::Image::AllocationMode::NO_DELETE, 1);
    bg->setImage(osgImage);

    viewer.frame();
}   

此代码动态更改背景。