osg如何能在程序中改变视点的位置?如何不改变相机的位置来切换操作器

这个问题一直困扰可很久,因为没有认真去看osg源码导致的。
1.在网上收集的资料很多都是 利用osg::carmea 的void setViewMatrixAsLookAt(const osg::Vec3d& eye,const osg::Vec3d& center,const osg::Vec3d& up);这样做能够做到,但是前提是不能使用viewer-》run()。因为viwer->run();会判断场景是否存在操作器,米有的话会自动添加操作器,从而抵消setViewMatrixAsLookAt()函数的操作。
2.还可以利用    cameraManipulator->setHomePosition(m_vPosEye, location, vUp); 但是etHomePosition(m_vPosEye, location, vUp);使用过程中会出现很多问题,因为这个函数原本的目的是为了home()使用的,有时调到所需的视点位置后,鼠标和键盘不能移动了,在osgChina上Array大神给一位网友解释的很清除,有需要的可以在osgchina()的论坛上搜索
3.利用cameraManipulator->setmatrix();通过王锐大神的启发,使用这个函数可以调整视点位置,但是需要计算矩阵,比较头突疼,就没往下做
4.最近看源码发现了一个方法,setTransformation();这个函数凡是继承osgGA::StandardManipulator()都可以使用,原型为  virtual void setTransformation( const osg::Vec3d& eye, const osg::Vec3d& center, const osg::Vec3d& up );官方解释如下:  /** Sets manipulator by eye position, center of rotation, and up vector.*/,通过设置三个视线向量来设置操作器的位置,这个好像正是需要找的那个函数,,这样只需在事件里填写自己需要的视线方向即可实现相机的视点的移动,
问题二:
另外当需要在同一视点下切换操作器时,及操作器切换的时候会自动根据绑定的node节点和相机的视线范围来自动的调整摄像机的初始位置,也即是切换操作器的时候视点会直接发生跳跃调整到操作器自适应的初始位置,若想不回到初始位置我想了一个办法:
1.事件中通过viewer->getCamera()->getViewMatrixAsLookAt(vPosEye, vCenter, vUp);来获取视点信息,同时vPosEye, vCenter需要调整,因为他们之间的距离被限定为1,因为这个函数原函数是
void getViewMatrixAsLookAt(osg::Vec3f& eye,osg::Vec3f& center,osg::Vec3f& up,float lookDistance=1.0f) const;,可以通过调整第四个参数来调整两者之间的距离到合适的大小,
2.利用setTransformation()和求得的视点信息来设置操作器,将设置完成的操作器加入viewer中。
 osg::ref_ptr trac = new osgGA::TrackballManipulator();             
   trac->setTransformation(m_vPosEye, location, vUp);         
        viewer->setCameraManipulator(trac);

  • 6
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值