关于OSG中主相机和从相机的浅显理解
2017-10-28 12:36
471 查看
关于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/
相关文章推荐
- 关于重定位代码的浅显理解
- 关于对Java中异常处理的try catch和throw的理解(浅显理解)
- 关于iOS应用通过OpenURL在设置打开相机权限,然后原应用会立即崩溃(重启)的理解
- 关于 js 的 prototype , call,apply ,闭包,回调 个人浅显理解
- 关于单例设计模式的浅显理解
- 关于map和set的浅显理解
- 关于单例设计模式的浅显理解
- 关于相机坐标到投影空间坐标转换的理解
- 关于闭包-我的浅显理解
- 关于OSG中matrixTransfrom类旋转问题理解
- 关于OSG中各种变换的理解
- 关于移动设备系统的浅显理解
- 关于沟通能力和团队精神的浅显理解
- #OSG+VS#第七周 关于osgearth中shadowing的理解
- 关于java JDK动态代理的浅显理解
- 关于SDWebImage内存缓存的一点简单理解-King
- 关于SocketAsyncEventArgs的一些理解
- 关于rand()和srand()的理解
- 关于adr指令的理解
- 关于ARM汇编程序的理解