107

TerraPath #2

Кратко о содержании сегодняшнего поста:
Шум Перлина и его применение для генерации мира.

Небольшой спойлер того, как выглядит генерация сейчас.
Это область 800*600 тайлов(1 пиксель равен 1 тайлу).
Игрок появляется по центру. Технически мир генерируется до 2 147 483 647 тайлов во все стороны, а дальше зацикливается. При таких масштабах можно сказать, что мир бесконечен.
В финальной же версии планеты будут намного меньше, и их можно будет обойти за адекватное время.

Ну а теперь о том, как же получить такую генерацию. Мы будем использовать фрактальный шум Перлина.

Краткий обзор что такое шум перлина (из вики):

Perlin noise (Шум Перлина, также иногда Классический шум Перлина) — математический алгоритм по генерированию процедурной текстуры псевдо-случайным методом. Используется в компьютерной графике для увеличения реализма или графической сложности поверхности геометрических объектов. Также может использоваться для генерации эффектов дыма, тумана и т.д.

и генерации карт.


На хабре есть хорошая статья по реализации данного шума:

https://habrahabr.ru/post/265775/

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


В конечном итоге мы будем получать такие вот картинки.

Для обычного шума:

Пока не очень похоже на первую картинку, не правда ли?
Добавим немного фрактальности:

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

Значение шума лежит в пределах от -1 до 1.
Но мы переведем его в [0, 1].
Тем самым мы сможем задавать уровни дробными числами.

Все значения ниже 0.40 мы отмечаем как глубокую воду, а все значения ниже 0.45 - как мелководье.

Всё что < 0.47 - это песок.
Уже выглядит интереснее?

А всё, что осталось, отмечаем как трава.

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

Здесь еще нет деревьев, пещер и руд. Но выглядит это уже очень интересно.
Можно еще положить небольшой бонус в виде вишенки на торт: снежные шапки на горах.

Что мы имеем в итоге?
Практически бесконечную карту с интересным рельефом, которая, к тому же, может быть легко воспроизведена у другого игрока.

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

А на этом всё, спасибо, что дочитали.
Также не пропустите прошлые посты:

https://pikabu.ru/story/terrapath_0_5274718
https://pikabu.ru/story/terrapath_1_5276109

Ссылка на группу в вк:

https://vk.com/terrapath


Небольшой бонус:

Правила сообщества

ОБЩИЕ ПРАВИЛА:

- Уважайте чужой труд и используйте конструктивную критику

- Не занимайтесь саморекламой, пишите качественные и интересные посты

- Никакой политики


СТОИТ ПУБЛИКОВАТЬ:

- Посты о Вашей игре с историей её разработки и описанием полученного опыта

- Обучающие материалы, туториалы

- Интервью с опытными разработчиками

- Анонсы бесплатных мероприятий для разработчиков и истории их посещения;
- Ваши работы, если Вы художник/композитор и хотите поделиться ими на безвозмездной основе

НЕ СТОИТ ПУБЛИКОВАТЬ:

- Посты, содержащие только вопрос или просьбу помочь
- Посты, содержащие только идею игры

- Посты, единственная цель которых - набор команды для разработки игры

- Посты, не относящиеся к тематике сообщества

Подобные посты по решению администрации могут быть перемещены из сообщества в общую ленту.

ЗАПРЕЩЕНО:

- Публиковать бессодержательные посты с рекламой Вашего проекта (см. следующий пункт), а также все прочие посты, содержащие рекламу/рекламные интеграции

- Выдавать чужой труд за свой

Подобные посты будут перемещены из сообщества в общую ленту, а их авторы по решению администрации могут быть внесены в игнор-лист сообщества.


О РАЗМЕЩЕНИИ ССЫЛОК:

Ссылка на сторонний ресурс, связанный с игрой, допускается только при следующих условиях:

- Пост должен быть содержательным и интересным для пользователей, нести пользу для сообщества

- Ссылка должна размещаться непосредственно в начале или конце поста и только один раз

- Cсылка размещается в формате: "Страница игры в Steam: URL"

2
Автор поста оценил этот комментарий

Вы можете во время генерации использовать полноценные трехмерные объекты, а потом уже приводить их в 2D.
Большие горы и глобальные перепады высот нужны как раз для того, что бы избавиться от "болота": без них не понятно, куда течь рекам, а случайно направленные реки будут очень резать глаз.
Посмотрите на реальные карты местности: если вы видите много озер в одном месте вы сразу же понимаете, что на самом деле между ними не полноценные горы, а небольшие холмы.

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Спасибо, посмотрим что можно будет сделать.

6
Автор поста оценил этот комментарий

Как-то делал свой велосипед, с рельефом через шум Перлина(см. скрины). Основная его проблема, как мне показалось, в том, что это все-таки шум и все выглядит скучно и одинаково. Летаешь над такой поверхностью, ну да горы/озера, но все гладко, глазу зацепиться не за что, кажется что одно и то же повторяется, хоть это и не так.

Более интересные результаты дает Diamond-Square (https://habrahabr.ru/post/111538/), но чтобы была прям конфетка, надо это все комбинировать и моделировать эрозию чтобы были реки, долины, обрывы, острые пики у гор. Вот тогда прям все по-настоящему выходит :)

Иллюстрация к комментарию
Иллюстрация к комментарию
раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Согласен. Генератор будет улучшен в более поздних версиях.
Про Diamond-Square слышал, возможно потом перепишу генератор на него.

Забавно, но первый скрин напомнил мне мою выживалку:
(игра про выживание на острове и генератор выдал мне остров в виде рыбы хД)

Иллюстрация к комментарию
1
Автор поста оценил этот комментарий

Чем-то Майнкрафт напомнило, там случаем не тот же алгоритм?

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Только в альфе. А потом его заменили на фрактальный. Что сейчас там используется не знаю. Но ландшафты стали намного круче.
Я свой генератор тоже буду улучшать.

показать ответы
1
Автор поста оценил этот комментарий
А генерация руд по какому принципу происходит?
раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Всё тот же шум перлина, но с другими параметрами.
Расскажу об этом в ближайших постах.

1
Автор поста оценил этот комментарий

Вопрос, а как реализована бесконечная генерация?
Первое что приходит в голову, условие, что если игрок у края карты, то сгенерировать у этого края еще один квадрат карты... А как тогда сопоставлять данные шумы, чтобы не было стыков?

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Вы правильно мыслите. Генерация ложится на клетки в чанках(области 16*16 клеток).

Генератор работает так, мы можем запросить у него значение в клетке [x, y] и он его подсчитает.

При генерации мы можем зациклить создание шума от одного края к другому, что даст плавный переход и стыка просто не будет видно.
Допустим у нас мир 100*100 клеток.
Для генерации клетки[100, 100] нужно значение окружающих её клеток. Но т.к. некоторые клетки выходят за пределы мира, мы просто зацикливаем их к другому концу карты.
И в итоге получаем зацикленную карту.

Иллюстрация к комментарию
1
Автор поста оценил этот комментарий

что за движок?

выглядит действительно круто.

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Свой велосипед :)
Сделал на нём уже две игры.
Найти их можно в стиме если вбить мой ник в качестве разработчика.

3
Автор поста оценил этот комментарий

2) рельеф должен иметь более серьезные различия по высоте, но просто увеличить масштаб шума не получится, т.к. это просто сделает слишком большими градиенты перепадов высот. Поэтому лучше сначала задать более масштабный рельеф на уровне "регионов", а потом на него нанести более локальный рельеф.
3,4) Попробуйте написать простейшие алгоритмы симуляции эрозии почвы: заполняете все локальные минимумы водой до тех пор, пока не найдете "слабое место" - место в озере, откуда в реальной природе начнет вытекать река. Дальше оттуда по градиенту вниз рисуете ручей, он впадет в другое озеро. Затем запускаете итерационный  алгоритм: там где есть ручей пиксели по его руслу немного понижаете. Так у вас получится система озер, соединенных реками. Это будет выглядеть более естественно

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

2) У меня же двухмерная игра. Это будет сложно отобразить высоту имея только слои: пол, стены.
Или вы хотите чтобы я использовал это в качестве основы, ну чтобы были большие.. нет даже не так ОГРОМНЫЕ горы, равнины, леса и тд?
3) Если у вас есть интересные статьи на эту тему я с радостью их почитаю. Заранее спасибо!

показать ответы
1
Автор поста оценил этот комментарий

В Factorio он тоже используется, параметры генератора карты напрямую влияют на характеристики шума

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

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

1
Автор поста оценил этот комментарий

Интересная система генерации. Глянув на картинку с "фрактальным шумом", сразу вспомнил рендер-эффект из фотошопа, под названием "Сlouds". Думаю, это он и есть :)

Иллюстрация к комментарию
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Да :)

1
Автор поста оценил этот комментарий
Везде у этих шумов есть один большой недостаток - рваные края. Лечится довольно просто: накладываем размытие на пиксельный уровень
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Могли бы вы уточнить про какие рваные края идет речь?

показать ответы
4
Доктор Осом
Автор поста оценил этот комментарий
Едрииииить. Кого я вижу.

Давненько тебя не видел, как поживаешь, крафтор? :)

Для генерации суши и воды, надо делать более сложный алгоритм, делать именно подобие континетов и не абы каких, а именно таких, какие бы создала реальная тектоника и эрозия.
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Привет. Неплохо :)
Недавно релизнул новую игру в стим. Отпиши где угодно в личку, я тебе ключ дам.
Там кстати тоже очень вкусный генератор. Только собирает он подземелья.
А ты как?

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

5
Автор поста оценил этот комментарий

Интересные, но для сколько нибудь реального применения нужно еще копать и копать.
1) "Как есть" эта штука применима только для реализации болот.
2) Я бы попробовать сделать 2 шума с разным масштабом, один должен задавать более глобальные неровности, другой - локальные
3) Заполнение водой нужно делать более сложными алгоритмами, учитывающими неровности
4) На карте нет рек, это очень сильно бросается в глаза, именно из-за этого ощущение болота

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Генерация не финальная.
1) Абсолютно верно. Ландшафт в целом однообразен. Его надо разбавлять биомами.
2) Чтобы сгладить края?
3, 4) Конечно, реки будут.

показать ответы
1
DELETED
Автор поста оценил этот комментарий

Именно . Самое интригующие, что вопрос ещё открыт, хотя обещают ещё с начала 2016 года .

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

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

1
DELETED
Автор поста оценил этот комментарий

К слову, Empyrion - Galactic Survival тоже использует Шум Перлина для генерации поверхности планет . Уже какое-то время слежу за игрой, после того как они пообещали решить проблему с "полюсами" сферы.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Шум Перлина - мощная вещь!
А что у них было с полюсами, я так понимаю проблема была в том что полюсы стягивают сферу и там сложно размещать чанки?

показать ответы

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества