|
|
|
Канал Orbiter: «создание модов для орбитера. программы.» |
|
|
astronavt
86 EGP
 Рейтинг канала: 1(3) Репутация: 35 Сообщения: 403 Откуда: Новочеркасск Зарегистрирован: 11.01.2006
 |
|
Да, кстати. Сейчас дома инета нет, поэтому доступа по FTP не имею. В этой связи с выкладыванием мануала по IMFD с вашими коментариями придется подождать. Думаю скоро разрулю свои проблемы с телефоном.
_________________ Я бы изменил этот мир, но Бог не дает мне исходников... |
|
|
Kulch
105 EGP
 Рейтинг канала: 2(21) Репутация: 29 Сообщения: 604 Откуда: Россия, Санкт-Петербург Зарегистрирован: 24.08.2004
 |
|
Bloodest, полагаю, нуждаюсь в вашей помощи. Мне нужно перевести вектор из местной локальной горизонтальной системы координат в локальную корабля. Локалная горизонтальная СК - это то, во что переводит локальный вектор функция HorizonRot. Мне нужно решить обратную задачу и я, признаться, запутался...
_________________ Юрий Кульчицкий aka Kulch |
|
|
Bloodest
156 EGP
  Рейтинг канала: 3(40) Репутация: 18 Сообщения: 944 Откуда: Питерские мы Зарегистрирован: 07.10.2004
 |
|
Ну если не гризонтальная а СК местного горизонта в экваториальной нотации.
//Первый ход Получаем положение корабля в глоб координатах относительно планетыи преобразем его в представление Долгота-Широта-Радиус
void Mars75_VZOR_BM_PRG79:: Coordinats (double MJT,OBJHANDLE hPlanet,VECTOR3 &Location)
{
double Obl = oapiGetPlanetObliquity (hPlanet);
double Tet = oapiGetPlanetTheta (hPlanet);
double rot = oapiGetPlanetCurrentRotation (hPlanet);
double period = oapiGetPlanetPeriod (hPlanet);
if(period !=0) rot = (MJT - oapiGetSimMJD())*24.*3600./period*2.*PI +rot;
VECTOR3 RotTeta=_V(0,Tet,0);
VECTOR3 RotObl =_V(Obl,0,0);
VECTOR3 Rotrot =_V(0,rot,0);
VECTOR3 tmp,tmp2;
RotateVector(Location,-RotTeta, tmp);
RotateVector(tmp,RotObl , tmp2);
RotateVector(tmp2, - Rotrot, tmp);
Location.x = atan2(tmp.z,tmp.x);
Location.y = atan2(tmp.y,sqrt(tmp.z*tmp.z+tmp.x*tmp.x));
Location.z = length(tmp);
};
//Втрой ход смещаем точку на заданные величины локальной горизонтальной (ХYZ) - добавляем высоту (Location.z+Y) - широту (Location.y + Z/Location.z) долготу (Location.x + X/Location.z*cos(Location.y))
//Третий ход (Обратное преобразование)
void Mars75_VZOR_BM_PRG79:: Position(double MJT,OBJHANDLE hPlanet,VECTOR3 &Location)
{
VECTOR3 tmp,tmp2;
tmp.x = Location.z*fabs(cos(Location.y))*cos(Location.x);
tmp.z = Location.z*fabs(cos(Location.y))*sin(Location.x);
tmp.y = Location.z*sin(Location.y);
MATRIX3 mat;
oapiGetPlanetObliquityMatrix(hPlanet, &mat);
double rot = oapiGetPlanetCurrentRotation (hPlanet);
double period = oapiGetPlanetPeriod (hPlanet);
if(period !=0) rot = (MJT - oapiGetSimMJD())*24.*3600./period*2.*PI +rot;
MATRIX3 mat2;
mat2.m11 =cos(rot);mat2.m12 =0;mat2.m13 = - sin(rot);
mat2.m21 =0 ;mat2.m22 =1;mat2.m23 = 0 ;
mat2.m31 =sin(rot);mat2.m32 =0;mat2.m33 = cos(rot);
MultiplyByMatrix(tmp , mat2, tmp2);
MultiplyByMatrix(tmp2, mat , Location);
}
// Четвертый шаг - тривиальное преобразование из глобала в локал
Зы самплы несколько экликтичны + есть кое что лишнее (для данного случая) но работают железно. Собственно разарабатывались под автомат подхода к базе ...
|
|
|
Kulch
105 EGP
 Рейтинг канала: 2(21) Репутация: 29 Сообщения: 604 Откуда: Россия, Санкт-Петербург Зарегистрирован: 24.08.2004
 |
|
Спасибо! Ваш пример, похоже, очень поможет мне при разработке автопилота горизонтальной посадки.
А сейчас я нашел способ попроще:
const VECTOR3 ort_X = _V(1,0,0);
const VECTOR3 ort_Y = _V(0,1,0);
const VECTOR3 ort_Z = _V(0,0,1);
.....
//определяем локальную ск в горизонтальной
vesselobjV->HorizonRot(ort_X, X_point);
vesselobjV->HorizonRot(ort_Y, Y_point);
vesselobjV->HorizonRot(ort_Z, Z_point);
//получаем матрицу поворота координат
MATRIX3 M_rot;
M_rot.m11 = X_point.x; M_rot.m21 = X_point.y; M_rot.m31 = X_point.z;
M_rot.m12 = Y_point.x; M_rot.m22 = Y_point.y; M_rot.m32 = Y_point.z;
M_rot.m13 = Z_point.x; M_rot.m23 = Z_point.y; M_rot.m33 = Z_point.z;
//имеем вектор в горизонтальной ск
//пусть он называется v_hor
VECTOR3 v_loc;
//пусть определены операции умножения матрицы на вектор и взятия
//обратной матрицы
// вуаля!
v_loc = (!M_rot) * v_hor;
_________________ Юрий Кульчицкий aka Kulch |
|
|
Bloodest
156 EGP
  Рейтинг канала: 3(40) Репутация: 18 Сообщения: 944 Откуда: Питерские мы Зарегистрирован: 07.10.2004
 |
|
Замечательно !!! Только ИМХО последняя стадия проще будет через кватернионы.
Рыба с кодом операций
http://www.gamedev.ru/articles/?id=30129
1.Матрицу загоняем в кватернион
unit_from_matrix
2.Меняем направление вращения
w=-w;
3.Вращаем v_loc в искомый вектор.
ЗЫ надо попробывать сразу получить кватернион из двух векторов.
ort= _V(1,1,1)
vesselobjV->HorizonRot(ort, point);
jось вращения ax= crossp(ort,point);
угол an=acos(dotp(ort,point)/length(ort)/length(point));
Далее по рыбе unit_from_axis_angle
|
|
|
Kulch
105 EGP
 Рейтинг канала: 2(21) Репутация: 29 Сообщения: 604 Откуда: Россия, Санкт-Петербург Зарегистрирован: 24.08.2004
 |
|
Поправочка.
Поскольку при преобразовании координат нету масштабирования, то операция взятия обратной матрицы заменяется на операцию транспонирования, что заметно упрощает задачу.
_________________ Юрий Кульчицкий aka Kulch |
|
|
|
|
|
Канал Orbiter: «создание модов для орбитера. программы.» |
|