Как я сделал бесшовный переход в космос

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

В ролике представлена Земля в ее реальном масштабе, поэтому выход на орбиту не быстрый, можно смотреть в ускорении

Когда в декабре 2013 года анонсировали No Man’s Sky, бесшовный переход с поверхности планеты в открытый космос все еще казался диковинкой, несмотря на то, что уже был реализован в Kerbal Space Program, Space Engine, Star Citizen, а также в нескольких трехмерных астрономических или исследовательских программах, вроде Celestia или Proland. В наши дни игроков сложнее удивить подобным, более того наличие этой функции ожидают ото всех серьезных космических симуляторов.

Но насколько сложна реализация подобного перехода в космос? Этим вопросом я задался в 2018 году, когда начал разработку своего космического симулятора. Для тех, кому интересно чуть глубже изучить данный вопрос, я написал две статьи, об исследовании предметной области и техническую статью о том, как приступить к генерации планет. Здесь же я буду рассматривать, что конкретно требуется от игрового движка, чтобы эту функцию на нем можно было бы реализовать.

Рендеринг атмосферы и рассеяние света частицами

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

Атмосфера делает любую планету красивее
Атмосфера делает любую планету красивее
Хотя Луна красива и без нее
Хотя Луна красива и без нее
Но при этом размер планеты и ее масштаб почувствовать сложнее
Но при этом размер планеты и ее масштаб почувствовать сложнее

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

В данном случае станция летит над южной частью Тихого океана, то есть внизу Земли
В данном случае станция летит над южной частью Тихого океана, то есть внизу Земли

Генерация планеты с динамическим уровнем детализации

Отрисовать планету в виде сферы с наложенной на нее текстурой может абсолютно любая игра. Однако, если делать возможность посадки на нее без загрузок, нужно будет реализовывать генерацию поверхности на лету. Чем ближе игрок приближается к поверхности, тем более детализированной она должна быть. Чтобы компьютеры игроков не плавились от нагрузки, выдавая при этом 15 фпс и периодически вылетая на рабочий стол с ошибкой «out of memory», нужно генерировать и отрисовывать только ту часть планеты, которая в данный момент видна в камере. Соответственно в память загружается только необходимые данному участку ресурсы, в виде карт высот, текстур и объектов поверхности. Всего того, что находится вне камеры, не должно существовать. То есть игровой движок должен поддерживать стриминг ресурсов хоть в каком-то виде. Сами же алгоритмы генерации, динамического LOD и прочих вещей хорошо описаны в десятках научных работ, и после небольшого исследования поддадутся реализации большинству программистов со стажем работы в несколько лет.

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

Отсутствие фиксированной системы координат и статических объектов

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

В обычных играх загружается сцена tatuin.scene. На ней в координатах (x: 54.32, y: 0, z: 122) стоит здание академии. Когда бы вы не загрузили эту сцену, здание будет всегда там стоять, независимо от того, была ли реализована смена дня и ночи, или нет. Это статичность позволяет уже на стадии создания игрового билда рассчитать множество данных, которые можно будет использовать в игре для ускорения вычислений. Например, навигационную сетку, коллизии, глобальное освещение, occlusion culling и много еще чего.

В случае космического симулятора академия будет находиться по координатам 44°25′ с. ш. и 38°12′ в. д. Далее необходимо знать позицию планеты в звездной системе, и текущее время. Используя эти данные, мы можем рассчитать координаты здания на поверхности относительно центра планеты (с учетом текущего ее вращения). И далее преобразовать в координаты относительно игровой камеры. Только после этого здание можно отрисовать. Как можно понять из описания, координаты здания будут разными и зависеть от текущего времени. В результате количество расчетов, которые можно провести заранее сильно уменьшается. Все это придется считать в рантайме, отбирая ресурсы у геймплея или рендеринга.

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

Облака, которые неплохо работают в плоских сценах
Облака, которые неплохо работают в плоских сценах
Ломаются при попытке использовать их в космическом симуляторе
Ломаются при попытке использовать их в космическом симуляторе

Floating origin

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

Здесь сферу начинают двигать от центра координат в начале видео до 60 000 км в последних кадрах

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

И много чего еще

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

Цена разработки

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

Так что там со Старфилдом

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

Но есть одно но.

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

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

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

Спонсор этой статьи – игра «Rocket Science», доступная в Стиме. Спасибо за внимание.

Прощальный скриншот из страны багровых туч
Прощальный скриншот из страны багровых туч
598598
250 комментариев

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

80
Ответить
3
Ответить

Ещё не заценил игру и ожидаю типичную игру беседки. Но офигел, когда увидел, что ты можешь долететь до планеты сам и просто упереться в нее. Как вообще можно было такое сделать? Ну сделайте вы автоматически при подлёте на какую-то дальность от планеты, чтобы включался ролик приземления и ты приземлялся в основную точку планеты.

90
Ответить

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

99
Ответить

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

12
Ответить

В игре есть много моментов, где элементарные вещи сделать можно было лучше, но Беседке лень. Беседка 20 лет сидит в пещере и понимает, что такое нормальный геймдизайн.

8
Ответить