Выступы: 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 * реалистичных способов генерирования рек, в которые я не буду вдаваться. Я еще не изучил их все.