查看: 6458|回复: 5

请教姿态角与姿态矩阵的相互转换

[复制链接]

该用户从未签到

发表于 2009-4-14 12:59:15 | 显示全部楼层 |阅读模式
物体姿态可以由pitch(俯仰)、yaw(偏向)、roll(滚转)三个角度来描述,怎样把角度转换成变换矩阵,反过来,已知变换矩阵应该怎样来求三个角度呢?

下面是我的由姿态角求变换矩阵的方法
void PoseAngle2Axis(float pitch, float yaw, float roll, osg::Vec3d& at, osg::Vec3d& up)
{
        at.set(0, 1, 0);
        up.set(0, 0, 1);

        osg::Matrixd mt;                // 旋转,逆着旋转轴看,逆时针为正
        mt.makeRotate(pitch, osg::Vec3(1, 0, 0));
        at = mt.preMult(at);
        up = mt.preMult(up);
        mt.makeRotate(yaw, osg::Vec3(0, 0, 1));
        at = mt.preMult(at);
        up = mt.preMult(up);
        mt.makeRotate(roll, at);
        up = mt.preMult(up);
}

看了一些资料,由变换矩阵求姿态角,大致有几种方法:欧拉角法、方向余弦法和四元数法,但都没找到具体算法
OSG中有提供这样的算法么?

该用户从未签到

发表于 2009-4-14 13:03:25 | 显示全部楼层
Matrix::makeRotate可以把欧拉角度转换为姿态矩阵;也可以用Matrix::getRotate将姿态矩阵转为四元数。四元数转为欧拉角度需要自己编程实现,我在另一个帖子里已经写了方法,不再赘述。总之您的需求osg中几乎都有实现,查看一下API文档就可以自己得出答案

该用户从未签到

 楼主| 发表于 2009-4-16 13:26:01 | 显示全部楼层
从欧拉角到姿态矩阵仅用一个makeRotate肯定是不行的,我上面的实现中第三次旋转(roll)使用的旋转轴为前两次旋转后的at方向,而不是Z轴

您说的帖子是不是这一篇:http://www.osgchina.org/bbs/redirect.php?fid=8&tid=211&goto=nextnewset
里面binbinqin给了一个四元数与姿态角相互转换的算法,抄录如下:
// HPR to Quat
osg:uat HPRToQuat(double heading, double pitch, double roll)
{
osg::Quat q(
  roll,osg::Vec3d(0.0, 1.0, 0.0),
  pitch,osg::Vec3d(1.0, 0.0, 0.0),
  heading,osg::Vec3d(0.0, 0.0, 1.0));


return q;
}

// Quat to HPR,pitch范围:[-PI/2, PI/2]
void QuatToHPR(osg::Quat q, double& heading, double& pitch, double& roll)
{

        double test = q.y() * q.z() + q.x() * q.w();

        if (test > 0.4999)
        { // singularity at north pole
        heading = 2.0 * atan2(q.y(), q.w());
        pitch   = osg:I_2;
        roll    = 0.0;
        return;
        }
        if (test < -0.4999)
        { // singularity at south pole
        heading = 2.0 * atan2(q.y(), q.w());
        pitch   = -osg::PI_2;
        roll    = 0.0;
        return;
        }

        double sqx = q.x() * q.x();
        double sqy = q.y() * q.y();
        double sqz = q.z() * q.z();

        heading = atan2(2.0 * q.z() * q.w() - 2.0 * q.y() * q.x(), 1.0 - 2.0 * sqz - 2.0 * sqx);
        pitch   = asin(2.0 * test);
        roll    = atan2(2.0 * q.y() * q.w() - 2.0 * q.z() * q.x(), 1.0 - 2.0 * sqy - 2.0 * sqx);

}
其中,从姿态角到四元数的转换,采用分别绕固定的X,Y,Z轴旋转的计算方式,这显然是不行的(如果其所指的姿态角和我们常用的姿态角定义一致的话)
从四元数到姿态角的算法还没有仔细研究


顺便问一下版主讲的“OSG的API文档”是指的什么?在哪里? 因为一直都没有找到合适的文档,急需这个,希望版主指教,谢谢!

该用户从未签到

发表于 2009-4-16 13:39:38 | 显示全部楼层
我在自己的工程osgModeling里面写了一个个人很得意的函数,也就是rotateMatrix()。它取得的是绕任意轴旋转的旋转矩阵,不知道对楼主有无帮助。

osg的API文档是用Doxygen自动生成的,QQ共享里可能也有人上传了,可以看一下。

该用户从未签到

发表于 2009-4-16 15:02:05 | 显示全部楼层
给你推荐一书,,,《3D数学基础:图形与游戏开发》,,,我这段时间失眠,,睡不着的时候就看看,,发现很多东西还是值得学习的,,里面有一章专门讲这个转换的,,你看看~~~~~~

该用户从未签到

发表于 2009-4-19 00:48:23 | 显示全部楼层
我还真看了这本书... 确实对理解OSG的矩阵有帮助... 说实在的 我是借助这本书才看明白FlySky书上的那个自定义操作器场景漫游事例的..
FlySky大哥的说 讲的还是有点深奥. 期待下一班 加些数学知识在前面 到后面涉及到得时候说明一下.
入门书吗嘛 就要定位为 是给我这样 水平比较次一点的人看的..
牛人应该看 OSG高级编程之类的...
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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