Как я начал собирать настоящую воксельную планету Марса в Unreal Engine
Я давно хотел попробовать сделать не просто очередную "песчаную карту", а что то ближе к настоящей планете: сферическую, с реальным рельефом, нормальным масштабом и возможность ездить по поверхности.
В какой-то момент полез смотреть реальные карты Луны и Марса - и всё завертелось.
Сначала были реальные карты
Началось всё довольно просто: я скачал настоящие планетарные датасеты и начал смотреть их в QGIS.
Первым делом я полез в Луну. Там очень быстро становится понятно, насколько безумно детализированы реальные планетарные карты: кратеры, моря, перепады высот, огромные мозаики, DEM-карты, файлы на несколько гигабайт.
Потом перешёл к Марсу.
В итоге у меня начала собираться такая база:
Файлы лежали уже не как "картинки для посмотреть", а как нормальная рабочая папка с планетарными данными:
Качал их через PowerShell скрипт, потому что руками таскать такие объёмы лень.
Размеры тоже не маленькие:
То есть это уже не история "нашёл jpeg Марса в интернете и натянул на сферу". Хотелось попробовать взять реальные данные и сделать из них игровую основу.
Проблема: настоящие карты слишком большие
Дальше начался обычный геймдев-реализм.
Настоящие карты - огромные. Их нельзя просто взять и бездумно засунуть в материал. Нужно думать в каком размере это вообще использовать: 16К, 32К, 64К, тайлы по 8k, отдельные heightmap и base color, что грузить целиком, что резать, что оставить на потом.
Для первых тестов я решил не пытаться сразу построить идеальную систему тайлинга всей планеты, а собрать рабочий прототип. Главное было понять: получиться ли вообще поднять сферическую планету на вокселях и заставить реальные данные выглядеть нормально в Unreal.
Перенос в Unreal и Voxel Plugin
Дальше началась часть с Unreal Engine и Voxel Plugin.
Идея была такая:
Первые версии выглядели максимально просто
На этом этапе у меня была по сути белая сферическая воксельная болванка. Уже с рельефом , кратерами и неровностями, но без нормального цвета, без атмосферы и без ощущения Марса.
И вот здесь сразу появилась первая большая проблема: рельеф.
Реальный рельеф не значит "сразу красиво"
Когда берёшь heightmap и просто подаёшь его в генератор, результат не становится автоматически правдоподобным.
Первые настройки высоты были слишком агрессивными. Горы и кратеры выглядели огромными, а поверхность местами больше напоминала сломанный астероид, чем Марс.
Пришлось уменьшать Height Scale, подгонять радиус планеты и искать баланс между двумя вещами:
Это оказалось одной из главных итераций. С орбиты хочется видеть красивый рельеф, но если переборщить, то на земле всё может превратиться в гигантские стены и холмы.
Цвет Марса
Следующий этап - глобальный цвет.
После подключения color map планета наконец перестала быть белой технической сферой. Но "Красный Марс" тоже не получился сразу.
Сначала всё было то слишком красным, то слишком плоским, то слишком пересвеченным. Пришлось отдельно подбирать:
На этом этапе планета уже начала быть похожей на что-то настоящее. Всё ещё грубо, всё ещё много технических артефактов, но ощущение "это просто тестовая сферы" начало пропадать.
Вид из космоса
Отдельна история - вид из космоса.
Тут быстро выяснилось, что мало просто сделать планету красивой. Нужно много чего настроить:
Некоторые версии были слишком тёмные. Некоторые - слишком молочные. Где-то атмосфера выглядела почти как земная, где-то марс становился слишком "игрушечным"
Самое сложное - найти баланс. С одной стороны, хочется красивую картинку с орбиты. С другой - это всё потом должно работать не только для скриншота, но и для игровой сцены.
Атмосфера и свет
На этом этапе я начал возиться со SkyAtmosphere, Directional Light, SkyLight и экспозицией.
Была проблема в том, что проект сейчас не использует Lumen GI. То есть никакого красивого динамического отражения света “из коробки” нет. Если не настроить заполнение теней вручную, всё очень быстро проваливается либо в чёрные силуэты, либо в пересвеченную пелену.
Пришлось отдельно разбираться, что за что отвечает:
В какой-то момент стало понятно, что SkyLight нужно ставить и настраивать с учётом масштаба сцены. Для маленькой тестовой карты это не так заметно, а на сферической планете позиция и capture начинают сильно влиять на результат.
Почему это пока не финал
Всё это ещё не финальная графика.
Есть видимые проблемы: местами заметна текстура, где-то рельеф всё ещё требует настройки, атмосфера будет дорабатываться, а часть скринов вообще сделана прямо из редактора Unreal с интерфейсом, debug-текстом и техническими артефактами.
Но мне нравится именно этот этап.
Потому что видно, как вся эта штука проходит путь:
И это уже начинает ощущаться не как “я сделал красную сферу”, а как основа для настоящего игрового мира.
Что дальше
В этом посте я специально не показываю то, что происходит на поверхности. Хотел сначала отдельно показать путь именно от реальных планетарных данных к воксельной планете.
В следующей итерации покажу уже более игровую часть:
Пока это небольшой сайд-проект и технический прототип, но мне очень нравится это направление. Воксели в таком масштабе дают приятное ощущение: планета перестаёт быть просто декорацией и постепенно становится поверхностью, с которой можно взаимодействовать.