Master of Star Control
Старый 26.02.2015, 18:22   #1
Vasaka
Аватар для Vasaka
По умолчанию Генерация текстур планет как в Star Control 2

Генерация текстур планет как в 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. Если вы нашли и смогли исправить ошибку в коде или украсили рендер — пишите и предлагайте изменения автору

Последний раз редактировалось SLY; 27.08.2020 в 12:41..
Ответить с цитированием Вверх
Старый 26.02.2015, 18:57   #2
Malin
Аватар для Malin
По умолчанию Re: Генерация текстур планет как в игре Star Control 2

Какое элегантное решение! Я даже знаю какие планеты разламывались 100 раз, а какие 1000. Класс!
Ответить с цитированием Вверх
Старый 26.02.2015, 20:12   #3
SLY
Аватар для SLY
По умолчанию Re: Генерация текстур планет как в игре Star Control 2

Занятная статья! Васяка, может ты её тоже куда-нибудь сюда оформишь для истории? Типа как с ЛКИ. А то на хабре она быстро затеряется. А вещь интересная. К тому же тебе в проекте тоже может пригодиться.

Цитата:
Сообщение от Malin

Какое элегантное решение! Я даже знаю какие планеты разламывались 100 раз, а какие 1000. Класс!

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

Справедливости ради стоит отметить, что в игре есть планеты, поверхность которых формируется по другому алгоритму. Если я не ошибаюсь, конечно, а то, может быть, просто не признал. Луна Земли, например. Или ещё бывает такая бархатная поверхность...
Ответить с цитированием Вверх
Старый 26.02.2015, 20:18   #4
SLY
Аватар для SLY
По умолчанию Re: Генерация текстур планет как в игре Star Control 2


Цитата:
Сообщение от SLY

Если не ошибаюсь с 1000, как правило, радужные миры.

Вообще ошибаюсь. Все радужные миры вроде как с 1000. Но уж точно не наоборот. (т.е. все 1000 - не есть радужные миры)
Ответить с цитированием Вверх
Старый 26.02.2015, 20:50   #5
Vasaka
Аватар для Vasaka
По умолчанию Re: Генерация текстур планет как в игре Star Control 2


Цитата:

Занятная статья! Васяка, может ты её тоже куда-нибудь сюда оформишь для истории? Типа как с ЛКИ. А то на хабре она быстро затеряется. А вещь интересная. К тому же тебе в проекте тоже может пригодиться.

Предоставляю тебе полный доступ к шапке темы!
Может я бы и сам занялся этим, но сейчас очень-очень занят и очень-очень устал.
Ответить с цитированием Вверх
Старый 26.02.2015, 22:37   #6
Malin
Аватар для Malin
По умолчанию Re: Генерация текстур планет как в игре Star Control 2

Ещё некоторые текстуры с кратерами и цирками есть. Так что наверняка алгоритмов несколько. А вся Солнечная Система - отдельные текстуры.
Ответить с цитированием Вверх
Старый 27.02.2015, 13:09   #7
SLY
Аватар для SLY
По умолчанию Re: Генерация текстур планет как в игре Star Control 2


Цитата:
Сообщение от Vasaka

Предоставляю тебе полный доступ к шапке темы!
Может я бы и сам занялся этим, но сейчас очень-очень занят и очень-очень устал.

Ясно . Ну может быть как-нибудь. Тоже пока есть более приоритетные задачи по тому же UQM.
Ответить с цитированием Вверх
Старый 27.02.2015, 13:36   #8
Vasaka
Аватар для Vasaka
По умолчанию Re: Генерация текстур планет как в игре Star Control 2


Цитата:
Сообщение от SLY

Ясно .





Цитата:
Сообщение от SLY

Ну может быть как-нибудь. Тоже пока есть более приоритетные задачи по тому же UQM.

Хорошо.
Ответить с цитированием Вверх
Старый 27.08.2020, 12:36   #9
SLY
Аватар для SLY
По умолчанию Re: Генерация текстур планет как в Star Control 2

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

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

Метки
control, star, игре, как, генерация, планет, текстур

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
Быстрый переход

 
Наш любимый хостер - Majordomo.ru!
Текущее время: 18:33. Часовой пояс GMT +4.

 

Powered by vBulletin® Version 3.8.7 Перевод:zCarot
Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
Время генерации страницы 0.06261 секунды с 15 запросами