@synapse_people

Как генерировать нормальные реки при помощи Perlin noise?

Добрый день!
Подскажите, пожалуйста, есть такой код:
$e = $p->noise2D($x / 10, $y / 10);
if ($e < 0) {
imagesetpixel($image, $x, $y, $blue);
} else {
imagesetpixel($image, $x, $y, $green);
}

(p - объект класса Perlin (найден на гитхабе), $e - значение от -1 до 1. x,y - понятно что(в тесте от 0 до 700).
выдет такую картинку:
c0f9184a8b0a4b529476f3b21e140ca7.png
Хотелось бы узнать причину по которой появляются маленькие острова.. И какие есть варианты решения, чтобы их не было. Необходимо просто генерировать небольшие реки, не соединенные между собой(на фото - они соединены).. Чтобы не было участков, которые со всех сторон окружены водой. Как реализовать?
Также интересует причина - почему реки сгенерировались только на половине картинки??!
Для лучшего понимания, выкладываю тайлы, которые будут использованы для отображения карты:
10778918e9044eca8b53b949ee0819bf.png
Спасибо за ответы!
  • Вопрос задан
  • 415 просмотров
Пригласить эксперта
Ответы на вопрос 2
BasmanovDaniil
@BasmanovDaniil
Геймдизайнер-телепат
Популярный способ - это построить карту высот, выбрать одну из точек в горах в качестве источника, а потом с помощью поиска пути спуститься по карте высот вниз одновременно рисуя путь реки.
www-cs-students.stanford.edu/~amitp/game-programmi...
Ответ написан
@Nwton
Обязательно при помощи шума > Нет, не обязательно

1) Ставим точку в случайном месте поля. Это будет исток реки;
2) Теперь немного протянем реку. Для этого задействуем 2 параметра: длинна и направление. Определяем их случайным образом и по соответствующим блокам/точкам прокладываем прямую/кривую.
3) Далее мы можем создать разветвление реки, тупик, а можем повторить второй шаг. Определяем случайным образом.
4) Когда из-за множества разветвлений у нас несколько притоков, то перед повторением 3го шага, определяем случайным образом к концу какого из них мы его будем применять.
5) По ходу реализации поймешь, как сделать так, что бы притоки не пересекались и не создавали островки. А если захочешь, сможешь контролировать появление островков.

Генерируя реки/подземелья/лабиринты по схожему алгоритму, мы можем контролировать весь процесс возведения (расставляя ловушки, водопады, тупики, npc, определяя уровень запутанности), оставляя волю случаю.

Я не достаточно подробно описал алгоритм, но уверен, идею ты уловил.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы