查看: 5831|回复: 8

关于camera中setProjectionMatrixAsPerspective函数无效的问题

[复制链接]

该用户从未签到

发表于 2011-5-14 10:47:53 | 显示全部楼层 |阅读模式
本帖最后由 lanxun1988 于 2011-5-14 10:51 编辑

我想使用一个独立的从属的相机从另外的角度观察同一个场景,并在屏幕的左下角显示,从属相机的示意图如下:
    裁剪图.jpg
    其中的坐标轴所在位置用于表征场景的原点位置,小飞机目前也放在场景的原点位置,场景树的结构很简单,root下面挂了MatrixTransform类型的mt1和mt2,他们的下面再分别挂着小飞机模型和三维轴的模型。
    我设置的步骤是这样:
    (1)将相机放置在X轴的正向上,朝向为坐标原点,UP参数为Z轴朝上
    (2)用setProjectionMatrixAsPerspective()设置视域体(就是那个棱台状的区域)
    具体的几个设置的代码如下:
   
  1. //创建主视口
  2. osg::ref_ptr<osg::Camera> cameraMaster = new osg::Camera;
  3. cameraMaster->setGraphicsContext(gc.get());
  4. cameraMaster->setViewport(new osg::Viewport(traits->x,traits->y,traits->width,traits->height));
  5. viewer->addSlave(cameraMaster.get());
复制代码


   
  1. //创建第一个附属视口
  2. osg::ref_ptr<osg::Camera> cameraSlave1 = new osg::Camera;
  3. cameraSlave1->setGraphicsContext(gc.get());
  4. cameraSlave1->setViewport(new osg::Viewport(0,0,width/3,width/3));
  5. 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));//设置照相机的位置和朝向
  6. cameraSlave1->setProjectionMatrixAsPerspective(1.5,1.3,50,150);//设置视域体
  7. cameraSlave1->setAllowEventFocus(false);
  8. cameraSlave1->setReferenceFrame(osg::Transform::ABSOLUTE_RF);//保证与主视图的照相机无关
  9. viewer->addSlave(cameraSlave1.get());
复制代码


   

  1. viewer->setCameraManipulator(new osgGA::TrackballManipulator());
  2. viewer->realize();
  3. while (!viewer->done())
  4. {
  5. viewer->frame();
  6. }
复制代码



    现在的问题是这样:
    (1)我如果用setViewMatrixAsLookAt函数将照相机离原点的远近调整后,确实有作用,下面两个图分别代表相机在X轴正向上离原点50、200的情况,一个显示的大一些,一个小一些,很正常。
X50情况jpg.jpg        以及      X200情况jpg.jpg

    (2)但是我用setProjectionMatrixAsPerspective设置视域体(主要是设置远近裁剪平面距离相机的距离)的时候,好像随便怎么设置这两个平面,效果都是一样的。就比如说,现在相机在距离原点200的位置,即(200,0,0)的位置,相机朝向是原点,此时我设置近平面距离相机500,远平面距离相机1500,按道理说,这个小飞机是不在该视域体范围内的,但是他们依旧能显示出来;另外,我即便调整这两个距离,所有的效果都是一样的,具体情况如下,两个效果一致。
X200情况jpg.jpg
X200情况jpg.jpg

该用户从未签到

 楼主| 发表于 2011-5-14 10:52:32 | 显示全部楼层
自己顶一下,谢谢各位大侠帮忙看看~~~

该用户从未签到

发表于 2011-5-16 09:24:00 | 显示全部楼层
您可以试一下
viewer.getCamera()->setComputeNearFarMode(osgUtil::CullVisitor:O_NOT_COMPUTE_NEAR_FAR);

该用户从未签到

 楼主| 发表于 2011-5-16 16:04:51 | 显示全部楼层
回复 3# aya_daxiang

    您能告知一下该句的具体作用么

该用户从未签到

 楼主| 发表于 2011-5-16 16:12:47 | 显示全部楼层
您可以试一下
viewer.getCamera()->setComputeNearFarMode(osgUtil::CullVisitor:O_NOT_COMPUTE_NEAR_FA ...
aya_daxiang 发表于 2011-5-16 09:24



    谢谢您,这个设置之后确实效果上已经达到我要的效果了,只是不知道它的具体含义,还望指点~~

该用户从未签到

发表于 2011-5-16 18:09:36 | 显示全部楼层
DO_NOT_COMPUTE_NEAR_FAR 就是使用你自己设置的near far来确定远近平面,不然osg会自己计算。
这是osg FAQ里的回答:
Why does OSG seem to ignore my near/far clipping planes?

When using osgViewer::Viewer (or osgUtil::SceneView), near and far clipping planes are recomputed on-the-fly based on the current eye point and viewable scene. This is by design to optimize the near/far range of the depth buffer, which might otherwise result in "z-fighting" artifacts if near and far are set to unreasonably small or large values.

You can override this behavior by calling:

viewe.getCamera()>setComputeNearFarMode(osgUtil::CullVisitor:O_NOT_COMPUTE_NEAR_FAR)

For an insightful example of this feature check out the osgthirdpersonview example (which was added in version 2.4). It shows one window containing a normal scene and a second window showing the camera and clipping planes used in the first window. By manipulating the view in the first window you can see the changing clipping planes in the second one.

该用户从未签到

 楼主| 发表于 2011-5-17 15:04:08 | 显示全部楼层
回复 6# aya_daxiang


    3Q~

该用户从未签到

发表于 2011-5-18 09:25:57 | 显示全部楼层
mark 一下,学习!

该用户从未签到

发表于 2011-5-18 09:26:08 | 显示全部楼层
mark 一下,学习!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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