Я недавно смотрел видео Себастьяна Лаге о моделировании эрозии, но его решение генерирует двумерную карту высот. В то же время я играл в Satisfactory, наслаждаясь красивой местностью, но эта местность была тщательно спроектирована вручную.
Можно ли процедурно создать такой разнообразный ландшафт? Я решил попробовать.
Скриншот красивого рельефа Satisfactory.
Первая попытка
Я хотел реализовать систему, способную генерировать нависающие скалы и пещеры, возможно, даже красивые арки из Satisfactory. Поэтому 2D-карты высот мне будет недостаточно.
Поэтому вместо этого я решил использовать трехмерную сетку, каждая ячейка которой представляет собой число от 0 до 1, обозначающее объем осадка в данном кубе.
После создания сетки результат следует визуализировать с помощью марширующих кубов.
Первый алгоритм был очень простым.
Кидаем «каплю дождя» в случайную точку местности.
Капля перемещается в соседнюю точку с наименьшим количеством осадка.
Вычтите часть материала.
Повторяйте до тех пор, пока капля не прекратится, затем начните следующую каплю.
Результат Алгоритма 1: недостатка в выступах как минимум нет.
В этом состоянии у алгоритма были некоторые проблемы.
Капли обычно падали слишком быстро, прорезая дыры внутри и оставляя поверхность слишком плоской.
Поскольку многие капли имели тенденцию следовать по одному и тому же пути, алгоритм имел тенденцию создавать неровную, неровную местность без гладких пространств, подходящих для игрового процесса.
Капли воды имели тенденцию повторять свои шаги по мере того, как осадок вычитался из их прежних позиций.
Алгоритм 2 Алгоритм 2 имеет множество незначительных улучшений.
Капля теперь завершила весь свой путь, прежде чем вычитать осадок из всех мест одновременно, чтобы не влиять на себя.
Капли дождя, полностью заключенные в рельеф, замедляются гораздо быстрее, чтобы не допустить образования длинных подземных трещин.
Вычитание осадков имеет меньшую зону действия для смягчения рельефа и притягивает другие капли с большего радиуса.
Однако самое большое отличие — это функция жесткости.
Каждая ячейка имеет сгенерированную твердость, рассчитанную с использованием симплексного шума.
Любое воздействие делится по уровню жесткости.
Это имитирует многие особенности реальной местности, созданные за счет различий в твердости разных типов горных пород. Мне пришлось немного поработать, чтобы сбалансировать эффект, чтобы результат не выглядел просто как функция шума, поскольку все мягкие породы «растворились», а все твердые остались.
Однако при значительно ослабленном влиянии это создает более интересный рельеф.
Я использовал функцию жесткости еще одним способом.
Чем глубже мы продвигаемся, тем тверже становится камень.
Это позволяет избежать слишком глубоких каньонов и ям на местности.
Теперь капли предпочитают двигаться более горизонтально.
Рельеф, созданный алгоритмом 2. Синяя линия — капля дождя.
Цвета указывают на разную твердость.
Изменения принесли свои плоды.
Теперь местность стала намного ровнее и ровнее.
Однако в то же время ему стало скучно.
Здесь больше нет никаких интересных особенностей, таких как пещеры.
Здесь нет крутых горных склонов.
Мы даже не можем ясно видеть путь воды.
Появилась пара мез, то есть проявляется 3D природа алгоритма.
Мне нужно найти баланс между реализмом и интересностью.
Другая проблема — большие дыры, образовавшиеся в центре местности.
Даже если твердость очень высока, в случае, когда многим каплям некуда двигаться, они постепенно углубят отверстие.
По краям картина совсем иная.
Из-за нового принципа вычитания с учетом радиуса края карт имеют тенденцию оставаться более приподнятыми, поскольку вокруг них меньше вокселей.
Когда капля пересекает край, она обычно вычитает больше изнутри, чем снаружи, создавая таким образом внутренний наклон.
В свою очередь, это предотвращает пересечение края другими каплями, что ухудшает эффект. Алгоритм 3 В этой версии изменен способ вычитания осадка, чтобы предотвратить образование асимметрии вокруг краев и отверстий.
Вместо вычитания в каждой точке пути эта версия пересчитывает последовательность точек как равноудаленные сегменты.
Это предотвращает влияние скорости падения на прорисовку пути.
В частности, когда капля «падает» при достижении края, она вычитает на всем своем пути от края до земли, что противодействует асимметричному вычитанию на краях.
Кроме того, я удвоил силу вычитания капель, если они достигают края.
Результат алгоритма 3, на этот раз цвет указывает на крутизну склонов.
В результате рельеф становится более крутым, но, что более важно, край становится самой низкой точкой, а не самой высокой точкой.
Окончательный алгоритм В итоге я изменил алгоритм вычитания так, чтобы капли воды, не достигшие края, вообще не выполняли вычитания после своей средней точки.
Кроме того, я добавил функцию «очистки», которая удаляет все полностью изолированные и плавающие рельефы.
Я также добавил деревья, цветы и траву, чтобы все выглядело немного интереснее:
Рельеф с деревьями и травой.
Алгоритм по-прежнему создает глубокие каньоны, но они обычно следуют по довольно реалистичному пути дренажа и имеют постепенный уклон вниз, чтобы обеспечить доступ к возвышенностям.
Это будет важно, если я буду использовать алгоритм в игре.
Арки создаются время от времени, но они вполне реалистичны.
Мне не удалось добиться того же уровня качества, что и Satisfactory, но оно достаточно близко.
Если вы хотите сами поэкспериментировать с кодом, вы можете найти его Здесь .
Дальнейшие дополнения Хотя я вполне доволен результатом, но если местность действительно будет использоваться в игре, потребуется дополнительная работа.
Мир сейчас очень тесен.
Вычислительные затраты возрастают до четвертой степени размера местности, поэтому в реальном времени мой компьютер может справиться только с сеткой 64 на 64. Однако для игрового мира этого будет слишком мало.
Возможно, есть способ создать рельеф из отдельных сегментов, а затем соединить их.
Вероятно, можно было бы сначала создать всю карту в очень низком разрешении, а затем повторить ее на более высоком уровне.
Основное преимущество Satisfactory заключается в том, что все отдельные биомы имеют радикально разную геометрию.
Требуются равнины, горы, острова, пустыни, болота и многое другое.
Следовательно, генератор должен быть настраиваемым, чтобы можно было генерировать множество уникальных типов местности.
Эти разные типы должны иметь возможность беспрепятственно соединяться.
Конечно, водоразделы и реки могут проходить по разным типам местности.
Несмотря на улучшения в 4-й версии алгоритма, края карты по-прежнему некрасивые.
В данный момент я моделирую край как отвесный утес бесконечной глубины, но разве это то, что нам нужно? Возможно, лучше представить это место как остров, окруженный океаном.
В этом случае вода не опустится ниже уровня моря.
Возможно, даже удастся смоделировать волновую эрозию, чтобы создать реалистичные береговые линии и лагуны.
Возможно, я поработаю над этими идеями в будущем, но не стесняйтесь экспериментировать самостоятельно.
Мне эта проблема показалась очень интересной, и я многому научился в процессе ее решения.
Кажется, что исследований в этой области на удивление мало, но я не думаю, что задача невыполнима.
Если несколько ярких умов продолжат придумывать новые идеи, процедурная генерация реалистичного ландшафта может оказаться не таким уж далёким будущим.
Теги: #Разработка игр #Работа с 3D-графикой #физическое моделирование #процедурная генерация #процедурная генерация уровней
-
Программное Обеспечение Для Шпионских Камер
19 Oct, 24 -
Исповедь Ios-Разработчика Из Google
19 Oct, 24 -
Кэшируйте Всегда, Кешируйте Везде!
19 Oct, 24 -
Тестирование: Руководство По Применению
19 Oct, 24 -
Умные Подсказки
19 Oct, 24