Elite Games - Свобода среди звезд!
.
  » Эфемериды получены!!! |
Конференция предназначена для общения пилотов. Для удобства она разделена на каналы, каждый из которых посвящен определенной игре. Пожалуйста, открывайте темы только в соответствующих каналах и после того, как убедитесь, что данный вопрос не обсуждался ранее.

Search | Conference rules | Album | Register | Pilots list | Profile | Log in to check your private messages | Log in

   Page 1 of 1
 
Поиск в этой теме:
Канал Orbiter: «Эфемериды получены!!!»
Bloodest
 152 EGP


Рейтинг канала: 3(40)
: 18
Posts: 930
Location: Питерские мы
Joined: 07 Oct 2004
Эфемериды (положения и скорости небесных тел) используюися Орбитером для вычислений. В аддонах/МФД, для навигационных задач, они крайне необходимы. Трабла заключается в том что программный интерфейс эфемерид закрыт для пользователя-разработчика. Написание внешних модулей для вычислений эфемерид требует весьма спецефичских знаний, иначе точность будет весьма низкой...
Дык вот код (полухацкерская разработка Подмигиваю ). На одну строчку угрохана целая неделя труда!
Вот код


bool GetEph(double mjd, char * BodyName, double * EphData, int &EphForm)
{
OBJHANDLE ohPlanet = NULL;
ohPlanet = oapiGetGbodyByName (name);
if(!ohPlanet) return false;

//***хацкер-код***//
CELBODY * piPlanet = (CELBODY *)(((long *)((long)ohPlanet+0x278))[0]);
//****************//

EphForm = piPlanet->clbkEphemeris(mjd,EPHEM_TRUEPOS+EPHEM_TRUEVEL,EphData);

return true;
}

Например, для Марса
///////////////////////////
double mjd = 43049.5;// вообще какой нравится!
double tdat[12];
int ret =0;
VECTOR3 PP,PS,PP2;

if(GetEph(double mjd,"Mars", tdat, ret))
{
double AU = 149597870690.96;
oapiGetGlobalPos (oapiGetGbodyByName ("Mars"), &PP);
oapiGetGlobalPos (oapiGetGbodyByName ("Sun"), &PS);
PP=PP-PS;// Для проверки
if(ret ==76)//Для Марса -возврат- Центр Планеты + полярные координаты
{
double cos_B = cos(tdat[7]);
double cos_L = cos(tdat[6]);
double sin_B = sin(tdat[7]);
double sin_L = sin(tdat[6]);
PP2.x = AU*tdat[8] * cos_L * cos_B;
PP2.z = AU*tdat[8] * (sin_L * cos_B );
PP2.y = AU*tdat[8] * (sin_B);
}
double errS = fabs(PP.x-PP2.x)+fabs(PP.y-PP2.y)+fabs(PP.z-PP2.z);
double errR = length(PP2)-length(PP);
}
else
{
//обработчик ошибки
}
/////////////////
errS~=errR<=0.01 метра
    Posted: 10:10 27-12-2005   
Kulch
 105 EGP

Рейтинг канала: 2(21)
: 29
Posts: 604
Location: Россия, Санкт-Петербург
Joined: 24 Aug 2004
Добавлена новая функция oapiGetCelbodyInterface. Так что можно будет обойтись без хацкерского кода.

Кстати, Мартина очень обрадовал такой подход Подмигиваю
Вот его комментарий:
--------------------------
This looks scary ... I guess I better don't fit any more data into that class, or I might disturb the offset ... laugh Хы...
--------------------------
_________________
Юрий Кульчицкий aka Kulch
    Posted: 17:05 02-02-2006   
Tiger
 63 EGP

: 10
Posts: 140
Location: Россия, Барнаул
Joined: 13 Dec 2005
Вот не совсем ясно, нужны ли для этого эфемериды, или достаточно параметров Obliquity и LAN из конфига планеты? Короче, хочу узнать формулу для перевода наклонения Inc и LAN орбиты из эклиптической системы координат в экваториальную. Можно ссылку.
_________________
Siberian Tiger
    Posted: 23:52 05-02-2006   
Bloodest
 152 EGP


Рейтинг канала: 3(40)
: 18
Posts: 930
Location: Питерские мы
Joined: 07 Oct 2004
Собственно эфемериды нужны только для довольно узкого класса задач - дальнего перехвата планет/лун, причем когда нужно обеспечить высокую точность - тысяча - другая километров - использование орбитальных параметров планеты тут не прокатит...
Возьми, например Марс - через полгода эксцентриситет его орбиты изменится на вполне видимую величину. Для ближнего (1-2 месяца), в том числе согласования точки перецентра по высоте и экваториальным координатам эффективнее использовать численное интегрирование траекторий как КК так и планеты.

На счет перевода - проще учебник раздобыть.
Принцип (ИМХО, конечно) такой - нужно получить из т.н. стейтвекторы (векторы скорости и положения). Перевести стейт векторы из одной системы координат в другую. Обратно получить оскулирующие параметры. Тобишь если в Орбитере и нужно экваториальные то проще сразу работать от стейтов.
double GetEqInc(VESSEL * vessel)//взято из чужого СДК аддона
{
//получаем стэйт-вектора
OBJHANDLE hVessel = vessel->GetHandle();
OBJHANDLE hEarth = oapiGetGbodyByName ( "Earth"/*Planet_Name*/ );
VECTOR3 Rel_Vel,Rel_Pos,temp;
oapiGetRelativeVel(hVessel, hEarth, &Rel_Vel);
oapiGetRelativePos(hVessel, hEarth, &Rel_Pos);

//Преобразуем их в экваториальные координаты.
temp.x = Rel_Vel.x;
temp.y = Rel_Vel.z;
temp.z = Rel_Vel.y;
veccpy( Rel_Vel, temp);
temp.x = Rel_Pos.x;
temp.y = Rel_Pos.z;
temp.z = Rel_Pos.y;
veccpy( Rel_Pos, temp);
temp.x = Rel_Pos.x ;
double Ob_EARTH = 23.45 * RAD ; // Obliquity of the Earth (rad)
temp.y = cos(-Ob_EARTH)* Rel_Pos.y + sin(-Ob_EARTH)*Rel_Pos.z;
temp.z = -sin(-Ob_EARTH)* Rel_Pos.y + cos(-Ob_EARTH)*Rel_Pos.z;
veccpy( Rel_Pos, temp);
temp.x = Rel_Vel.x ;
temp.y = cos(-Ob_EARTH)* Rel_Vel.y + sin(-Ob_EARTH)*Rel_Vel.z;
temp.z = -sin(-Ob_EARTH)* Rel_Vel.y + cos(-Ob_EARTH)*Rel_Vel.z;
veccpy( Rel_Vel, temp);

//Вычисляем наклонение
VECTOR3 h_vector = crossp(Rel_Vel, Rel_Pos);
double h_abs = sqrt((h_vector.x*h_vector.x) + (h_vector.y*h_vector.y) + (h_vector.z*h_vector.z));
double i = 180 - acos(h_vector.z / h_abs) * DEG;

return i;
}


ЗЫ
Я использую правосторонюю систему координат
//Доворот из координатной системы Орбитера
double change;
change=OP.r.z; OP.r.z=OP.r.y;OP.r.y=change;
change=OP.v.z; OP.v.z=OP.v.y;OP.v.y=change;

//double Mu = 6.67259e-11 * 6.418542e+23;
///////////////////////////////Элементы орбиты
//1.Вектор площадей, его норма
VECTOR3 Sigma = crossp (OP.r,OP.v);
VECTOR3 Sigma0 = Sigma*(1./length(Sigma));
//2.Наклонение, долгота восходящего узла
OP.Inc = acos(Sigma0.z);
OP.Omega = acos(-Sigma0.y/sin(OP.Inc));
if(Sigma0.x < 0) OP.Omega = 2*PI-OP.Omega;
...
    Posted: 09:20 06-02-2006   
Bloodest
 152 EGP


Рейтинг канала: 3(40)
: 18
Posts: 930
Location: Питерские мы
Joined: 07 Oct 2004
Да в новой версии - 2006 появилась такая возможность.
Code:

oapiGetCelbodyInterface
Returns the CELBODY class interface for a celestial body, if available.
Synopsis:
OAPIFUNC CELBODY *oapiGetCelbodyInterface (OBJHANDLE hBody)
Parameters:
hBody celestial body handle
Return value:
Pointer to the CELBODY class instance for the body, or NULL if the body is not
controlled by an external module.
Notes:
·  hBody must be a valid handle for a celestial body (star, planet, moon, etc.),
e.g. as obtained from oapiGetGbodyByName). Passing a handle of any
other type will result in undefined behaviour.
·  Only celestial bodies controlled by external plugin modules have access to a
CELBODY instance. Celestial bodies that are updated internally by Orbiter
(e.g. using 2-body orbital elements, or dynamic updates) return NULL here.
    Posted: 08:34 06-05-2006   
Канал Orbiter: «Эфемериды получены!!!»
 
  
Display posts from previous: 
View previous topic | View next topic |
К списку каналов | Наверх страницы
Цитата не в тему: Зачем тебе теория относительности? Что ты туда относить собралась?! (Alone)

  » Эфемериды получены!!! |
Каналы: Новости | Elite | Elite: Dangerous | Freelancer | Star Citizen | X-Tension/X-BTF | X2: The Threat | X3: Reunion | X3: Terran Conflict | X Rebirth | EVE Online | Orbiter | Kerbal Space Program | Evochron | VoidExpanse | Космические Миры | Онлайновые игры | Другие игры | Цифровая дистрибуция | play.elite-games.ru | ЗВ 2: Гражданская война | Творчество | Железо | Игра Мечты | Сайт
   Дизайн Elite Games V5 beta.18