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

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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值