查看: 2491|回复: 3

如何取出osg::Quat存储的姿态信息?

[复制链接]

该用户从未签到

发表于 2009-4-14 11:10:25 | 显示全部楼层 |阅读模式
定义一个osg:uat 存储姿态信息,让其绕x轴30度,绕y轴60度,绕z轴90度,

osg::Quat m_rotation;

m_rotation = osg::Quat(osg::inDegree(30.0f),osg::Vec3(1.0,0.0,0.0))*
osg::Quat(osg::inDegree(60.0f),osg::Vec3(0.0,1.0,0.0))*
osg::Quat(osg::inDegree(90.0f),osg::Vec3(0.0,0.0,1.0));

现在请问如何将30度,60度,90度这些数值取出来?

我试过用m_rotation.x()方法,发现取出来并不是我想要的绕x轴的角度值,谢谢!

该用户从未签到

发表于 2009-4-14 12:30:09 | 显示全部楼层
如果是以原点为中心旋转,那么可以自己编码将四元数转换为欧拉角度,一个示例的代码如下:
  1. void getEulerFromQuat(osg::Quat q, double& heading, double& attitude, double& bank)
  2. {
  3.     double limit = 0.499999;
  4.     double sqx = q.x()*q.x();
  5.     double sqy = q.y()*q.y();
  6.     double sqz = q.z()*q.z();
  7.     double t = q.x()*q.y() + q.z()*q.w();
  8.    
  9.     if (t>limit) // gimbal lock (万向节死锁)
  10.     {
  11.         heading = 2 * atan2(q.x(),q.w());
  12.         attitude = osg::PI_2;
  13.         bank = 0;
  14.     }
  15.     else if (t<-limit)
  16.     {
  17.         heading = -2 * atan2(q.x(),q.w());
  18.         attitude = - osg::PI_2;
  19.         bank = 0;
  20.     }
  21.     else
  22.     {
  23.         heading = atan2(2*q.y()*q.w()-2*q.x()*q.z() , 1 - 2*sqy - 2*sqz);
  24.         attitude = asin(2*t);
  25.         bank = atan2(2*q.x()*q.w()-2*q.y()*q.z() , 1 - 2*sqx - 2*sqz);
  26.     }
  27. }
复制代码

该用户从未签到

 楼主| 发表于 2009-4-19 20:15:36 | 显示全部楼层
这个取出的角度是-90~90.
如何取出0~360或-180~180呢?

该用户从未签到

发表于 2009-4-19 23:24:28 | 显示全部楼层
这个需要您自己判断了,因为从一个矢量旋转到另一个矢量的角度是取决于观察者的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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