查看: 2648|回复: 4

OSG OrbitManipulator漫游器

[复制链接]

该用户从未签到

发表于 2015-6-8 22:27:22 | 显示全部楼层 |阅读模式
本帖最后由 fuckosgchinas 于 2015-6-8 22:31 编辑

OSG OrbitManipulator漫游器中 的函数:
  1. // doc in parent
  2. void OrbitManipulator::setTransformation( const osg::Vec3d& eye, const osg::Vec3d& center, const osg::Vec3d& up )
  3. {
  4.     Vec3d lv( center - eye );

  5.     Vec3d f( lv );
  6.     f.normalize();
  7.     Vec3d s( f^up );
  8.     s.normalize();
  9.     Vec3d u( s^f );
  10.     u.normalize();

  11.     osg::Matrixd rotation_matrix( s[0], u[0], -f[0], 0.0f,
  12.                             s[1], u[1], -f[1], 0.0f,
  13.                             s[2], u[2], -f[2], 0.0f,
  14.                             0.0f, 0.0f,  0.0f, 1.0f );

  15.     _center = center;
  16.     _distance = lv.length();
  17.     _rotation = rotation_matrix.getRotate().inverse();

  18.     // fix current rotation
  19.     if( getVerticalAxisFixed() )
  20.         fixVerticalAxis( _center, _rotation, true );
  21. }
复制代码


其中的 _center 、_distance、_rotation分别代表摄像机从世界坐标原点移动到观察中心(摄像机正对的地方)、并且在观察中心旋转_rotation、然后在移动到_distance到达最终的摄像机位置,请问我理解的这三个属性是否正确?
  如果正确那该类中下面函数:
        获取视图矩阵:
  1. osg::Matrixd OrbitManipulator::getInverseMatrix() const
  2. {
  3.     return osg::Matrixd::translate( -_center ) *
  4.            osg::Matrixd::rotate( _rotation.inverse() ) *
  5.            osg::Matrixd::translate( 0.0, 0.0, -_distance );
  6. }
复制代码


怎么理解?

提前谢谢 大家前来解答!

该用户从未签到

发表于 2015-6-8 23:39:00 | 显示全部楼层
本帖最后由 cenfer 于 2015-6-8 23:51 编辑

把相机看成一个坐标系。
eye是坐标系的原点,eye指向center的向量确定坐标系的Z轴方向,center可以指定任意值。
确定一个坐标系还需要一个轴的方向,一般指定被看作相机竖直方向(up)的Y轴。
_rotation就是这个坐标系的旋转姿态,可以通过坐标系的Z轴和Y轴的方向计算。
_distance和center只是控制坐标系运动时两个比较有意义参数,并不是这个坐标系系的参数。
比如说控制坐标系绕定点旋转,旋转中心就是center,旋转半径就是_distance,
当然三维空间旋转还要指定一个旋转轴的方向。


该用户从未签到

 楼主| 发表于 2015-6-9 20:01:11 | 显示全部楼层
本帖最后由 fuckosgchinas 于 2015-6-9 21:16 编辑

谢谢2楼VR大师的回复
  你说的相机坐标系我大致了解,

  1. osg::Matrixd OrbitManipulator::getInverseMatrix() const
  2. {
  3.     return osg::Matrixd::translate( -_center ) *
  4.            osg::Matrixd::rotate( _rotation.inverse() ) *
  5.            osg::Matrixd::translate( 0.0, 0.0, -_distance );
  6. }
复制代码

该函数获取的是模型视图矩阵嘛?
该函数怎样理解?
我的理解是:相机从世界坐标系原点,移动到_center点,然后在_center点 进行旋转_rotation,再平移_distance到最终的位置,最后就是视图矩阵,

麻烦问下 我的理解是否正确?
还有函数
  1. void OrbitManipulator::setTransformation( const osg::Vec3d& eye, const osg::Vec3d& center, const osg::Vec3d& up )
复制代码
中的 rotation_matrix矩阵不是视图旋转矩阵嘛 为什么还要求逆呢?

该用户从未签到

发表于 2015-6-9 21:40:27 | 显示全部楼层
getInverseMatrix是相机坐标系和世界坐标系之间的变换矩阵,
不是正的就是反的,记不清了,自己很容易验证。
只有实现这个虚函数(也可能是getMatrix),你的相机操作器才能控制相机的姿态,因为viewer要调用这个函数更新相机姿态。


从一个姿态变换到另一个姿态可能有N种方式啊。
你说的,在轨迹球相机操作器下可能是对的吧。
但我的理解是:想让相机做球体运动,将其姿态矩阵分解为_center,_distance,_rotation进行控制,效果就是球体运动。
如果你想让相机做其它运动,可能就是其它分解方式。
希望你能看到本质奥!

该用户从未签到

 楼主| 发表于 2015-6-9 23:12:53 | 显示全部楼层
getInverseMatrix函数是获取视图矩阵不?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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