Как создать пещеры, которые похожи на пещеры Майнкрафта?

34

Я работаю над трехмерным процедурным миром некоторое время и хочу начать добавлять пещерные системы. В настоящее время я использую 2D / 3D Perlin Noise для генерации ландшафта в сочетании с Marching Cubes для более гладкой местности. Я просто ошарашен, когда дело доходит до длинных соединяющих пещер.

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

Самая большая проблема для создания пещер, как я хочу, состоит в том, что я хочу создавать мир на лету. Мир в настоящее время генерируется чанком чанком, начиная с того места, где находится игрок, и генерирует его оттуда наружу. Я НЕ хотел бы генерировать мир, а затем выкапывать пещеры, используя блуждающий паттерн, клеточные автоматы и т. Д.

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

Хороший пример: введите описание изображения здесь

Mythics
источник
5
Взгляните сюда и прокрутите вниз.
Уильям Мариаджер
В течение последних 24 месяцев был опубликован журнал для разработчиков игр, в котором подробно обсуждается, как делать то, что вы пытаетесь сделать. Я бы попал на их сайт.
Джои Грин
@JoeyGreen Как называется журнал? Или у вас есть ссылка на их сайт?
Jumpnett
1
Это называется журнал разработчиков игр. gdmag.com . Вы можете получить подписку и получить PDF-версии журнала за последние 10 с лишним лет. Если вы зарегистрируетесь, то сможете найти предыдущие проблемы и найти нужную вам проблему.
Джои Грин

Ответы:

30

Пещеры Майнкрафта создаются методом "червей-перлинов". Генератор проникает через местность и пропускает туннель. Minecraft не использует шум 3d-перлина для генерации пещер, потому что он имеет тенденцию оставлять несвязанные карманы в ландшафте. Пещеры Майнкрафта не создавались из-за шума Перлина с очень ранних версий Альфы.

Вот пещеры в Gnomescroll, созданные с помощью метода "perlin worm".

Gnomescroll Cave System Вид от первого лица 1

Gnomescroll Cave System От первого лица Вид 2

Gnomescroll Cave System Вид от третьего лица 2

Это libnoise "Perlin Worms" из учебника по libnoise. Техника близко воспроизводит пещеры, созданные в Minecraft.

Linoise Tutorial Perlin Worms

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

Minecraft генерирует пещеры по частям. Требуемый подход сложен, и еще никто не имеет полностью реконструированного пещерного генератора Minecraft, несмотря на интерес со стороны моддеров серверов.

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

HaltingState
источник
3
Можете ли вы добавить некоторую информацию или ресурсы, чтобы узнать об этой вещи "perlin Worm"?
Дэвид Гувейя
1
Это учебное пособие по "перлин-червям" libnoise.sourceforge.net/examples/worms/index.html
HaltingState
Не обязательно, но если бы вы могли уточнить этот последний абзац, я был бы очень признателен. Чтобы создать червя, я бы предположил, что вам потребуется начальная точка для каждого червя, которая должна быть в пределах N кусков любого игрока, где N - максимальная длина червя.
Мифы
3
В точку. Каждый червь имеет начальную точку и заканчивается, если он выходит за пределы определенного радиуса чанка. Существует генератор случайных чисел, который детерминистически генерирует последовательность псевдослучайных чисел, которая является функцией координат фрагмента. Эти случайные числа определяют, где и сколько червей происходит в этом узле. Черви также могут ветвиться. Вычислительная нагрузка уменьшается, если черви более «локальны» и не могут рисковать больше, чем маленький радиус куска.
HaltingState
Может быть, не совсем то, что я хотел услышать, но то, что я ожидал. Еще раз спасибо HaltingState. :)
Мифы
7

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

Гаван Вулери
источник
Возможно, я просто не понимаю, что именно вы подразумеваете под этим, но как бы я делал это на кусочке на лету, когда мир порождает?
Мифы
Одним из возможных способов является создание минимального связующего дерева в каждом чанке отдельно, а затем подключение каждого чанка путем нахождения двух ближайших узлов между двумя чанками. После того, как блок заполнен вашим алгоритмом ландшафта по умолчанию, вы можете разложить его вокруг минимального остовного дерева.
Гаван Вулери
1
Другое (более простое) решение, хотя и менее эффективное и, вероятно, «более шумное», заключается в использовании броуновского движения для вырезания пути (вроде муравья, роющегося в случайном порядке).
Гаван Вулери
2

В апрельском выпуске журнала Game Developer Magazine об этом подробно рассказывается итеративные функции шума Перлина - см. Статью «Создатель миров», начиная со страницы 21.

quantumpotato
источник
Они показывают скриншоты для каждого шага (функции) и показывают изменения
Quantumpotato
1

Используйте функцию шума, чтобы назначить значения для каждого блока, чтобы определить, есть ли у него туннели или нет, и затем использовать их, чтобы решить, где разместить пещеры. Если вам нужны туннели, просто используйте больше шумовых функций (с разными начальными значениями) и используйте их значения, чтобы определить, существуют ли туннели. После этого используйте обычные функции «рисования» для создания туннелей. Чтобы сделать все более реалистичным, используйте больше шума, чтобы сделать случайное смещение для исходных точек указанных пещер / туннелей.

Если вы не хотите использовать несколько шумовых функций, вы можете исследовать на больших расстояниях, например, вместо noise3d (2,2,2) для фрагмента в (2,2,2) do noise3d (2,2, 16) и используйте (2,2,16) для одного значения, (2,2,17) для второго значения и т. Д. .... затем просто настройте свою частоту соответственно, чтобы сделать все значения независимыми или коррелированными на коротких масштабах.

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

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

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

Llamageddon
источник
-5

здесь

Хотя большинство пещер, таких как вышеупомянутые, используют червя Perlin , некоторые люди предпочли бы сделать это вручную. Таким образом, они могут сделать это так, как они хотят, чтобы он был точно блок за блоком. Пещера, созданная с помощью червя Perlin, может быть неточной и может сделать пещеру только 5 футов в высоту и 6 футов в ширину, это может быть неточно, так как вы можете захотеть ее 10 футов в высоту и 15 футов в ширину.

локлан смит
источник