Galaxy Genome — Разработка #1 «Галактика»

Как игра выглядит сейчас
Как игра выглядит сейчас

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

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

Карта галактики
Карта галактики

Все предыдущие игры я начинал с генератора мира (подземелий, островов). Не мудрствуя, я решил пойти по такому же пути. Но на сколько большой должен быть мир? Должен ли он быть уникальным при каждой новой игре? У большинства космических игр, мир представляет собой несколько десятков звездных систем, отображенных поверх изображения галактики. Не очень то масштабно выглядит. А что если сделать нашу галактику в масштабе один к одному? С этими мыслями я отправился искать на просторах интернета базу всех известных звёздных систем. Найти ее оказалось не так трудно. Теперь в моем распоряжении были данные в json формате c 13.5 тысячами реально существующих звезд. Я нарисовал нашу галактику «Млечный путь», чтобы отображать ее на фоне звезд. Готовые картинки из интернета не подходили, так как на них были нарисованы тысячи ярких звезд, которые не имели ничего общего с реальным расположением существующих звезд.

Перед началом программирования сразу появился вопрос, как это все отображать. При ориентировании на 3D карте с такими масштабами на экране мобильного телефона возникли бы проблемы. Решено было делать 2D карту среза нашей галактики с отображением звезд, находящихся +-7 световых лет от плоскости диска галактики. Но что делать с остальными звездами? Их надо как то генерировать.

Распределения звезд из научных докладов, взятые за основу генератором галактики
Распределения звезд из научных докладов, взятые за основу генератором галактики

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

Распределение типов звезд в галактике
Распределение типов звезд в галактике

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

Кроме базовых типов звезд (, K,G и т.д.), пришлось прописывать и все их подтипы, т.к. они влияли на температуру светил, что в свою очередь сказывается на создание планет (выбор типа, поверхности и атмосферы). И тут мы подходим к созданию еще одного генератора.

Звездные системы
Звездные системы

Итак, я прописал все типы планет и вероятность их появления. При заходе в систему будет рассчитываться градиент температуры, в зависимости от удаленности звезды. Дальше выбираем случайны тип планеты и считаем пределы расстояний от звезды, где она может находиться, с учетом пределов температуры ее поверхности. А теперь самое интересное. Как создать текстуру поверхности?

Землеподобные и аммиачные планеты. Тут оказалось все довольно просто. В интернете много различных примеров генераторов поверхности. Велосипед я изобретать не стал, взял один из примеров и добавив туда градиент температур от одного полюса к другому (чтобы на полюсах были шапки, а засушливых местах появлялись пустыни), быстро получил рабочий вариант.

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

Текстура для каменистой планеты
Текстура для каменистой планеты

Я взял несколько таких картинок и сделал из них текстуру для Displacement шейдера. При создании поверхности я создавал картинку из шума Перлина и объединял ее с displacement-текстурой. Уже эту суммарную текстуру я и использовал при наложении шейдера на цветную текстуру (которая тоже создавалась шумом Перлина). Вот это уже выглядело более-менее реалистично. Да, таки образом у всех планет проглядываются совпадающие те или иные части поверхности, но в глаза это не сильно бросается, если не делать скриншоты и не выискивать специально.

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

Про черные дыры и нейтронки рассказывать особо нечего, с ними все просто. Тут displacement шейдер в первом случае и «стрельба» овалами с синусоидальным изменением угла во втором случае.

Результат генератора планет

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

п.с. над игрой Galaxy Genome я работаю уже в течении 1.5 лет, уделяя ей по часу-полтора в день, а иногда и выпадая из процесса на месяцы. За это время накопилось достаточно идей и материалов, о которых можно рассказать. Надеюсь текст получился не слишком скучным, его воспримут хорошо и будет смысл рассказывать дальше =)

2525
7 комментариев

По поводу землеподобных планет. Маленький лайфхак на будующте Их гораздо лучше и проще генерировать по моделе "расширяющейся земли" . 
Делишь на произволные сектора континентов 4-5-6 , делаешь между нимм воду и получаешь нормальные континенты .

2
Ответить

Возможно лучше, но явно не проще.
Да и что такое "нормальные" континенты? Это когда обязательно должны прослеживаться все разрывы? Но ведь это не так. А если на планете два целых больших континента по разным сторонам планет - это не нормальные континенты? Почему сценарий развития материков Земли должен быть единственным верным?
Мой генератор тоже создает разрывы континентов, но иначе. Я создаю несколько островов и добавляю их на карту. При наложении островов получаются разрывы, т.к. по краям острова идут высоты ниже уровня воды. Потом еще меняется уровень воды в зависимости от некоторых исходных и получаются планеты от практически водных, до почти засушенных. 

1
Ответить

Интересно, планеты в игре отличаются по размеру визуально? 

Вообще, дизайн твоей игры очень похож на StarSector именно в плане космоса и его отображения, это безумно круто!

1
Ответить

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

1
Ответить

Мне нравится. Классный подход к окружению.

Ответить

 За это время накопилось достаточно идей и материалов, о которых можно рассказать.Обязательно расскажите.

Ответить