Как я начал собирать настоящую воксельную планету Марса в Unreal Engine

Как я начал собирать настоящую воксельную планету Марса в Unreal Engine

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

В какой-то момент полез смотреть реальные карты Луны и Марса - и всё завертелось.

Сначала были реальные карты

Началось всё довольно просто: я скачал настоящие планетарные датасеты и начал смотреть их в QGIS.

QGIS с лунной картой/кратерами
QGIS с лунной картой/кратерами

Первым делом я полез в Луну. Там очень быстро становится понятно, насколько безумно детализированы реальные планетарные карты: кратеры, моря, перепады высот, огромные мозаики, DEM-карты, файлы на несколько гигабайт.

Потом перешёл к Марсу.

В итоге у меня начала собираться такая база:

Moon: - Lunar LRO WAC Mosaic global 100m - Lunar LRO LOLA Global DEM 118m Mars: - Mars Viking MDIM color / global color map - Mars HRSC + MOLA blended DEM 200m

Файлы лежали уже не как "картинки для посмотреть", а как нормальная рабочая папка с планетарными данными:

N:\PlanetData\RealPlanetMaps\Moon\ N:\PlanetData\RealPlanetMaps\Mars\

Качал их через PowerShell скрипт, потому что руками таскать такие объёмы лень.

PowerShell со скачиванием датасетов
PowerShell со скачиванием датасетов

Размеры тоже не маленькие:

Moon WAC Mosaic - около 5.5 GB Moon LOLA DEM - около 8 GB Mars Viking color - около 12 GB Mars HRSC/MOLA DEM - около 11 GB

То есть это уже не история "нашёл jpeg Марса в интернете и натянул на сферу". Хотелось попробовать взять реальные данные и сделать из них игровую основу.

Проблема: настоящие карты слишком большие

Дальше начался обычный геймдев-реализм.

Настоящие карты - огромные. Их нельзя просто взять и бездумно засунуть в материал. Нужно думать в каком размере это вообще использовать: 16К, 32К, 64К, тайлы по 8k, отдельные heightmap и base color, что грузить целиком, что резать, что оставить на потом.

Большая карта Марса / цветная глобальная карта
Большая карта Марса / цветная глобальная карта

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

Перенос в Unreal и Voxel Plugin

Дальше началась часть с Unreal Engine и Voxel Plugin.

Идея была такая:

DEM / heightmap -> Voxel Graph -> форма планеты Color map -> материал / global color Radius + Height Scale -> подгон масштаба SkyAtmosphere + свет -> вид из космоса

Первые версии выглядели максимально просто

Первый прототип воксельного марса
Первый прототип воксельного марса

На этом этапе у меня была по сути белая сферическая воксельная болванка. Уже с рельефом , кратерами и неровностями, но без нормального цвета, без атмосферы и без ощущения Марса.

И вот здесь сразу появилась первая большая проблема: рельеф.

Реальный рельеф не значит "сразу красиво"

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

Первые настройки высоты были слишком агрессивными. Горы и кратеры выглядели огромными, а поверхность местами больше напоминала сломанный астероид, чем Марс.

Ранний прототип Марса
Ранний прототип Марса

Пришлось уменьшать Height Scale, подгонять радиус планеты и искать баланс между двумя вещами:

1. Чтобы рельеф был заметен из космоса. 2. Чтобы на поверхности он не выглядел как абсурдные горы

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

Цвет Марса

Следующий этап - глобальный цвет.

Первая красная версия Марса
Первая красная версия Марса

После подключения color map планета наконец перестала быть белой технической сферой. Но "Красный Марс" тоже не получился сразу.

Сначала всё было то слишком красным, то слишком плоским, то слишком пересвеченным. Пришлось отдельно подбирать:

- базовый цвет поверхности - силу глобальной текстуры - насыщенность - контраст - как цвет выглядит в свете и в тени - как он читается с разных расстояний
Марс крупным планом
Марс крупным планом

На этом этапе планета уже начала быть похожей на что-то настоящее. Всё ещё грубо, всё ещё много технических артефактов, но ощущение "это просто тестовая сферы" начало пропадать.

Вид из космоса

Отдельна история - вид из космоса.

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

- солнце - skybox - атмосферу - тени - свет - читаемость поверхности - общий вид и многочисленные тесты, доработки и переработки

Некоторые версии были слишком тёмные. Некоторые - слишком молочные. Где-то атмосфера выглядела почти как земная, где-то марс становился слишком "игрушечным"

Марс-полумесяц со звёздами и солнцем
Марс-полумесяц со звёздами и солнцем

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

Атмосфера и свет

На этом этапе я начал возиться со SkyAtmosphere, Directional Light, SkyLight и экспозицией.

Была проблема в том, что проект сейчас не использует Lumen GI. То есть никакого красивого динамического отражения света “из коробки” нет. Если не настроить заполнение теней вручную, всё очень быстро проваливается либо в чёрные силуэты, либо в пересвеченную пелену.

Темная сторона марса / ранний орбитальный свет
Темная сторона марса / ранний орбитальный свет

Пришлось отдельно разбираться, что за что отвечает:

Directional Light - солнце SkyAtmosphere - глобальная атмосфера и обод планеты SkyLight - мягкая подсветка теней Skybox - фон и звёзды Exposition - читаемость/видимость всей сцены

В какой-то момент стало понятно, что SkyLight нужно ставить и настраивать с учётом масштаба сцены. Для маленькой тестовой карты это не так заметно, а на сферической планете позиция и capture начинают сильно влиять на результат.

Почему это пока не финал

Всё это ещё не финальная графика.

Есть видимые проблемы: местами заметна текстура, где-то рельеф всё ещё требует настройки, атмосфера будет дорабатываться, а часть скринов вообще сделана прямо из редактора Unreal с интерфейсом, debug-текстом и техническими артефактами.

Но мне нравится именно этот этап.

Финальный на текущий момент орбитальный кадр Марса
Финальный на текущий момент орбитальный кадр Марса

Потому что видно, как вся эта штука проходит путь:

реальные карты -> QGIS -> огромные TIFF/DEM -> подготовка данных -> Voxel Graph -> белый шар -> цвет -> атмосфера -> планета

И это уже начинает ощущаться не как “я сделал красную сферу”, а как основа для настоящего игрового мира.

Что дальше

В этом посте я специально не показываю то, что происходит на поверхности. Хотел сначала отдельно показать путь именно от реальных планетарных данных к воксельной планете.

В следующей итерации покажу уже более игровую часть:

- как по поверхности ездит ровер; - как пришлось настраивать планетарную гравитацию; - почему обычная камера ломается на круглой планете; - как колёса вминают воксели; - как появляются следы на грунте; - как поверхность начинает реагировать на машину.

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

9
4