Elite Games - Свобода среди звезд!
.
ВНИМАНИЕ!
Наша конференция посвящена космической тематике и компьютерным играм.
Политические вопросы и происходящие в мире события в данный момент на нашем сайте не обсуждаются!

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

Поиск | Правила конференции | Фотоальбом | Регистрация | Список пилотов | Профиль | Войти и проверить личные сообщения | Вход

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


Рейтинг канала: 3(40)
Репутация: 18
Сообщения: 944
Откуда: Питерские мы
Зарегистрирован: 07.10.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 метра
    Добавлено: 10:10 27-12-2005   
Kulch
 105 EGP


Рейтинг канала: 2(21)
Репутация: 29
Сообщения: 604
Откуда: Россия, Санкт-Петербург
Зарегистрирован: 24.08.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
    Добавлено: 17:05 02-02-2006   
Tiger
 65 EGP


Репутация: 10
Сообщения: 140
Откуда: Россия, Барнаул
Зарегистрирован: 13.12.2005
Вот не совсем ясно, нужны ли для этого эфемериды, или достаточно параметров Obliquity и LAN из конфига планеты? Короче, хочу узнать формулу для перевода наклонения Inc и LAN орбиты из эклиптической системы координат в экваториальную. Можно ссылку.
_________________
Siberian Tiger
    Добавлено: 23:52 05-02-2006   
Bloodest
 155 EGP


Рейтинг канала: 3(40)
Репутация: 18
Сообщения: 944
Откуда: Питерские мы
Зарегистрирован: 07.10.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;
...
    Добавлено: 09:20 06-02-2006   
Bloodest
 155 EGP


Рейтинг канала: 3(40)
Репутация: 18
Сообщения: 944
Откуда: Питерские мы
Зарегистрирован: 07.10.2004
Да в новой версии - 2006 появилась такая возможность.
Код:

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.
    Добавлено: 08:34 06-05-2006   
Канал Orbiter: «Эфемериды получены!!!»
 
  
Показать: 
Предыдущая тема | Следующая тема |
К списку каналов | Наверх страницы
Цитата не в тему: Сколько борона ни корми - все равно паранидом не станет.

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