ВНИМАНИЕ! Наша конференция посвящена космической тематике и компьютерным играм. Политические вопросы и происходящие в мире события в данный момент на нашем сайте не обсуждаются!
|
» Лунный зонд Laika, недоделанный | страница 1 |
|
|
|
Канал Orbiter: «Лунный зонд Laika, недоделанный» |
|
|
igel
100 EGP
 Рейтинг канала: 4(86) Репутация: 14 Сообщения: 755
Зарегистрирован: 12.06.2006
 |
|
Лунный зонд Laika, недоделанный
Отмечая релиз Фау, хочу заодно показать "неширокой" публике свой старый, трехлетней уже давности, и откровенно недоделанный аддон. Немного предыстории. Как раз 3 года назад я познакомился с Орбитером, сильно охренел, полетал немного, посмотрел АПИ и решил сделать "что-нибудь". Да так ,чтобы - для учебы - охватить АПИ пошире.
Ну и сделал... почти. Лунный посадочный зонд по баллистической схеме Луны-9, но "по-соврменному" - то есть, как бы его могли сегодня быстренько и задешево склепать. Носитель тот же - Молния - , веса примерно те же... но весь зонд запроектировал сам, нарисовал в GMax (тоже чтоб научиться). Ну а внутри оторвался, конечно, с удовольствием. Добавил автопилот блока Л для автозапуска к Луне с орбиты по внеплоскостной траектории, добавил автопилот посадки... не добавил только автопилот коррекции - а надо! Освоил всякие отстрелы, анимацию. Добавил блок телеметрии - для отладки очень пригодилось! Добавил реакцию на столкновения - просто на пробу, потому что в Орбитере не было (и до сих пор нет). Причем реакция-то простешйая, а как прикольно получилось! Добавил сгорание в атмосфере и прочие разрушения - причем не простые, а с рассыпанием на куски, с индивидуальным поведением каждого куска. Еще что-то там интересное добавил, уж и не помню... В коде тоже архитектура по тем временам любопытная: единый класс, отвечающий за все типы разнообразных обломков, вся общая "надклассовая" функциональность (то, что должен делать Орбитер, но не делает) вынесено в отдельный класс через двойное наследование... В общем, и сейчас интересно вспомнить.
Доделывая Фау, выкопал я эту штуку из архива, сунул в Орбитер - поди ж ты, летает! Через столько версий - и летает! Разумеется, кое-что в визуалках и поведении подпортилось, динамика изменилась, особенно в атмосфере - видимо, атмосфера стала моделироваться точнее. Ну да ничего. А вытащил я ее затем... Если Семерка скоро до Молнии дойдет - можно будет попробовать вернуться к этому проекту на новой базе. Готовность-то его - никак не меньше 60%, а то и больше! Автопилот коррекции сделать - и можно будет летать на Луну "в одну кнопку", причем не через экватор.
Если интересно - брать здесь: http://members.shaw.ca/atil8/Orbiter/Laika0.7.0b.zip
|
|
|
Thorton
87 EGP
 Рейтинг канала: 3(36) Репутация: 12 Сообщения: 696 Откуда: Томск Зарегистрирован: 15.05.2006
 |
|
Блин, не удалось все возможности посмотреть
У меня после ТЛИ Орбитер в винду вываливается
|
|
|
hrjushkin
51 EGP
 Репутация: 0 Сообщения: 47 Откуда: Москва Зарегистрирован: 08.10.2006
 |
|
Продолжаем ЛКИ Установил, попробовал, нашел где вываливается в винды. Если Лайка создается из модуля Лайка-Молния, то спотыкается на строках анимации, вот тут (файл Laika.cpp):
AddAnimationComponent (ConfigAnimation, 0, 1, mgrYaw2);
AddAnimationComponent (ConfigAnimation, 0, 1, mgrPitch2);
AddAnimationComponent (ConfigAnimation, 0, 1, mgrVNA2);
если их закоментарить, то Лайка создается, конечно, "куцая", но только по мешам, физически все движки на месте, и можно лететь дальше
З.Ы. И при отстреле DropPO() после этого же ReloadMeshes() исчезает одна штанга с движками Кажется тоже дело в анимации этой. Инетересно, конечно, докопать, в чем же дело, но для аддона можно просто добавить перевернутые на 180 пары к уже существующим штангам. Как я понял, там просто зеркально-отражается все в анимации, мгновенно.
З.З.Ы. "Сгорание" в атмосфере с рассыпанием на обломки - зачОт
|
|
|
igel
100 EGP
 Рейтинг канала: 4(86) Репутация: 14 Сообщения: 755
Зарегистрирован: 12.06.2006
 |
|
Да, что-то в Орбитере изменилось с анимациями за эти три года. А вообще причина таких сложностей с анимацией мешей довольно простая: я экспериментировал, можно ли обойтись одной мешью, а потом размножить ее на несколько симметричных объектов. То есть, можно ли это сделать в принципе, насколько сложно, имеет ли смысл. По-моему, не особенно имеет смысл: выигрываю я только в размере файла мешей на диске, одного вместо четырех. Хотя... у Н1 вон одинаковых движков аж 30!
|
|
|
Thorton
87 EGP
 Рейтинг канала: 3(36) Репутация: 12 Сообщения: 696 Откуда: Томск Зарегистрирован: 15.05.2006
 |
|
hrjushkin : |
"Сгорание" в атмосфере с рассыпанием на обломки - зачОт
|
Как и за collision detection , при столкновении разгонника с лэндером, первый очень смачно разваливается.
|
|
|
igel
100 EGP
 Рейтинг канала: 4(86) Репутация: 14 Сообщения: 755
Зарегистрирован: 12.06.2006
 |
|
Ну это если сильно стукнуть Если несильно - отскочит, причем оба получат довольно случайные импульсы. У этого механизма есть один глючок: иногда импульс расхождения оказывается неодстаточным, и объекты "прилипают" друг к другу, и начинают интересно танцевать
А если стукнуть ну очень-очень сильно - объект не развалится, а вообще уничтожится, уйдет из сценария.
|
|
|
astronavt
86 EGP
 Рейтинг канала: 1(3) Репутация: 35 Сообщения: 403 Откуда: Новочеркасск Зарегистрирован: 11.01.2006
 |
|
Ну насчет глюков вопрос решается просто - ставим Orbiter 2003 и дело в шляпе. Жаль только IMFD под него не идет, так что необходимые коррекции приходется делать Трансиксом.
Другое дело - адаптация под новую версию...
igel : |
Если Семерка скоро до Молнии дойдет
|
Достаточно всего-лишь замутить блок Л и прикрутить его к "Союзу". А блок И "Молнии" такой как у "Союза", или как у "Восхода"? У меня пока лишь союзовский вариант.
_________________ Я бы изменил этот мир, но Бог не дает мне исходников... |
|
|
hrjushkin
51 EGP
 Репутация: 0 Сообщения: 47 Откуда: Москва Зарегистрирован: 08.10.2006
 |
|
astronavt : |
Ну насчет глюков вопрос решается просто - ставим Orbiter 2003 и дело в шляпе. Жаль только IMFD под него не идет
|
да не, там все просто, в утилитах где-то есть программка, ей можно повернуть меши нужные и анимацию выбросить вообще. Все будет работать
|
|
|
igel
100 EGP
 Рейтинг канала: 4(86) Репутация: 14 Сообщения: 755
Зарегистрирован: 12.06.2006
 |
|
Насколько мне известно - как у "Союза" (блок И).
А насчет коррекции - вообще смешно можно сделать. После прохода полпути к Луне (собствнно, когда коррекция и нужна) можно включить ХУД в режим поверхности (он уже считается над Луной) и построить вектор в координатах местного горизонта, паралелльно поверхности, так ,чтобы подвернуть вектор скорости ( и так направленный примерно в Луну) прямо на ее центр Некоторое жульничество , но работает на раз, и очень просто
|
|
|
hrjushkin
51 EGP
 Репутация: 0 Сообщения: 47 Откуда: Москва Зарегистрирован: 08.10.2006
 |
|
все же докопал я где порылась собака с вылетанием в винды Заодно нашел почему при отстреле DropPO штанга изчезает. Второе проще - там при релоаде мешей лишний поворот происходит, то есть поворотов как бы два получается и штанга опять встает на старое место (начальное).
А первое - вылет, происходит на сточке strcpy(((Laika*)NewLaika)->Proximator->TralFileName, TralFileName); там подразумевается, что файл есть, но если ТРАЛ не активирован, то есть никакого файла телеметрии не пишется, то происходит вылет.
|
|
|
igel
100 EGP
 Рейтинг канала: 4(86) Репутация: 14 Сообщения: 755
Зарегистрирован: 12.06.2006
 |
|
Вишь ты даже как... а раньше не вылетал - я тестировал без трал-файла...
|
|
|
hrjushkin
51 EGP
 Репутация: 0 Сообщения: 47 Откуда: Москва Зарегистрирован: 08.10.2006
 |
|
с мешами и анимацией - это, как выяснилось, глюк Орбитера нового! Есть микро-патч http://download.orbit.m6.net/orbiter.exe - все ок становится, штанги все на месте
а для того, чтобы не вываливалось в винды, надо вместо
strcpy(((Laika*)NewLaika)->Proximator->TralFileName, TralFileName);
поставить
if (strlen(TralFileName) > 0) strcpy(((Laika*)NewLaika)->Proximator->TralFileName, TralFileName);
и вуаля
|
|
|
igel
100 EGP
 Рейтинг канала: 4(86) Репутация: 14 Сообщения: 755
Зарегистрирован: 12.06.2006
 |
|
Спасибо!
Мне сейчас чуток не до Орбитера - уезжаю на уикенд, много подготовки. Но когда вернусь, хочу посмотреть, что в ней имеет смысл быстро поправить, чтобы пересобрать и перевыложить. А то в западном форуме ее, оказывается, помнят и снова хотят. Пока навскидку четыре пункта: пустой трал, анимации (вряд ли корректно требовать от людей установки неофициального патча, да и в анимации той практического смысла почти нету), подстроить параметры столкновений чтобы уменьшить риск "прилипания", и поправить аэродинамические параметры.
|
|
|
igel
100 EGP
 Рейтинг канала: 4(86) Репутация: 14 Сообщения: 755
Зарегистрирован: 12.06.2006
 |
|
Вчера вернулся на минутку к Лайке и попытался воспроизвести ctd. Не удалось почему-то, ни пустым тралом, ни анимацией. Отсюда напрашиваются два вопроса:
1. Этот неофициальный микропатч - откуда он взялся? Насколько можно его рекомендовать/требовать, если я опубликую в западном форуме текущую версию, не трогая анимацию? А то не хочется заморачиваться сейчас с такой мелочью как меши.
2. Чем опасна в нынешнем виде строка
strcpy(((Laika*)NewLaika)->Proximator->TralFileName, TralFileName);
?
Как я понимаю, только тем, что пустое имя файла может оказаться "инициализированным" мусором. Редко, но бывает... В таком случае, может быть, дешевле будет не ставить везде, где копируется строка, проверку strlen > 0, а просто принудительно инициализировать все строки нулем?
|
|
|
hrjushkin
51 EGP
 Репутация: 0 Сообщения: 47 Откуда: Москва Зарегистрирован: 08.10.2006
 |
|
igel : |
1. Этот неофициальный микропатч - откуда он взялся? Насколько можно его рекомендовать/требовать, если я опубликую в западном форуме текущую версию, не трогая анимацию? А то не хочется заморачиваться сейчас с такой мелочью как меши.
|
Патч сделал сам Мартин, после того, как ему посыпались вопросы, что стало с анимацией. Выпуск патча 060929 тоже не помог, поэтому Мартин переделал только ехе-шник орбитеровский. Обещал в патче 2 все официально поправить. Кто-то бился даже в истерике, что у него куча аддонов, и все их переделать, чтобы не глючило он просто ФИЗИЧЕСКИ не сможет! Думаю для публикации всеж надо пофиксить. Негоже штангу отстреливать с контейнерами
Цитата: |
2. Чем опасна в нынешнем виде строка
strcpy(((Laika*)NewLaika)->Proximator->TralFileName, TralFileName);
?
Как я понимаю, только тем, что пустое имя файла может оказаться "инициализированным" мусором. Редко, но бывает... В таком случае, может быть, дешевле будет не ставить везде, где копируется строка, проверку strlen > 0, а просто принудительно инициализировать все строки нулем?
|
Я проверил, что будет если заменить
char TralFileName[256];
на
char TralFileName[256] = "";
Тоже все ок, и с файлом и без.. Я не спец в С++, но думаю, что тут что-то связано с тем, что строка 256 символов - пока не инициилизирована, ей память не выделяется. И при попытке что-то сотворить с этой переменной, не проверив, виндовс пытается обратиться к какому-нить адресу, который вообще может быть занят чем-то другим ("мусор" в этом указателе).
Почему не вываливается в CTD - мож от версии Виндовс зависит, может от конфигурации машины, памяти и т.д. По крайней мере вывалилось не у меня одного, так что это - тенденция!
|
|
|
igel
100 EGP
 Рейтинг канала: 4(86) Репутация: 14 Сообщения: 755
Зарегистрирован: 12.06.2006
 |
|
Для меня это тоже не самый любимый язык. А строка... Память-то на массив должна сразы выделяться, тут я осторожен... а вот на автоматическую инициализацию переменных (точнее, на ее отсутствие) и впрямь налетал периодически, причем во всех языках без исключения
А меши править - нет, не хочется. Во-первых, все равно патч Орбитера будет, во-вторых, это все-таки просто публикация, а не релиз. Только на моем сайте, без Ангара. Для тех, кто хочет освежить в памяти и для тех, кому интересен в основном только автопилот. А вертеть меши - это вспоминать gmax и вообще отвлекаться от основной темы, а времени у меня сейчас ой как мало...
А основная тема - доделать Лайку по-настоящему, до релиза. Я составил списочек todo - и первейшее и наиглавнейшее там, конечно же, автопилот коррекции. Именно он должен полностью замкнуть навигацию "в одну кнопку на Луну", что и есть конечная цель всей затеи. Остальное - так, инкрементальная косметика (перевести на новый api, отвязать от ракеты, подстроить параметры - ну и с мешами заодно разобраться).
|
|
|
hrjushkin
51 EGP
 Репутация: 0 Сообщения: 47 Откуда: Москва Зарегистрирован: 08.10.2006
 |
|
igel : |
Память-то на массив должна сразы выделяться, тут я осторожен...
|
что-то мне подсказывает, что ежели переменная динамическая, память ей фик выделяется Впрочем я ж говорю - не знаю как там и что Я тока помню, что любой массив в С - это просто указатель на первый его элемент. А указатель - это ячейка памяти, а пока нет инициализации - Виндовс и не почешется выделить ресурс
Цитата: |
А вертеть меши - это вспоминать gmax
|
Чур меня чур повернуть на 90 градусов - это утилитка Shipedit, что в комплекте с Орбитером идет, может.
|
|
|
Bloodest
156 EGP
  Рейтинг канала: 3(40) Репутация: 18 Сообщения: 944 Откуда: Питерские мы Зарегистрирован: 07.10.2004
 |
|
Эээ ну char TralFileName[256] это просто обманка в смасле 256 - на самом деле это просто указатель, а 256 это подсказка для конструктора эквивалента и тд.
Те обозначив (пример)
{
//char TralFileName[256] ;// Ни куда не указывает
char TralFileName[256] = "";// Указывает на статик ""
char TralFileName2[256] = "";//TralFileName==TralFileName2 ! - следствие работы оптимизатора компилятора...
strcpy( TralFileName,((Laika*)NewLaika)->Proximator->TralFileName); // Начинает указывывать на эквивалент содержимого ((Laika*)NewLaika)->Proximator->TralFileName), который тутже создается и имеет размер ровно в 256 ячеек
} ==> вызывается деструкторы "" и эквивалента
Здесь минус strcpy состоит в том что место для эквивалента ищется место не менее 256 ячеек (и только !), можно и периписать больше! тем самым затереть часть последующих ячеек.
В данном же случае TralFileName без эквивалента strcpy может привести к сбою, потому как это действительно всего лишь указатель.
ЗЫ еще надо иметь что многие каллбаки на старте работают весьма неполноценно. Например в таймстепе только на 3-4 проходе начинают полноценно работать все функции API...
|
|
|
igel
100 EGP
 Рейтинг канала: 4(86) Репутация: 14 Сообщения: 755
Зарегистрирован: 12.06.2006
 |
|
Ага, значит
char TralFileName[256] = "";// Указывает на статик ""
в принципе достаточно. Статик - это то, что нужно. А явно указанную пустую строку strcpy понимает правильно. Там дальше по цепочке много где эта строка продолжает размножаться аналогичным образом, безо всяких проверок - и хоть бы хны. А вообще эти сишные строки - давняя боль...
На меши я вчера поглядел немного... и решил не трогать. Некузяво, некрасиво и противоречит концепции. Уж если я собираю аппарат "из кусков", то негоже множить сущности. И так раздражает, что симметричную мешь нельзя продублировать (загрузив лишь однажды), а надо держать и грузить копию файла. Но тут еще принципиальный вопрос: когда я, к примеру, гружу антенну в аппарат, она передвигается и проворачивается так, как этого требует конструкция. Когда же антенна отваливается и становится самостоятельным обломком - никакого проворота и сдвига нет, мешь грузится вполне себе симметрично. Держать разные файлы мешей на эти случаи - именно это и будет некузяво. Например, захочу я ей цвет поменять, форму, текстуру добавить - что же, все эти копии-клоны выслеживать "ниже по течению"?
А отсюда вопрос: является ли мгновенная анимация (как у меня в Лайке) единственным способом поставить мешь на нужное место с поворотом? В АПИ полно функций для работы с мешами, но везде среди параметров - только линейное перемещение. Имеется еще какая-то явно низкоуровневая meshgrouptransform (с аналогичной же структурой в параметре), но она требует VISHANDLE, что для меня выглядит подозрительно, да и вообще функция совершенно недокументированная (во всяком случае, та документация, что есть, мне не помогла ).
|
|
|
Bloodest
156 EGP
  Рейтинг канала: 3(40) Репутация: 18 Сообщения: 944 Откуда: Питерские мы Зарегистрирован: 07.10.2004
 |
|
Эээ можно предложить некоторое усложнение - использвать для антенны, скажем, аттачмент. Те вращать ее аттачментом, перемещать, возможно. Родитель - корабль, ребенок - антенна.
Для самой антенны как корабля проще вообще создать только файл конфигурации (можно вообще без меша) и без dll. Все управление - загрузку меша и деформации осуществлять из dll корабля (дает гигантский выигрыш во времени разработки за счет упращения отладки и механизмов синхронизации). Плюс, если антенна отстреливается - она отстрелится в том положении и форме трансформаций до которой доведена программой. Недостаток - нельзя полноценно отстрелить аттачмент, если родитель сидит на поверхности планеты (скорость будет нулевая не смотря на то, что она конкретно задается ) - приходится добавлять фиктивную силу. Ну естественно, если планируется поддержка перезагрузки - отдельный геморрой...
|
|
|
|
|
|
Канал Orbiter: «Лунный зонд Laika, недоделанный» |
|
К списку каналов | Наверх страницы |
Цитата не в тему: Макс, советую перекусить тросик ручного тормоза. ... Макс, у тебя, кажись, там не тросик, а рельса стальная. (Juni)
|
» Лунный зонд Laika, недоделанный | страница 1 |
|