查看: 1394|回复: 2

DriveManipulator的getMatrix() 问题

[复制链接]

该用户从未签到

发表于 2012-3-30 11:18:58 | 显示全部楼层 |阅读模式
根据理解,在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()运算前,不就是想要的结果么?哪位朋友费心,帮我解释一下,谢谢了!

该用户从未签到

发表于 2012-3-30 11:59:23 | 显示全部楼层
本帖最后由 CWorld 于 2012-3-30 14:07 编辑

这个问题我觉得整体上就是说把 “世界坐标系变换到相机空间”。公式的推导建议您看看这篇文件,http://blog.csdn.net/popy007/article/details/5120158。这个问题问的挺好的,自己也是一知半解,看了好多次总是不能心平气和的看那么多数学公式。

该用户从未签到

 楼主| 发表于 2012-3-30 13:52:46 | 显示全部楼层
CWorld 发表于 2012-3-30 11:59
这个问题我觉得整体上就是说把 “世界坐标系变换到相机空间”。公式的推导建议您看看这篇文件,http://blog ...

非常感谢CWorld,推荐的文章一定好好阅读。再次感谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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