|
本帖最后由 lanxun1988 于 2011-5-14 10:51 编辑
我想使用一个独立的从属的相机从另外的角度观察同一个场景,并在屏幕的左下角显示,从属相机的示意图如下:
其中的坐标轴所在位置用于表征场景的原点位置,小飞机目前也放在场景的原点位置,场景树的结构很简单,root下面挂了MatrixTransform类型的mt1和mt2,他们的下面再分别挂着小飞机模型和三维轴的模型。
我设置的步骤是这样:
(1)将相机放置在X轴的正向上,朝向为坐标原点,UP参数为Z轴朝上
(2)用setProjectionMatrixAsPerspective()设置视域体(就是那个棱台状的区域)
具体的几个设置的代码如下:
- //创建主视口
- osg::ref_ptr<osg::Camera> cameraMaster = new osg::Camera;
- cameraMaster->setGraphicsContext(gc.get());
- cameraMaster->setViewport(new osg::Viewport(traits->x,traits->y,traits->width,traits->height));
- viewer->addSlave(cameraMaster.get());
复制代码
- //创建第一个附属视口
- osg::ref_ptr<osg::Camera> cameraSlave1 = new osg::Camera;
- cameraSlave1->setGraphicsContext(gc.get());
- cameraSlave1->setViewport(new osg::Viewport(0,0,width/3,width/3));
- cameraSlave1->setViewMatrixAsLookAt(osg::Vec3(500.0f,0.0f,0.0f),osg::Vec3(0.0f,0.0f,0.0f),osg::Vec3(0.0f,0.0f,1.0f));//设置照相机的位置和朝向
- cameraSlave1->setProjectionMatrixAsPerspective(1.5,1.3,50,150);//设置视域体
- cameraSlave1->setAllowEventFocus(false);
- cameraSlave1->setReferenceFrame(osg::Transform::ABSOLUTE_RF);//保证与主视图的照相机无关
- viewer->addSlave(cameraSlave1.get());
复制代码
- viewer->setCameraManipulator(new osgGA::TrackballManipulator());
- viewer->realize();
- while (!viewer->done())
- {
- viewer->frame();
- }
复制代码
现在的问题是这样:
(1)我如果用setViewMatrixAsLookAt函数将照相机离原点的远近调整后,确实有作用,下面两个图分别代表相机在X轴正向上离原点50、200的情况,一个显示的大一些,一个小一些,很正常。
以及
(2)但是我用setProjectionMatrixAsPerspective设置视域体(主要是设置远近裁剪平面距离相机的距离)的时候,好像随便怎么设置这两个平面,效果都是一样的。就比如说,现在相机在距离原点200的位置,即(200,0,0)的位置,相机朝向是原点,此时我设置近平面距离相机500,远平面距离相机1500,按道理说,这个小飞机是不在该视域体范围内的,但是他们依旧能显示出来;另外,我即便调整这两个距离,所有的效果都是一样的,具体情况如下,两个效果一致。 |
|