DarkKnight
вот ето работает у меня по крайней мере
переводит квартерион из ODE в irrlicht
вот ето просто понять к чему все :
GRAD_PI = 180.0 / 3.1415926535897932384626433832795
GRAD_PI2 = 3.1415926535897932384626433832795 / 180.0
typedef float dReal;
typedef dReal dQuaternion[4];
void Quaternion_To_Euler(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 = (float) (atan2(2.0 * (x*y + z*w),(sqx - sqy - sqz + sqw))*GRAD_PI);
euler.X = (float) (atan2(2.0 * (y*z + x*w),(-sqx - sqy + sqz + sqw))*GRAD_PI);
euler.Y = (float) (asin(-2.0 * (x*z - y*w))*GRAD_PI);
}
void Euler_To_Quaternion(const vector3df &euler, dQuaternion quaternion)
{
double _heading=euler.Z*GRAD_PI2/2.0;
double _attitude=euler.Y*GRAD_PI2/2.0;
double _bank=euler.X*GRAD_PI2/2.0;
double c1 = cos(_heading);
double s1 = sin(_heading);
double c2 = cos(_attitude);
double s2 = sin(_attitude);
double c3 = cos(_bank);
double s3 = sin(_bank);
double c1c2 = c1*c2;
double s1s2 = s1*s2;
quaternion[0]=(dReal) (c1c2*c3 + s1s2*s3);
quaternion[1]=(dReal) (c1c2*s3 - s1s2*c3);
quaternion[2]=(dReal) (c1*s2*c3 + s1*c2*s3);
quaternion[3]=(dReal) (s1*c2*c3 - c1*s2*s3);
}
в принципе ничего нет не возможного
и такой переход прийдется делать ... :/
ps. потом просто перепиши квартерион ode на ирлихтовский ...