查看: 1593|回复: 5

quat问题

[复制链接]

该用户从未签到

发表于 2010-11-1 08:48:42 | 显示全部楼层 |阅读模式
我在设置旋转的时候是按照x,y,z轴来设置的分量,比如:
osg:uat q(osg::inDegrees(tRotY),osg::Vec3d(0.0,1.0,0.0));
  osg::Matrix mt;
  mt=osg::Matrix::rotate(q);
  vRotate.set(mt);
设置y轴上的旋转分量。
但是设置后,重新获取变换矩阵中的quat后没有函数获取y轴分量。请问这个问题该怎么解决?

该用户从未签到

发表于 2010-11-1 08:56:30 | 显示全部楼层
void getEulerFromQuat(osg:uat q, double& heading, double& attitude, double& bank)
{
    double limit = 0.499999;
    double sqx = q.x()*q.x();
    double sqy = q.y()*q.y();
    double sqz = q.z()*q.z();
    double t = q.x()*q.y() + q.z()*q.w();
   
    if (t>limit) // gimbal lock (万向节死锁)
    {
        heading = 2 * atan2(q.x(),q.w());
        attitude = osg:I_2;
        bank = 0;
    }
    else if (t<-limit)
    {
        heading = -2 * atan2(q.x(),q.w());
        attitude = - osg::PI_2;
        bank = 0;
    }
    else
    {
        heading = atan2(2*q.y()*q.w()-2*q.x()*q.z() , 1 - 2*sqy - 2*sqz);
        attitude = asin(2*t);
        bank = atan2(2*q.x()*q.w()-2*q.y()*q.z() , 1 - 2*sqx - 2*sqz);
    }
}

该用户从未签到

 楼主| 发表于 2010-11-1 08:59:46 | 显示全部楼层
这个算出来的是x,y,z的三个分量吗?

该用户从未签到

 楼主| 发表于 2010-11-1 09:01:08 | 显示全部楼层
这个函数好像没有指定这三个向量啊(1,0,0)(0,1,0)(0,0,1)?

该用户从未签到

发表于 2010-11-1 09:42:51 | 显示全部楼层
从任意四元数Quat转换到欧拉角度,这在数学上是不可能的;您必须指定其它条件,即三个轴的旋转角度依次旋转的顺序(HPR,PHR等)。ltf2010ltf给出的方案也只能对应一种顺序(我想应该是HPR),并没有通用的解法

该用户从未签到

 楼主| 发表于 2010-11-1 10:27:19 | 显示全部楼层
哦,非常感谢,我现在转化x轴方向的没有问题,但是在y轴上增加一个角度后,再从quat中获取这个角度,z轴方向也会计算出一个旋转值。而且三个方向的旋转量都发生了变化。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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