Space Engine — Вселенная на ладони

:

My God, it's full of stars!
Arthur C. Clarke

Кто из нас в детстве не мечтал «бороздить просторы вселенной», как капитан Пикард, прогуливаться по неизведанным планетам далёких миров, встречать рассветы двойных или тройных звёзд, погружаться в атмосферы газовых гигантов, ронять корабли в чёрные дыры? И я тоже не исключение. Конечно, частично эту мечту воплощали книги, фильмы и «Элит»-ные игры. Но вся романтика в них разрушалась банальными купи-продай и «пиу-пиу» в «жидком» космосе на скоростях самолётов времён первой мировой войны. Да и тем немногим виртуальным миркам не хватало свободы, детальности и масштабов реальной вселенной.

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

Но вот, чуть больше года назад, я совершенно случайно наткнулся на вселенную Space Engine, и она просто взорвала мне мозг и размазала его по полу своим масштабом и невероятной детализацией.

Как всё это выглядит?


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

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

Да, это не скринсейвер «сквозь вселенную», тут каждую пролетающую звезду можно посетить, побродить по её планетам, их спутникам и астероидам.

Конечно, в Space Engine, как и в любом другом уважающем себя планетарии (например, недавно упомянутой Celestia), есть и отображение орбит космических тел и подробной информации по ним, и управление временем, и различные затмения (в том числе от планетарных колец), и возможность рендерить в проекции «рыбий глаз» для проекторов планетария. Но, самое главное то, что он не ограничен каталогами звёзд HIPPARCOS и галактик NGC/IC (которые тоже есть), а генерирует вообще всю обозримую вселенную со всеми типами объектов, что в ней можно встретить. Но при этом основывается исключительно на научных данных и актуальных теориях и моделях, что позволяет использовать Space Engine как полноценное (и безумно красивое) пособие по астрономии.

Тут можно своими глазами увидеть космического pac-man-а. Хотя на самом деле, это чёрная дыра с гравитационной линзой на фоне голубого сверхгиганта:

Встретить восход двойной звезды (встречаются даже восьмикратные звёзды):

Посетить соседние и не очень галактики, туманности, звёздные скопления. Узнать, как выглядят красные гиганты, нейтронные звёзды, и многое другое. Не буду сильно спойлерить, просто оставлю несколько картинок.

Кстати, как вы думаете, как будет выглядеть планета, которая всегда обращена одной из своих сторон к звезде? Знакомьтесь, приливно-синхронизированная (оказывается это так называется) пустыня. С одной стороны ночь и вечная мерзлота, с другой – выжженная звездой поверхность и огромный супер-циклон, который никогда не останавливается.

Так же как и в Celestia, к Space Engine можно скачать официальные дополнения с текстурами планет солнечной системы и некоторых их спутников в высоком разрешении. Так, например, базовая комплектация «весит» 500 МБ, а полный размер всех дополнений примерно 10 ГБ.

Чего еще не хватает?


К сожалению, еще много чего. Космос куда более разнообразен и удивителен, чем всё, что уже реализовано в Space Engine, но с каждой версией автор со всей тщательностью переносит в свою вселенную частичку настоящей. Например, на картинке с чёрной дырой и голубым гигантом для полного счастья не хватает аккреационного диска и джетов, которые пока в планах. Также пока в планах хвосты комет, квазары, отдельные камни в планетарных кольцах и десятки других деталей, которые сделают вселенную еще более полной, точной и красивой. Так что работы еще очень много.

Что ещё можно будет делать?


На данный момент программа представляет собой бесплатный интерактивный планетарий с зачатками космического симулятора (то есть летать на шаттле над поверхностями планет и ронять корабли в чёрные дыры можно уже сейчас).

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

Для того чтобы летать между планетами и звёздами, придётся вспомнить хотя бы основы астрономии, траектории небесных тел, что такое первая, вторая, третья космические скорости, характеристическая скорость, удельный импульс и прочие атрибуты реальных космических путешествий. Также придётся следить за расходом топлива и реактивной массы (да это потенциально разные вещи), чтобы не остаться «внезапно» в открытом космосе без возможности вернуться в обитаемые системы. Планируется и конструктор кораблей, как в Kerbal Space Program, с расчётами основных динамических характеристик, а также прочности и устойчивости конструкции. Единственное «фантастическое» допущение – гипер-привод, обеспечивающий сверхсветовые перелёты. Без него ММО будет невозможно.

Как всё это возможно?


Вселенная Space Engine создаётся практически одним человеком, нашим соотечественником из Питера, Владимиром Романюком ( SpaceEngineer). Он по образованию и профессии – астроном, так что в научной достоверности всех моделируемых объектов и процессов можно быть уверенным. Сообщество, сложившееся вокруг его программы, помогает поддерживать каталоги галактик, звёзд и экзопланет в актуальном состоянии, так как их открывают чуть ли ни каждый день. Также поклонники создают модели кораблей, шаттлов и прочие мелочи для наполнения вселенной.

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

Координаты

Одной из проблем было представление координат объектов в пределах вселенной. Кто плотно работал с числами с плавающей запятой, знает, как быстро они теряют точность с расстоянием от нуля. А точность в несколько килопарсек на краю вселенной – совсем не дело. Поэтому, для хранения координат используются 64-битные числа с фиксированной запятой, и иерархическое представление объектов. То есть координаты галактик описываются абсолютно, звёзд – относительно центра галактики, а планеты — относительно звезды. Конечно, при рендеринге приходится всё переводить в числа с плавающей запятой, но преобразование в координаты относительно камеры рассчитывается в целых числах. Да и сам рендеринг происходит слоями, так как никакой точности z-буфера не хватит для учёта размеров вселенной.
Звёзды и галактики

Вторая проблема – генерация звёзд и галактик. Звёзд в галактике сотни миллиардов, а значит для того чтобы их все отобразить, потребуется сгенерировать и отрендерить терабайты данных. Конечно, для реального времени это не подходит. Казалось бы, ну ладно, ограничим расстоянием до камеры и будем генерировать и рендерить звёзды только в небольшом объёме. Но тут возникает еще две проблемы. Во-первых, алгоритм должен быть детерминированным, то есть, несмотря на то, что звёзды создаются случайно, они должны появляться всегда на одном и том же месте. Иначе будет странно, если мы улетим от звезды, а потом на её месте будет пустота. Во-вторых, звёзды имеют разную яркость и видны на разных расстояниях. Тусклые коричневые карлики быстро пропадают из виду, а яркие голубые гиганты видны почти через всю галактику. Для решения обеих проблем используется октодерево (octree), узлы которого хранят сид для генерации нижележащих уровней, а так же предельную яркость звёзд в данной ячейке. При этом более яркие звёзды генерируются на более высоких уровнях иерархии, так как их значительно меньше, чем менее ярких. Таким образом, генерация звёзд становится абсолютно детерминированной и зависит лишь от сида корня дерева и текстуры распределения звёзд в галактике. А так же позволяет достаточно быстро генерировать звёзды с указанной предельной видимой яркостью (которая зависит от расстояния и абсолютной яркости) на любом расстоянии от камеры.

Технология рендеринга галактик и туманностей аналогична рендерингу объёмных облаков. То есть это набор спрайтов, которые для ускорения пререндерятся в импостеры или sky box, в зависимости от того, где мы находимся: внутри или снаружи.

Планеты

Принцип моделирования похож на MojoWorld. Его идеи подхватили многие проекты с процедурными планетами, например Outerra и Infinity. Как это работает? Берём обычный кубик, разбиваем каждую его грань на несколько сегментов, а затем сферизуем, то есть, как бы надуваем изнутри. Получается шар с топологией куба. Это позволяет использовать квадратные текстуры с максимальной эффективностью и минимальными искажениями.

Но равномерно разбить кубик на сегменты не достаточно. Так как планета большая и сгенерировать её с максимальной детализацией для полётов над поверхностью будет не возможно (потребуются опять же терабайты данных). На помощь приходят ЛОДы. Реализованы они следующим образом. Каждая грань куба — корень квадродерева (quad tree). Каждый узел дерева — квадрат с фиксированным разрешением сетки и текстуры. При необходимости (при приближении камеры), узел делится на четыре, тем самым увеличивая детализацию в два раза. И так до тех пор, пока в данной точке не будет достигнута требуемая детализация.

Карта высот и текстура для каждого узла дерева создаются полностью на GPU с использованием пиксельных шейдеров 3-й версии (поэтому запустить SE на видеокартах, которые их не поддерживают, не получится). Алгоритмы генерации замечательно описаны в книге от создателей MojoWorld — « Texturing and Modeling: A Procedural Approach». То есть это знакомые большинству шумы Перлина и Ворлея, а так же их вариации и различные способы фрактализации. Отдельным алгоритмом создаются крупные циклоны для приливно-синхронизованных планет.

Но, чисто процедурные ландшафты обычно выглядят слишком искусственно. Дело в том, что на планетах с атмосферой они подвергаются значительной эрозии, которая существенно меняет очертания гор и долин. К сожалению, классические итеративные алгоритмы эрозии довольно сложно масштабируются между ЛОДами, и на данный момент еще не реализованы. Но есть более простой (позиционный) способ имитации этого явления. Это особые виды шума, подробно описанные в статье. Если кратко, то для генерации ландшафта используется не только шум Перлина, но и его производная, которая позволяет построить градиент в каждой точке ландшафта и имитировать вымывание или, наоборот, наплывы грунта сдвигом координат базового шума по этому градиенту. Такой подход уже позволяет создавать довольно симпатичные планеты.

Для моделирования атмосферы используется метод Eric Bruneton-а, который был адаптирован для других планет с разным давлением и составом.

Вместо заключения


Уже сейчас Space Engine утыкает за пояс большинство планетариев и реалистичных космических симуляторов (Celestia, Stellarium, Orbiter) по богатству и красоте космоса. И это только начало пути. Если хотя бы половина из того, что планируется, будет реализовано, Space Engine станет самой полной моделью нашей вселенной, агрегирующей все современные знания человечества из области астрономии. И, не смотря на то, что код автор планирует оставить закрытым, каждый может внести свой посильный вклад в создание самого большого виртуального мира из ныне существующих.

PS: все благодарности автору программы SpaceEngineer. Думаю, он сможет ответить на некоторые вопросы по движку, если такие возникнут.

Ссылки