ФТК СЮТ

Процедурная генерация ландшафта

03.05.2020Симаков Михаил3 просмотров

Всем привет! ? В ожидании грядущего обновления на сайте, а точнее в перерывах между его созданием, мне пришла новая идея. Думаю, многие из вас играли в увлекательную игру под названием Minecraft. Одна из интересных вещей в этой игре - это новый, случайно созданный мир со своими особенностями и недостатками. Вот пример одного из таких миров.

Но интересно, каким образом создаются такие миры?

Пошумим! (или создадим немного случайного шума)

Давайте попробуем сами сделать нечто подобное. Учитывая, что мир генерируется случайно, первое, что приходит на ум - это случайные числа. Действительно, если в каждой точке мира мы возьмём случайное число, как высоту, то что-то да получится!

Выглядит как-то не очень. Это больше похоже просто на шум, чем на какой-то мир. Тогда, давайте пробовать дальше!

Сглаживаем углы

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

Среднее арифметическое (1 картинка - 1 сглаживание, 2 - 2 сглаживания, 3 - 5 сглаживаний):

 

Среднее геометрическое (1 картинка - 2 сглаживания, 2 - 3 сглаживания):

 

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

Шум Перлина

Именно в этой задаче он приходит к нам на помощь. Как же он создаётся? Для начала мы возьмём случайный шум с разной степенью "детализации". Вот пример 4 шумов. (я взял их сразу, как местность, поэтому раскраска соответствующая)

   

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

По факту, это обычный шум, который "сглажен" определённым образом. Теперь, давайте объединим несколько таких шумов в один. И мы получим ** звуки барабанной дроби ** что-то более похожее на местность, чем было до этого!

Конечно, не совсем то, что получается в Minecraft, но уже что-то. Если поменять параметры, то, возможно, можно добиться и лучшего результата.

Что же дальше?

Уже сейчас мне на ум приходят различные варианты. Например, можно добавить температуру, созданную таким-же шумом, и менять окраску в зависимости от неё (например, где высокая температура, там пустыни). Также интересным образом реализуются реки (с помощью того же шума Перлина).

 

Интересные ссылки

** все оценки субъективные **

Пишите в комментариях, что ещё можно сделать интересного. Я этому буду очень рад и, скорее всего, сделаю (если это законно).

Python

Комментарии

Загружаем…

Войдите, чтобы оставить комментарий.

← Ко всем статьям