Я работаю над трехмерным процедурным миром некоторое время и хочу начать добавлять пещерные системы. В настоящее время я использую 2D / 3D Perlin Noise для генерации ландшафта в сочетании с Marching Cubes для более гладкой местности. Я просто ошарашен, когда дело доходит до длинных соединяющих пещер.
Я надеюсь получить что-то более похожее на пещерные системы Minecraft. Они кажутся очень связанными, разветвляются случайным образом практически в любом направлении, и почти любая точка в пещере будет иметь довольно круглую форму с довольно равным радиусом повсюду (не самая лучшая формулировка, но не совсем уверен, как это можно выразить) ,
Самая большая проблема для создания пещер, как я хочу, состоит в том, что я хочу создавать мир на лету. Мир в настоящее время генерируется чанком чанком, начиная с того места, где находится игрок, и генерирует его оттуда наружу. Я НЕ хотел бы генерировать мир, а затем выкапывать пещеры, используя блуждающий паттерн, клеточные автоматы и т. Д.
Есть ли хорошо известные алгоритмы, которые можно использовать для этого? Если так, кто-нибудь хочет поделиться, как они делают что-то подобное? Я был бы очень признателен за любую помощь.
Хороший пример:
источник
Ответы:
Пещеры Майнкрафта создаются методом "червей-перлинов". Генератор проникает через местность и пропускает туннель. Minecraft не использует шум 3d-перлина для генерации пещер, потому что он имеет тенденцию оставлять несвязанные карманы в ландшафте. Пещеры Майнкрафта не создавались из-за шума Перлина с очень ранних версий Альфы.
Вот пещеры в Gnomescroll, созданные с помощью метода "perlin worm".
Это libnoise "Perlin Worms" из учебника по libnoise. Техника близко воспроизводит пещеры, созданные в Minecraft.
Параметры извлечения влияют на качество системы пещер и определяют, насколько вертикальны пещеры и как быстро они меняют направление. Пещеры в шахте разветвляются, а радиус пещерного туннеля варьируется по длине пещер.
Minecraft генерирует пещеры по частям. Требуемый подход сложен, и еще никто не имеет полностью реконструированного пещерного генератора Minecraft, несмотря на интерес со стороны моддеров серверов.
Наиболее вероятный подход генерирует куски пещер-змей по частям, поскольку бесконечная карта генерируется и расширяется наружу. Пещеры на текущем чанке являются функциями начальных чисел пещер на ближайших N чанках для некоторого N. Используя генератор случайных чисел, который является функцией координат чанков, для начального заполнения пещер можно вычислить пещеры на текущем чанке для бесконечное отображение при оценке только фрагментов в пределах конечного радиуса фрагмента.
источник
Я бы сгенерировал облако точек внутри областей, где рельеф сплошной - вы можете экспериментировать с различной плотностью. Затем я бы использовал алгоритм, подобный минимальному остовному дереву, чтобы соединить все точки - это обеспечит достижимость каждой области. Затем просто нарисуйте большие полые (состоящие из воздуха) области от узла к узлу (то есть толстую линию вокселей).
источник
В апрельском выпуске журнала Game Developer Magazine об этом подробно рассказывается итеративные функции шума Перлина - см. Статью «Создатель миров», начиная со страницы 21.
источник
Используйте функцию шума, чтобы назначить значения для каждого блока, чтобы определить, есть ли у него туннели или нет, и затем использовать их, чтобы решить, где разместить пещеры. Если вам нужны туннели, просто используйте больше шумовых функций (с разными начальными значениями) и используйте их значения, чтобы определить, существуют ли туннели. После этого используйте обычные функции «рисования» для создания туннелей. Чтобы сделать все более реалистичным, используйте больше шума, чтобы сделать случайное смещение для исходных точек указанных пещер / туннелей.
Если вы не хотите использовать несколько шумовых функций, вы можете исследовать на больших расстояниях, например, вместо noise3d (2,2,2) для фрагмента в (2,2,2) do noise3d (2,2, 16) и используйте (2,2,16) для одного значения, (2,2,17) для второго значения и т. Д. .... затем просто настройте свою частоту соответственно, чтобы сделать все значения независимыми или коррелированными на коротких масштабах.
Чтобы изменить плотность пещер по всему миру, используйте другую, более низкую частоту, которая будет влиять на указанные значения.
В случае, если это приводит к грязным пещерам, просто увеличьте расстояние между указанными взаимосвязанными точками или настройте алгоритм иным образом.
Я не уверен, что Minecraft действительно делает пещеры подобными (хотя я думаю, что это так), но это решение должно дать удовлетворительные результаты.
источник
Хотя большинство пещер, таких как вышеупомянутые, используют червя Perlin , некоторые люди предпочли бы сделать это вручную. Таким образом, они могут сделать это так, как они хотят, чтобы он был точно блок за блоком. Пещера, созданная с помощью червя Perlin, может быть неточной и может сделать пещеру только 5 футов в высоту и 6 футов в ширину, это может быть неточно, так как вы можете захотеть ее 10 футов в высоту и 15 футов в ширину.
источник