关于OSG中主相机和从相机的浅显理解

来源:互联网 发布:windows重置出现问题 编辑:程序博客网 时间:2024/06/07 18:33

关于OSG中主相机和从相机的浅显理解

本文主要说明以下问题:

  • 如何设置主相机
  • 如何设置从相机(slaves)
  • 主相机和从相机的关系

前言

我们在配置好OSG编译环境后,一般都会通过运行以下代码来测试是否配置成功:

#include<osgViewer/Viewer>#include<osgDB/ReadFile>int main( int argc, char **argv ){    osgViewer::Viewer viewer;    viewer.setSceneData( osgDB::readNodeFile( "cow.osg" ) );    return viewer.run();}

但在这段代码中,表面上并没有对相机进行任何设置,因而关于相机的操作对于我们来说几乎是透明的。因此在以后学习有关相机的操作时,我被这段代码搞得稀里糊涂,今天就小小总结一下。


主相机

通过查看我们最熟悉的osgViewer::Viewer的成员,可以看到,他包含一个_camera和_slaves,这个_camera就代表了主相机。
这里写图片描述
而让人疑惑的是,在上面的代码中,我们并没有手动设置主相机。实际上,当我们没有设置主相机时,OSG会使用一个默认的Camera节点,之后的setSceneData也会将场景追加到这个相机节点下。


从相机

有的时候,我们需要为当前的程序添加多个相机,比如使用渲染到纹理时。这时候从相机就发挥作用了。一个osgViewer::Viewer只有一个主相机,但可以有多个从相机。我们可以使用如下方法来添加从相机:
这里写图片描述
默认情况下,从相机会使用和主相机相同的场景进行渲染,但我们也可以为从相机添加其自己的场景模型,有一点虽然看似习以为常,但却十分重要:在OSG中场景要想被渲染出来,它必须位于一个Camera节点之下
另外,有时候我们还可以自定义相机的图像上下文,就像下面这样,

osg::ref_ptr<osg::Node> loadedModel = osgDB::readNodeFile("cow.osg"); osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer; {  osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;  traits->x = 40;  traits->y = 40;  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  viewer->addSlave(camera.get()); }

主相机与从相机的关系

按照我个人的理解,当我们没有手动设置主相机,而同时又添加了从相机时,就会添加的场景模型就会通过从相机来渲染。因此,用主相机和用从相机进行场景的渲染,有时候并无差别。


参考资料

[osg示例解析之osgcamera(1)]http://blog.csdn.net/csxiaoshui/article/details/51517203
[OSG类参考]
http://trac.openscenegraph.org/documentation/OpenSceneGraphReferenceDocs/a01035.html
[osg窗口化实现 ]http://blog.163.com/liu7667715@126/blog/static/67132488201211611464444/

原创粉丝点击