查看: 1838|回复: 6

请教一下多个camera时隐藏某个camera的疑惑

[复制链接]

该用户从未签到

发表于 2011-5-10 12:58:43 | 显示全部楼层 |阅读模式
请教板里各位大侠一个问题,具体描述如下:
    (1)我想对同一颗场景树设置多个相机,以实现从不同的角度来观察同一个场景的目的,采用的方法是一个视景器viewer下面addslave多个照相机的方法,几个关键的代码如下(在osgviewerMFC那个例子的InitCamera函数中进行改动的):

  1. // 创建图形上下文
  2. osg::GraphicsContext* gc = osg::GraphicsContext::createGraphicsContext(traits.get());
  3. osg::ref_ptr<osg::Camera> cameraMaster = new osg::Camera;
  4. // 绑
  5. cameraMaster->setGraphicsContext(gc);
  6. //相机视口设置
  7. cameraMaster->setViewport(new osg::Viewport(traits->x, traits->y, traits->width, traits->height));
  8. // 添加主相机到VIEWER
  9. mViewer->addSlave(cameraMaster.get());

  10. //添加第一个辅助摄像机,用于显示主摄像机的一个缩略图的效果

  11. osg::ref_ptr<osg::Camera> cameraSlave1 = new osg::Camera;
  12. cameraSlave1->setGraphicsContext(gc);
  13. cameraSlave1->setViewport(new osg::Viewport(0,0,width/5,height/5));//这个小窗口是原来长和宽的1/5
  14. GLenum buffer= traits->doubleBuffer?GL_BACK:GL_FRONT;
  15. cameraSlave1->setDrawBuffer(buffer);
  16. cameraSlave1->setReadBuffer(buffer);
  17. mViewer->addSlave(cameraSlave1.get(),osg::Matrixd(),osg::Matrix::scale(0.2,0.2,0.2));//将整个场景缩小5倍

复制代码

    进行如上代码后,确实在MFC的视图区域的左下角出现了一个辅助照相机,展示整体的缩略图
    (2)我想在想做到这样一个功能,就是用户可以根据自己的需要来决定是否需要这个辅助照相机。我的做法是:设置这个camera的nodeMask为0让其隐藏,设置1让其显示。因此,我在MFC的菜单栏中做了一个切换的按钮,该按钮的响应代码如下:

  1. //mOSG是一个全局变量,他下面的mViewer是视景器,由于该视景器下面挂了2个camera[一个是cameraMaster,一个是cameraSlave1]
  2. //我要控制的仅仅是cameraSlave1,他是mViewer的第二个儿子,所以有如下代码
  3. int currentStatus = mOSG->mViewer->getSlave(1)._camera->getNodeMask();
  4. if(1==currentStatus)//如果正在显示
  5. {
  6.      mOSG->mViewer->getSlave(1)._camera->setNodeMask(0);
  7. }
  8. else
  9. {
  10.   mOSG->mViewer->getSlave(1)._camera->setNodeMask(1);
  11. }
复制代码


      问题:
      (1)我在单击菜单栏按钮时,一旦隐藏了这个附属照相机,那么整个场景就“卡”住了,看上去就像是不渲染了一样,但是我去看当前程序运行情况,那个单独开启的线程Render并没有退出,所以我在想,是不是我把附属相机给隐藏掉会对主相机产生影响呢?会不会让他也不工作了呢?还是说我上面的那部分隐藏代码有问题呢?
       (2)如果我的想法不对,那怎样可以实现这样的效果呢?

    谢谢各位大侠了~~~

该用户从未签到

 楼主| 发表于 2011-5-10 13:00:08 | 显示全部楼层
自己顶一下~~~

该用户从未签到

发表于 2011-5-10 13:53:51 | 显示全部楼层
getViewer()->getSlave(1)._camera->setViewport(0,0,0,0);

该用户从未签到

发表于 2011-5-10 16:42:57 | 显示全部楼层
Slave相机不能使用nodeMask,楼上的方法可以考虑

该用户从未签到

 楼主| 发表于 2011-5-10 17:37:38 | 显示全部楼层
回复 3# hbf85435055


    谢谢您的提示,这个方法试过了,很好地实现了我的要求

该用户从未签到

 楼主| 发表于 2011-5-10 17:38:04 | 显示全部楼层
回复 4# array


    恩恩,刚试过了,行得通~~

该用户从未签到

发表于 2015-3-14 14:52:02 | 显示全部楼层
问下mOSG 这个是什么类呀,初学者
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表