|
发表于 2008-8-21 17:25:16
|
显示全部楼层
这个就很容易实现了,,,你使用CompositeViewer就可以了~~~~分别对两个osgViewer::Viewer进行设置~~~~
刚改了下,,代码如下:- /* OpenSceneGraph example, osgwindows.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
- #include <osgDB/ReadFile>
- #include <osgUtil/Optimizer>
- #include <osgViewer/Viewer>
- #include <osgViewer/CompositeViewer>
- #include <iostream>
- int main( int argc, char **argv )
- {
- // use an ArgumentParser object to manage the program arguments.
- osg::ArgumentParser arguments(&argc,argv);
- // read the scene from the list of file specified commandline args.
- osg::ref_ptr<osg::Node> loadedModel = osgDB::readNodeFiles(arguments);
- // if not loaded assume no arguments passed in, try use default mode instead.
- if (!loadedModel) loadedModel = osgDB::readNodeFile("cow.osg");
-
- // if no model has been successfully loaded report failure.
- if (!loadedModel)
- {
- std::cout << arguments.getApplicationName() <<": No data loaded" << std::endl;
- return 1;
- }
- // construct the viewer.
- //osgViewer::Viewer viewer;
- osg::ref_ptr<osgViewer::CompositeViewer> viewer = new osgViewer::CompositeViewer();
- osg::ref_ptr<osgViewer::Viewer> viewer1= new osgViewer::Viewer() ;
- osg::ref_ptr<osgViewer::Viewer> viewer2= new osgViewer::Viewer() ;
- int xoffset = 40;
- int yoffset = 40;
- // left window + left slave camera
- {
- osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;
- traits->x = xoffset + 0;
- traits->y = yoffset + 0;
- traits->width = 600;
- traits->height = 480;
- traits->windowDecoration = true;
- traits->doubleBuffer = true;
- traits->sharedContext = 0;
- osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get());
- osg::ref_ptr<osg::Camera> camera = new osg::Camera;
- camera->setGraphicsContext(gc.get());
- camera->setViewport(new osg::Viewport(0,0, traits->width, traits->height));
- GLenum buffer = traits->doubleBuffer ? GL_BACK : GL_FRONT;
- camera->setDrawBuffer(buffer);
- camera->setReadBuffer(buffer);
- // add this slave camera to the viewer, with a shift left of the projection matrix
- viewer1->addSlave(camera.get(), osg::Matrixd::translate(0.0,0.0,0.0), osg::Matrixd());
- viewer1->setSceneData(osgDB::readNodeFile("cow.osg")) ;
- }
-
- // right window + right slave camera
- {
- osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;
- traits->x = xoffset + 600;
- traits->y = yoffset + 0;
- traits->width = 600;
- traits->height = 480;
- traits->windowDecoration = true;
- traits->doubleBuffer = true;
- traits->sharedContext = 0;
- osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get());
- osg::ref_ptr<osg::Camera> camera = new osg::Camera;
- camera->setGraphicsContext(gc.get());
- camera->setViewport(new osg::Viewport(0,0, traits->width, traits->height));
- GLenum buffer = traits->doubleBuffer ? GL_BACK : GL_FRONT;
- camera->setDrawBuffer(buffer);
- camera->setReadBuffer(buffer);
- // add this slave camera to the viewer, with a shift right of the projection matrix
- viewer2->addSlave(camera.get(), osg::Matrixd::translate(0.0,0.0,0.0), osg::Matrixd());
- viewer2->setSceneData(osgDB::readNodeFile("cow.osg")) ;
- }
- viewer->addView(viewer1.get()) ;
- viewer->addView(viewer2.get()) ;
- // optimize the scene graph, remove rendundent nodes and state etc.
- osgUtil::Optimizer optimizer;
- optimizer.optimize(loadedModel.get());
- // set the scene to render
- // viewer.setSceneData(loadedModel.get());
- return viewer->run();
- }
复制代码 |
|