Тема: 3д двиг
Показать сообщение отдельно
Старый 03.07.2007, 11:43   #7
jimon
 
Сообщений: n/a
Re: 3д двиг

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 на ирлихтовский ...
 
Ответить с цитированием