Пост

Дневник разработки: октябрь

Битва за хорошую физику, часть 2

Привет, друзья!

В этом месяце мне удалось хорошо продвинуться в разработке игры. Я практически полностью потратил его на физику, реализовывая все вещи, о которых упоминал в предыдущем апдейте. И все получилось почти точно так, как я планировал, причем удалось сделать даже больше, чем я мог себе представить. Итак, без лишних слов, давайте поговорим об этом.

Некоторые ракеты пострадали при подготовке этого обновления

Физика ракет

Единственный хороший способ скрещивания физики ракеты и таймлайна с поддержкой перемотки времени — это представление космического корабля одним физическим телом. Но так как ракета будет создаваться игроком из деталей с различной массой и формой, мне нужен был хороший способ учесть это в симуляции. Иначе сразу бы стала ощущаться нереалистичность происходящего. Я решил это, рассчитывая силы, которые воздействуют на каждую деталь по отдельности и затем применяя их в нужных точках к физическому телу. Таким образом, если вы не отбалансируете ракету, и силы авто стабилизации будет не хватать, она рано или поздно перевернется в сторону с большей массой.

Аэродинамика

Я использовал уравнения из USSA для модели атмосферы. Так как Земля и Солнечная система выполнены в реальном масштабе, мне не пришлось модифицировать ни единой строчки в этой модели. Единственная разница заключается в том, что атмосфера Земли в игре заканчивается на высоте в 110 км, где атмосферное давление настолько низкое, что им можно пренебречь. Площадь поверхности и коэффициент сопротивления формы предварительно рассчитываются для каждой детали. Это означает, что форма космического корабля будет влиять на его полетные характеристики. Приближения, которые я использовал для расчета сил трения, дают неплохие результаты и быстро рассчитываются компьютером. Но я всегда открыт для дальнейших улучшений алгоритма или реализации нового в будущем.

Столкновения

Это было действительно непросто. Все столкновения обрабатываются PhysX. И из-за природы такого рода вычислений это всегда компромисс между точностью и производительностью. Если столкновения были разрешены хотя бы слегка некорректно, космический корабль будет немедленно запущен со скоростью, в десять раз превышающей скорость света в бездну, потому что в симуляции участвуют тела с большой массой и движущиеся с большими скоростями. Одна маленькая ошибка и весь опыт от игры будет уничтожен. Но если повысить точность слишком сильно, то в результате вы получите плохую производительность и недовольных игроков. Несмотря на то, что я нашел неплохие настройки, балансирующие на лезвии ножа, я дам доступ части из них в настройках игры. Так что у всех будет шанс подстроить игру под возможности своего компьютера. Вот вам несколько забавных гифок из игры, до того, как я настроил PhysX и исправил кучу багов:

Простое столкновение с поверхностью планеты швырнуло десятитонную ракету так, как будто она была сделана из пластика

Столкновение между двумя деталями ракеты отправило обе на орбиту Плутона

Что еще?

На данный момент в игре нет физики воды. Мне не удалось быстро найти хороший алгоритм для нее. Я мог бы использовать модель сопротивления атмосферы, просто увеличив в ней плотность, но я не думаю, что это единственное и правильное решение. Я буду продолжать исследовать этот вопрос уже после релиза. Сейчас же есть два варианта. Или уничтожать ракету при любом контакте с водой, или полностью игнорировать наличие воды и давать ракете пролетать сквозь нее. Мне больше нравится первый вариант, так как он рушит погружение в меньшей степени.

Еще я не реализовал крылья, но я сделаю это как только найду время.

Не только физика

Когда я уставал исправлять баги физики, я переключался на другие области игры. Первой из них были звезды. Изначально я использовал обычную большую текстуру для них (почти 8 мегабайт с разрешением 8192x4096). Но даже с таким размером звезды получались размытыми. Еще они все были одинакового цвета, что далеко до реальности.

Старые звезды

Поэтому я реализовал собственную систему, используя реальную базу данных,
которая включает в себя более 110 000 звезд. Каждая звезда теперь использует цвет, позицию и яркость из этой базы данных. Даже при количестве в 65 000 штук все данные занимают всего 2 мегабайта, но обычно даже такое количество не нужно. Невооруженным глазом в ясном ночном небе видно около 6000 звезд. И опять же я вынесу в настройки максимальное количество, яркость и экспозицию звезд и вы сможете настроить небо таким, каким хотели бы его видеть. Единственное, чего не хватает в системе — это Млечного пути. Но рано или поздно я найду способ эффективно отрисовывать и его.

Новые звезды. Лучше всего сравнивать оба изображения в браузере, используя ссылки на версии в полном размере

Вторая область — это рендеринг орбит. Изначально я использовал встроенный в Unity Line Renderer, но он отрабатывал очень плохо, когда камера находилась на большом расстоянии от орбиты.

Что ж, время реализовать собственный вариант отрисовки орбит!

Как и в случае со звездами, лучше всего сравнивать изображения в полном размере

В конце этого месяца у меня возникло ощущение, словно я создал свой собственный игровой движок для симуляции полетов. Практически все было реализовано самостоятельно: генерация планет, орбитальные механики, сопротивление воздуха и гравитация, звездное небо и даже собственный способ отрисовки линий. Забавно, что я получаю около 80 FPS во время полета на моем компьютере (i5-4590 и GeForce 970), когда столько различных вычислений выполняются в реальном времени. И всего лишь 55 FPS в космическом центре, где не происходит ничего сложного. Просто набор объектов и источников освещения.

Настало время завершать этот апдейт. Я оставлю вам гиф, в котором вы можете увидеть результат моей месячной работы. Правда выглядит так просто? Но достичь этого результата было нелегко.

Замечание: гиф был записан при пятикратном ускорении времени

Авторский пост защищен лицензией CC BY 4.0 .

© unbeGames. Некоторые права защищены.

Популярные теги