opengl - How to change background at runtime on openscenegraph -
i try add 3d object on viewer , change background dynamically. capture webcam using opencv videocapture.
i did below steps :
- open video capture , frame
- create openscenegraph root
- add child root ( read
.osgfile 3d object) - create texture2d object background
- set image of background
- create camera view background
- add camera root
- set data of viewer (
viewer.setscenedat(root)) run
viewer.run()these steps add first frame background , add 3d object scene. can't change background each frame. how can it?
code :
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();
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 windows , 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(); } this code changes background dynamially.
Comments
Post a Comment