Генерация текстур планет как в Star Control 2

Вопросы, мысли, скандалы, интриги, расследования
Ответить
Аватара пользователя
Vasaka
MOSC Team
Сообщения: 3202
Регистрация: 24 янв 2011

Генерация текстур планет как в Star Control 2

Сообщение Vasaka »

Генерация текстур планет как в Star Control 2

Взято с Хабра, за что большое им спасибо. Оригинал статьи здесь
Автор: Максим Ганенко aka barabanus

Изображение


Возможно, кто-то помнит замечательную олдскульную космическую игру Star Control 2. В свое время меня поразила огромная звездная карта с неизведанными планетами, которые предстояло исследовать на фоне разворачивающейся глобальной катастрофы. С тех пор как авторами были опубликованы исходные коды, игра была портирована под новым именем The Ur-Quan Masters на большинство современных платформ.

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

Алгоритм

  1. Формируем карту высот с помощью алгоритма Fault Formation («формирование разломов»)
    .
  2. Раскрашиваем карту высот, используя опорные RGB цвета и градиент между ними

Формирование карты высот

  1. Создаем матрицу высот той же размерности, что и генерируемая текстура планеты. Север сверху, юг снизу, а горизонталь матрицы представляет собой круговую развертку планеты вдоль параллели. Значение высот может меняться только в пределах от 0 до 255, поэтому удобно отображать их оттенками серого цвета
    .
  2. Заполняем матрицу базовым значением высоты (base elevation), например, 128:

    Изображение
    .
  3. Генерируем две случайные непересекающиеся линии с севера на юг. Эти линии «формируют разлом» — делят поверхность планеты на две части, одну из которых мы поднимаем на фиксированную константу (elevation delta), а другую опускаем на эту же константу. Для наглядности пусть константа равна 10:
    .
    Изображение
    .
  4. Повторяем предыдущий пункт заданное количество раз (iterations num).
    На рисунках ниже: 10 итераций, 100 итераций, 1000 итераций:
    .
    Изображение
    Изображение
    Изображение
Раскрашивание карты высот RGB цветами

  1. Делим весь диапазон высот (от 0 до 255) на N более-менее равных частей с N + 1 опорными точками на границах этих частей
    .
  2. Задаем RGB цвет для каждой опорной точки диапазона
    .
  3. Вычисляем RGB цвет для всех промежуточных точек диапазона, линейно интерполируя компоненты цвета между опорными точками. Иными словами, заполняем значения высот градиентом между опорными цветами
    .
  4. Генерируем текстуру планеты, заменяя каждую ячейку матрицы высот на вычисленный в предыдущем пункте RGB цвет
Вот несколько возможных вариантов раскрашивания одной и той же карты высот:

Изображение
Изображение
Изображение


Программа

Для запуска программы необходимо установить Python 2.7 и несколько библиотек к нему: NumPy, PIL и PyOpenGL

Программу можно скачать из репозитория git: https://github.com/barabanus/starcontrol

Программа состоит из двух независимых скриптов: planet.py (генерирует текстуру), и space.py (рисует вращающуюся планету с наложенной текстурой).

Некоторые особенности управления:

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

Программа создавалась на MacOS, тестировалась на WinXP. Если вы нашли и смогли исправить ошибку в коде или украсили рендер — пишите и предлагайте изменения автору
Аватара пользователя
Malin
Сообщения: 1967
Регистрация: 28 май 2023

Генерация текстур планет как в Star Control 2

Сообщение Malin »

Какое элегантное решение! Я даже знаю какие планеты разламывались 100 раз, а какие 1000. Класс!
Аватара пользователя
SLY
Сообщения: 3345
Регистрация: 23 сен 2013

Генерация текстур планет как в Star Control 2

Сообщение SLY »

Занятная статья! Васяка, может ты её тоже куда-нибудь сюда оформишь для истории? Типа как с ЛКИ. А то на хабре она быстро затеряется. А вещь интересная. К тому же тебе в проекте тоже может пригодиться.
Malin писал(а): 26 фев 2015, 17:57Какое элегантное решение! Я даже знаю какие планеты разламывались 100 раз, а какие 1000. Класс!

Если не ошибаюсь с 1000, как правило, радужные миры. А 100 - разные бывают.. Но если поверхность фиолетовая, часто бывают экзотики :).

Справедливости ради стоит отметить, что в игре есть планеты, поверхность которых формируется по другому алгоритму. Если я не ошибаюсь, конечно, а то, может быть, просто не признал. Луна Земли, например. Или ещё бывает такая бархатная поверхность...
Аватара пользователя
SLY
Сообщения: 3345
Регистрация: 23 сен 2013

Генерация текстур планет как в Star Control 2

Сообщение SLY »

SLY писал(а): 26 фев 2015, 19:12Если не ошибаюсь с 1000, как правило, радужные миры.

Вообще ошибаюсь. Все радужные миры вроде как с 1000. Но уж точно не наоборот. :D (т.е. все 1000 - не есть радужные миры)
Аватара пользователя
Vasaka
MOSC Team
Сообщения: 3202
Регистрация: 24 янв 2011

Генерация текстур планет как в Star Control 2

Сообщение Vasaka »

Занятная статья! Васяка, может ты её тоже куда-нибудь сюда оформишь для истории? Типа как с ЛКИ. А то на хабре она быстро затеряется. А вещь интересная. К тому же тебе в проекте тоже может пригодиться.
Предоставляю тебе полный доступ к шапке темы! :D
Может я бы и сам занялся этим, но сейчас очень-очень занят и очень-очень устал.
Аватара пользователя
Malin
Сообщения: 1967
Регистрация: 28 май 2023

Генерация текстур планет как в Star Control 2

Сообщение Malin »

Ещё некоторые текстуры с кратерами и цирками есть. Так что наверняка алгоритмов несколько. А вся Солнечная Система - отдельные текстуры.
Аватара пользователя
SLY
Сообщения: 3345
Регистрация: 23 сен 2013

Генерация текстур планет как в Star Control 2

Сообщение SLY »

Vasaka писал(а): 26 фев 2015, 19:50Предоставляю тебе полный доступ к шапке темы! :D
Может я бы и сам занялся этим, но сейчас очень-очень занят и очень-очень устал.


Ясно :razz2:. Ну может быть как-нибудь. Тоже пока есть более приоритетные задачи по тому же UQM.
Аватара пользователя
Vasaka
MOSC Team
Сообщения: 3202
Регистрация: 24 янв 2011

Генерация текстур планет как в Star Control 2

Сообщение Vasaka »

SLY писал(а): 27 фев 2015, 12:09Ясно :razz2:.
:mosking:

SLY писал(а): 27 фев 2015, 12:09Ну может быть как-нибудь. Тоже пока есть более приоритетные задачи по тому же UQM.
:ok: Хорошо.
Аватара пользователя
SLY
Сообщения: 3345
Регистрация: 23 сен 2013

Генерация текстур планет как в Star Control 2

Сообщение SLY »

Перенёс статью с Хабра. До того в шапке только ссылка была.

Не так давно вспоминали эту статью, пока шло бурное обсуждение рогалик-версии Star Control II. Вот, наконец, дошли руки оформить.
Ответить