[INC] QuaternionConverter
Описание: Что такое
Heading(Yaw) - рысканье (курс),
Attitude(Pitch) - тангаж (килевая качка),
Bank(Roll) - крен (бортовая качка) ?
Рысканье, тангаж и крен - авиационные термины, обозначающие вращения в Декартовой системе координат (по Эйлеровым углам), относительно локальной системы координат самолёта.
Вообразите, что вы видите впереди и ниже себя самолёт, горизонтально летящий на север.
Ось Z направлена снизу прямо вверх. Рысканье - вращение вокруг оси Z.
Ось X идёт от конца левого крыла к концу правого. Тангаж - это вращение вокруг оси X.
Ось Y проходит от хвоста к носу самолёта. Крен - вращение вокруг оси Y.
Данный инклюд преобразовывает (с исправлением) кватернионы в углы Эйлера
Code
stock ConvertNonNormaQuatToEuler(Float: qw, Float: qx, Float:qy, Float:qz,
&Float:heading, &Float:attitude, &Float:bank)
{
new Float: sqw = qw*qw;
new Float: sqx = qx*qx;
new Float: sqy = qy*qy;
new Float: sqz = qz*qz;
new Float: unit = sqx + sqy + sqz + sqw;//если normalised - показатель коррекции
new Float: test = qx*qy + qz*qw;
if (test > 0.499*unit)
{ // singularity at north pole - особенность на северном полюсе
heading = 2*atan2(qx,qw);
attitude = 3.141592653/2;
bank = 0;
return 1;
}
if (test < -0.499*unit)
{ // singularity at south pole - особенность на южном полюсе
heading = -2*atan2(qx,qw);
attitude = -3.141592653/2;
bank = 0;
return 1;
}
heading = atan2(2*qy*qw - 2*qx*qz, sqx - sqy - sqz + sqw);
attitude = asin(2*test/unit);
bank = atan2(2*qx*qw - 2*qy*qz, -sqx + sqy - sqz + sqw);
return 1;
}
Code
stock GetVehicleRotation(vehicleid,&Float:heading, &Float:attitude, &Float:bank)
{
new Float:quat_w,Float:quat_x,Float:quat_y,Float:quat_z;
GetVehicleRotationQuat(vehicleid,quat_w,quat_x,quat_y,quat_z);
ConvertNonNormaQuatToEuler(quat_w,quat_x,quat_z,quat_y, heading, attitude, bank);
bank = -1*bank;
return 1;
}
Внимание 1: кай наверно попутал местами quat_z и quat_y. Исправил.
Внимание 2: тангаж домножил на -1, т.к. почему-то положительный тангаж определялся как отрицательный.
Пример использования
Code
new Float:x,Float:y,Float:z, Float:rotX,Float:rotY,Float:rotZ, Float:angle;
GetVehiclePos(GetPlayerVehicleID(playerid), x, y, z);
GetVehicleZAngle(GetPlayerVehicleID(playerid), angle);
GetVehicleRotation(GetPlayerVehicleID(playerid), rotZ, rotX, rotY);
GetXYZInrear(3.5, angle, rotY, x, y, z);
CreateObject(2899, x, y, z-0.6, rotX, rotY, angle-90.0, 200.0);
Название: [INC] QuaternionConverter.inc
Размер: 1.02 кб
Доступен до: 2010-09-25 14:21:40
Описание: Конвертирует Кватернионы в углы Эйлера
Ссылка для скачивания файла: http://ifolder.ru/19036797