查看: 3748|回复: 3

请教如何设置Camera的回调?

[复制链接]

该用户从未签到

发表于 2009-4-27 10:15:21 | 显示全部楼层 |阅读模式
我打算实现的功能是在while绘制循环外,保证camera“盯”着某一运动目标看.

调用的回调函数形式是:  camera->setPreDrawCallback(new MyCamera(TargetPosition));  其中TargetPosition是一运动目标的位置。

回调函数:
  class MyCamera : public osg::Camera:rawCallback
{
   public :
          osg::Vec3d _vec;
          MyCamera(osg::Vec3d vec) _vec(vec){};
         virtual void operate() (osg::Camera*camera) const
           {
            camera->setViewMatrixAsLookAt(osg::Vec3(0,0,0), _vec, osg::Vec3(0, 0, 1.0));
            }
    }

问题是:TargetPosition位置是正确的,每次更新TargetPosition位置值后,camera的LookAt的位置并不更新。

我该采用osg::Camera的哪种调用关联方法?  setPreDrawCallback/setPostDrawCallback?

还是该采用osg::Node的回调形式?  setUpdateCallback/setCullCallback?

谢谢!

该用户从未签到

发表于 2009-4-27 12:38:44 | 显示全部楼层
“camera的LookAt的位置并不更新”,我想这应该是因为场景漫游器(例如TrackballManipulator)的影响。漫游器的工作是根据当前用户交互信息调整场景摄像机的位置,因此会自动重置您的LooAt设置。

如果希望自己手动调整摄像机的话,最好的方式是派生一个新的MatrixManipulator并在其中进行控制;如果想在回调里面控制的话,则不能同时使用漫游器,用哪个回调并没有关系

该用户从未签到

 楼主| 发表于 2009-4-27 13:42:23 | 显示全部楼层
可能是我没有将问题描述清楚。 我用这个回调的camera来实现RTT的功能, 在while循环中,就已经有一个camera Manipulator了,同时在while中,计算运动目标的位置,将这个位置传给回调的camera,回调的camera需要不断的更新,保证一直“看”的是运动目标。

RTT的功能参看的是osgprerender例子,不同之处是我打算将飞机沿一定的轨迹飞行,需要将这个“产生”纹理的相机一直“看”的是飞机,该采用何种回调方式来实现相机的不断更新?

谢谢版主!

该用户从未签到

发表于 2009-4-27 13:59:59 | 显示全部楼层
RTT相机的更新可以在回调里设置,不过我个人更喜欢自己派生一个RttCamera类,并且在派生的traverse函数中完成setViewMatrix和setProjectionMatrix的工作,完全没有问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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