|
根据理解,在OSG的manipulator定义的函数getMatrix()的作用是获得操作器的位置矩阵。
在阅读代码 DriveManipulator class 时候发现,如下代码:
osg::Matrixd DriveManipulator::getMatrix() const
{
return osg::Matrixd::rotate(_pitch,1.0,0.0,0.0)*osg::Matrixd::rotate(_rotation)*osg::Matrixd::translate(_eye);
}
而 _rotation的值在下面函数中求得:
void DriveManipulator::computePosition(const osg::Vec3d& eye,const osg::Vec3d& center,const osg::Vec3d& up)
{
osg::Vec3d lv = center-eye;
osg::Vec3d f(lv);
f.normalize();
osg::Vec3d s(f^up);
s.normalize();
osg::Vec3d u(s^f);
u.normalize();
osg::Matrixd rotation_matrix(s[0], u[0], -f[0], 0.0,
s[1], u[1], -f[1], 0.0,
s[2], u[2], -f[2], 0.0,
0.0, 0.0, 0.0, 1.0);
_eye = eye;
_rotation = rotation_matrix.getRotate().inverse();
}
该段代码我的理解是根据eye,center,up的矢量构造出相机的位置,这里我疑惑的是
_rotation = rotation_matrix.getRotate().inverse();
这句程序,为什么要将得到的rotation_matrix取inverse()后的quat?在不取invers()运算前,不就是想要的结果么?哪位朋友费心,帮我解释一下,谢谢了!
|
|