Модификация шумовой функции для получения острых выступов - PullRequest
0 голосов
/ 25 января 2020

Создание процедурных трехмерных миров

Я работаю над созданием процедурных миров для игры в Unity3D. Мне удалось сформировать ландшафт с различными уровнями высоты с помощью нескольких функций перлин-шума.

Я выполняю выборку функций на основе координат X, Y каждой точки в блоке 16x16. Каждый кусок отображается без знания соседа.

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

Генерация скалы

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

Существуют ли какие-либо методы, которые могут сделать это проще?

Речное поколение

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

Любые ссылки на некоторые алгоритмы или некоторые общие понятия о том, как это можно сделать, будут высоко оценены.

1 Ответ

0 голосов
/ 30 января 2020

Выступы: Unity объединяет только 2D-шум, но вам действительно нужен 3D-шум для правильной генерации. Вы можете подумать об использовании трехмерного шума как о пересчете карты высот каждый раз, когда увеличивается вертикальная координата. Вместо noises(x, y) + const > z ? solid : air оно становится noises(x, y, z) + const > z ? solid : air. Иногда значение шума увеличивается немного быстрее, чем z, и приводит к вылету. Сравните с y, если y - ваша вертикальная координата. Возможно, вы захотите добавить дополнительный модификатор частоты для вертикальной координаты, чтобы вы могли изменять уровень выступов, чтобы получить правильный результат.

Что подводит меня к следующему: функция Unity "PerlinNoise" не очень хороша потому что он генерирует свой тезку (старый шум перлина), который может быть заметно выровнен по сетке (верх - это перлин). Обычно я бы использовал шум симплексного типа для более интересных распределенных объектов местности. Я собрал эти публичные c классы генераторов доменного шума , которые включают в себя 3D-функцию, у которой нет тех же проблем, что и у других "симплексных" 3D-функций. Используйте Noise3_XZBeforeY, если Y - ваша вертикальная координата, или используйте Noise3_XYBeforeZ, если Z - ваша вертикальная координата. Обратите внимание, что выходной диапазон равен [-1,1] вместо [0,1]. Чтобы напрямую заменить шум Unity, вы можете выполнить Noise(...)*0.5+0.5.

Генерация трехмерного шума в каждой точке, особенно в нескольких октавах, может быть медленной. Некоторые игры прибегают к использованию trilerp для уменьшения оценки шума, но я не думаю, что это выглядит очень хорошо . Лучше разумно кодировать и вычислять только те октавы шума, которые вам нужны для . Позвольте startingValue = const - z;, или y, если y - ваша вертикальная координата. Если вы генерируете изоповерхность (например, марширующие кубы), ландшафт может выглядеть немного иначе, чем вычисление каждой октавы, но каждая точка гарантированно будет правильным знаком (например, solid или воздух). Если вы генерируете блоки, местность будет точной.

Реки могут быть такими простыми или сложными, как вам бы хотелось. В очень простом случае вы можете модулировать ландшафт (или пороговое / начальное значение, если используется связанная техника эффективности), когда 2D-шум падает около нуля. Смотрите третий столбец в изображении сравнения шума. Он создает пути, но вы можете заметить, что они могут быть разделены только на четные числа. Вы можете смягчить это, генерируя три экземпляра шума и позволяя границам быть близкими, когда одно значение заменяется другим, как максимум трех. Вы также можете использовать сотовый шум F2-F1, искаженный симплексным шумом. Мне нравится брать трехмерный сотовый шум, и пусть третья координата будет выходом симплексного шума. Есть еще много 10 * реалистичных способов генерирования рек, в которые я не буду вдаваться. Я еще не изучил их все.

...