Как летают наши корабли?

Приветствую всех это читающих! o7

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

Как летают наши корабли?

Чего мы добивались?

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

Так мы считали каждый отдельный двигатель и каждую отдельную ось.
Так мы считали каждый отдельный двигатель и каждую отдельную ось.

Ранние наработки.

Самые первые мои симуляции, которыми я занимался ещё задолго до Verse, полностью воспроизводили поведение каждого отдельного двигателя ориентации и маховиков/гиродинов в отдельно взятом корабле. Как такое работает в реальности можно почитать например на хабре. Каждый двигатель на борту летательного аппарата использовал физический движок, независимо придавая ускорение общему жёсткому телу в соответствии со своей мощностью и расположением. В качестве основы тогда был использован Unity с его PhysX-ом, а позднее аналогичные системы воспроизводились в качестве испытаний на Unigine. Опыт был весьма интересным, но подходящим скорее для научного проекта, чем для игры.

Я надеялся больше никогда не поднимать старые проекты...

Причина простая - крайне сложная, нагруженная и плохо предсказуемая симуляция часто ломала геймплей, поддерживать это в рабочем состоянии при масштабировании было слишком трудно. Не говоря уже о проектировании каждого отдельного корабля - приходилось тратить множество часов и дней чтобы эти болванки могли адекватно летать. Работа системы всегда должна была сводиться к одному результату - удобству и положительному игровому опыту, который мог быть достигнут и меньшими ресурсами.

К чему пришли?

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

Оси перевернуты, потому что корабли стали вертикальными.
Оси перевернуты, потому что корабли стали вертикальными.

Со старта проекта Verse за основу был выбран уже Unreal Engine 5, по разным причинам, не связанным с обсуждаемой темой. Собственный физический движок Chaos не сильно отличался функционально от PhysX и в целом имеет аналогичные болячки. Нам потребовалось совместить поведение корабля в космосе и независимый контроллер персонажа с возможностью перемещаться внутри летящего объекта.

Что-то из ранних прототипов для Verse.

Проблема №1

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

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

Проблема №2

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

Корабль вернётся в исходное положение, когда достигнет лимита координат.

Частично Unreal Engine 5 решает это с помощью LWC (Large World Coordinates), так что мы можем использовать любые числа двойной точности (а это для справки примерно 1.7×10 в 308 степени) применительно к координатам объекта. Даже Shader Model 6 теперь включает поддержку таких чисел, что избавляет от большинства артефактов при рендеринге объектов на больших дистанциях. Но физические движки в этой гонке технологий пока что отстают. А если бы и смогли работать с такими числами, то за производительность вычислений я бы лично не стал ручаться. Поэтому мы всё ещё не имеем возможности отдалиться от начала координат сильнее чем на несколько десятков километров, при этом сохранив физику без заметных погрешностей.

<a href="https://api.dtf.ru/v2.8/redirect?to=https%3A%2F%2Fverseproject.online%2F&postId=2578763" rel="nofollow noreferrer noopener" target="_blank">Сюда</a> пока что не пускают ¯\_(ツ)_/¯
Сюда пока что не пускают ¯\_(ツ)_/¯

На помощь нам приходит аналогичная система, которая позволила избавиться от проблем с движением внутри корабля. В Verse мы разделили пространство на условные блоки (фреймы) и разработали свою систему ребейзинга координатной сетки (Origin Rebasing), вместо предлагаемой из коробки Unreal Engine, потому что хотели получить больший контроль. Но это тема для отдельной статьи. При очень быстром движении с космическими скоростями, корабль преодолевает заданное нами ограничение расстояния очень быстро, превышая его в несколько раз. Поэтому здесь мы тоже прибегаем к фиксации объекта и передаче управления окружающим пространством системе смещения координат.

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

Световые панели в окружении с симуляцией LED-эффекта.
Световые панели в окружении с симуляцией LED-эффекта.

На этом пока всё. Пишите письма. Ссылочки ниже.

Сайт в разработке: verseproject.online

Всем до скорых! Fly safe! o7

1616
8 комментариев

Комментарий недоступен

Ответить
Автор

Очень надеюсь что нет)

2
Ответить

Стар Ситизен, по ходу)

1
Ответить