关于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/