Advertisement
Guest User

Untitled

a guest
Feb 25th, 2018
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.38 KB | None | 0 0
  1. Quat getQuatFromEuler(double bank, double heading, double attitude)
  2.     {
  3.         bank = DegreesToRadians(bank);
  4.         heading = DegreesToRadians(heading);
  5.         attitude = DegreesToRadians(attitude);
  6.  
  7.         double c1 = cos(heading / 2); double s1 = sin(heading / 2); double c2 = cos(attitude / 2); double s2 = sin(attitude / 2); double c3 = cos(bank / 2);
  8.         double s3 = sin(bank / 2);
  9.         double c1c2 = c1*c2; double s1s2 = s1*s2;
  10.  
  11.         double w = c1c2*c3 - s1s2*s3;
  12.         double x = c1c2*s3 + s1s2*c3;
  13.         double y = s1*c2*c3 + c1*s2*s3;
  14.         double z = c1*s2*c3 - s1*c2*s3;
  15.  
  16.         Quat q;
  17.  
  18.         q[0] = x; q[1] = y;
  19.         q[2] = z; q[3] = w;
  20.  
  21.         return q;
  22.     }
  23.  
  24.     Vec3d getEulerFromQuat(osg::Quat q)
  25.     {
  26.         double limit = 0.499999;
  27.  
  28.         double sqx = q.x()*q.x();
  29.         double sqy = q.y()*q.y();
  30.         double sqz = q.z()*q.z();
  31.  
  32.         double t = q.x()*q.y() + q.z()*q.w();
  33.  
  34.         double heading, attitude, bank;
  35.  
  36.         if (t>limit) // gimbal lock ?
  37.         {
  38.             heading = 2 * atan2(q.x(), q.w());
  39.             attitude = osg::PI_2;
  40.             bank = 0;
  41.         }
  42.         else if (t<-limit)
  43.         {
  44.             heading = -2 * atan2(q.x(), q.w());
  45.             attitude = -osg::PI_2;
  46.             bank = 0;
  47.         }
  48.         else
  49.         {
  50.             heading = atan2(2 * q.y()*q.w() - 2 * q.x()*q.z(), 1 - 2 * sqy - 2 * sqz);
  51.             attitude = asin(2 * t);
  52.             bank = atan2(2 * q.x()*q.w() - 2 * q.y()*q.z(), 1 - 2 * sqx - 2 * sqz);
  53.         }
  54.  
  55.         return Vec3d(RadiansToDegrees(bank), RadiansToDegrees(heading), RadiansToDegrees(attitude));
  56.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement