|
请教板里各位大侠一个问题,具体描述如下:
(1)我想对同一颗场景树设置多个相机,以实现从不同的角度来观察同一个场景的目的,采用的方法是一个视景器viewer下面addslave多个照相机的方法,几个关键的代码如下(在osgviewerMFC那个例子的InitCamera函数中进行改动的):
-
- // 创建图形上下文
- osg::GraphicsContext* gc = osg::GraphicsContext::createGraphicsContext(traits.get());
- osg::ref_ptr<osg::Camera> cameraMaster = new osg::Camera;
- // 绑
- cameraMaster->setGraphicsContext(gc);
- //相机视口设置
- cameraMaster->setViewport(new osg::Viewport(traits->x, traits->y, traits->width, traits->height));
- // 添加主相机到VIEWER
- mViewer->addSlave(cameraMaster.get());
-
- //添加第一个辅助摄像机,用于显示主摄像机的一个缩略图的效果
-
- osg::ref_ptr<osg::Camera> cameraSlave1 = new osg::Camera;
- cameraSlave1->setGraphicsContext(gc);
- cameraSlave1->setViewport(new osg::Viewport(0,0,width/5,height/5));//这个小窗口是原来长和宽的1/5
- GLenum buffer= traits->doubleBuffer?GL_BACK:GL_FRONT;
- cameraSlave1->setDrawBuffer(buffer);
- cameraSlave1->setReadBuffer(buffer);
- mViewer->addSlave(cameraSlave1.get(),osg::Matrixd(),osg::Matrix::scale(0.2,0.2,0.2));//将整个场景缩小5倍
-
复制代码
进行如上代码后,确实在MFC的视图区域的左下角出现了一个辅助照相机,展示整体的缩略图
(2)我想在想做到这样一个功能,就是用户可以根据自己的需要来决定是否需要这个辅助照相机。我的做法是:设置这个camera的nodeMask为0让其隐藏,设置1让其显示。因此,我在MFC的菜单栏中做了一个切换的按钮,该按钮的响应代码如下:
-
- //mOSG是一个全局变量,他下面的mViewer是视景器,由于该视景器下面挂了2个camera[一个是cameraMaster,一个是cameraSlave1]
- //我要控制的仅仅是cameraSlave1,他是mViewer的第二个儿子,所以有如下代码
- int currentStatus = mOSG->mViewer->getSlave(1)._camera->getNodeMask();
- if(1==currentStatus)//如果正在显示
- {
- mOSG->mViewer->getSlave(1)._camera->setNodeMask(0);
- }
- else
- {
- mOSG->mViewer->getSlave(1)._camera->setNodeMask(1);
- }
复制代码
问题:
(1)我在单击菜单栏按钮时,一旦隐藏了这个附属照相机,那么整个场景就“卡”住了,看上去就像是不渲染了一样,但是我去看当前程序运行情况,那个单独开启的线程Render并没有退出,所以我在想,是不是我把附属相机给隐藏掉会对主相机产生影响呢?会不会让他也不工作了呢?还是说我上面的那部分隐藏代码有问题呢?
(2)如果我的想法不对,那怎样可以实现这样的效果呢?
谢谢各位大侠了~~~ |
|