查看: 3161|回复: 3

osg::quet的问题请教

[复制链接]

该用户从未签到

发表于 2008-6-26 08:57:28 | 显示全部楼层 |阅读模式
osg::quat四元组可以描述节点的绕三轴的旋绕,一种理解就是可以表示成节点在三维场景中的方向(指向),那么我们取得了一osg::quat四元组,我们怎么根据这个四元组取出单独饶每一个轴的旋转角度呢,即如何分别获取绕X轴的旋转角度angle,osg::Vec3(1,0,0)),同样的,如何获取绕Y轴 Z轴的旋转角度呢?
请指教!谢谢

该用户从未签到

发表于 2008-6-26 13:06:18 | 显示全部楼层
Quat有x(),y(),z()和w()四个值,然后就要了解四元数的计算了
我印象中好像有:

2 * x()^2 = 1 - cosA
其中x()是Quat的函数,A是绕X轴的角度;绕Y、Z轴的计算与此类同
不过我没有做过试验,不知道这样解出来对不对

该用户从未签到

 楼主| 发表于 2008-6-26 17:46:09 | 显示全部楼层
谢谢,我实验一下!

该用户从未签到

发表于 2008-6-28 19:10:26 | 显示全部楼层

给你发个换转得代码

  1. // HPR to Quat
  2. osg::Quat HPRToQuat(double heading, double pitch, double roll)
  3. {
  4. osg::Quat q(
  5.   roll,osg::Vec3d(0.0, 1.0, 0.0),
  6.   pitch,osg::Vec3d(1.0, 0.0, 0.0),
  7.   heading,osg::Vec3d(0.0, 0.0, 1.0));


  8. return q;
  9. }

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

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

  14.         if (test > 0.4999)
  15.         { // singularity at north pole
  16.         heading = 2.0 * atan2(q.y(), q.w());
  17.         pitch   = osg::PI_2;
  18.         roll    = 0.0;
  19.         return;
  20.         }
  21.         if (test < -0.4999)
  22.         { // singularity at south pole
  23.         heading = 2.0 * atan2(q.y(), q.w());
  24.         pitch   = -osg::PI_2;
  25.         roll    = 0.0;
  26.         return;
  27.         }

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

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

  34. }
复制代码

[ 本帖最后由 array 于 2008-6-28 19:36 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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