Autor Wątek: [ODE] Kwaternion do Euler'a  (Przeczytany 771 razy)

Offline deniol

  • Użytkownik

# Maj 07, 2012, 19:29:51



Postanowiłem znowu podejść do ODE, tym razem użyłem Irrlichta na driverze D3D9. Problem mam z rotacją, skorzystałem z gotowej funkcji do konwersji kwaternionów na eulery
void QuaternionToEuler(const dQuaternion quaternion, vector3df &euler){
  dReal w,x,y,z;
  w=quaternion[0];
  x=quaternion[1];
  y=quaternion[2];
  z=quaternion[3];
  double sqw = w*w;   
  double sqx = x*x;   
  double sqy = y*y;   
  double sqz = z*z;
 
  euler.Z = (irr::f32) (atan2(2.0 * (x*y + z*w),(sqx - sqy - sqz + sqw))
                        *irr::core::RADTODEG );
 
  euler.X = (irr::f32) (atan2(2.0 * (y*z + x*w),(-sqx - sqy + sqz + sqw))
                        *irr::core::RADTODEG ); 
 
  euler.Y = (irr::f32) (asin(-2.0 * (x*z - y*w))
                        *irr::core::RADTODEG );
}

a kod w pętli wygląda tak
vector3df rta;

      dQuaternion result;
      dGeomGetQuaternion(geom, result);
      QuaternionToEuler(result,rta);
      node->setRotation( vector3df( rta.X, rta.Y, rta.Z ) );

Niestety nie działa jak należy, rotacja jest bokiem, zamiast wokół osi X lub Z to jest wokół osi Y, więc kombinowałem ze zmianą kolejności argumentów vector3df w node->setRotation ale wtedy obroty nie są pełne, są takie "tiki" + zmienia się kierunek obrotu mimo, że mesh nie dotknął ziemi.
« Ostatnia zmiana: Maj 07, 2012, 19:59:03 wysłana przez deniol »

Offline Mr. Spam

  • Miłośnik przetworów mięsnych