Пещерное поколение с червями Perlin

12

В настоящее время я пытаюсь создать Minecraft-подобный ландшафт вокселей с 3D Simplex Noise, а также хочу реализовать пещеры.

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

Изменить: это проблема, которую я не знаю, как решить.

Edit2: это результат объединения 2D Ridged Multifractal Noise с картой высот Simplex Noise. Все еще нуждается в некоторой настройке, но это в значительной степени результат, который я хотел. Спасибо Byte56.

user000user
источник
Вы должны использовать прямые формулы для генерации местности, если это возможно. Если вы можете вычислить воксель только на основе его координат и без информации о соседних, куски больше не являются проблемой. Если вы хотите использовать черви perlin, которые, я думаю, не могут быть рассчитаны для каждого вокселя в отдельности, взгляните на последний абзац в принятом ответе на вопрос, который вы связали.
Данияр
1
По сути, это мой вопрос. Базовую местность легко вычислить, используя только заданные координаты, но я не знаю, как рассчитать, есть ли пещера или нет.
user000user

Ответы:

5

Большинство алгоритмов перлин-шума позволят вам получить значение шума в любом заданном месте, например noise(x,y,z). Это делает довольно простым создание шума на основе фрагментов. Все, что вам нужно сделать, это передать глобальную позицию вместо позиции чанка.

for(int i = 0; i < CHUNKMAX_X; i++)
    for(int j = 0; j < CHUNKMAX_Y; j++)
        for(int k = 0; k < CHUNKMAX_Z; k++)
            if(isSolid(perlinNoise.get(chunkPosition.x + i,
                                         chunkPosition.y + j,
                                         chunkPosition.z + k))
                thisChunk[i,j,k] = new Voxel(solid);
            else
                thisChunk[i,j,k] = new Voxel(air);

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

perlinNoise.getзанимает глобальную позицию и возвращает ее плотность. Где isSolidпросто будет простой тест, чтобы увидеть, является ли воксель "достаточно плотным", чтобы претендовать на твердое тело.

perlinNoise.getможет быть более сложным, чем простой алгоритм шума. Вы можете иметь чеки, основанные на глубине вокселя в вашем мире. Например, если воксел находится ниже того, что вы определили как «абсолютный базовый уровень земли», он может использовать алгоритм Perlin Worm для получения плотности, если он выше абсолютного базового уровня, он может использовать функцию нормальной плотности, чтобы дать вам более разнообразная местность. Однако я бы порекомендовал немного смешаться между ними.

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

MichaelHouse
источник
2
Спасибо за ответ. Однако я не знаю, как использовать «обычный» Perlin или Simplex Noise для создания червеобразных пещер. Они либо сферические, масштабированные в одном направлении, либо не очень длинные. Что касается алгоритма Perlin Worms, я не знаю, как определить, находится ли текущая позиция внутри червя, не зная положения головы.
user000user
1
Алгоритм червей не полагается на знание «положения головы». Из того, что вы говорите, похоже, ваша проблема не в том, чтобы генерировать шум по частям. На вопрос, который вы связали для реализации червей perlin, есть учебники. Как генерировать «обычный» рельеф можно узнать здесь .
MichaelHouse
Базовая генерация рельефа с помощью 3D Simplex Noise работает нормально, но я не знаю, как определить положение / сегмент червяков в чанке. Из того, что я понял, вы определяете червя положение головы и n сегментов и вычисляете угол между сегментами с помощью функции шума. Вот изображение, которое может лучше объяснить, в чем моя проблема: ссылка .
user000user
2
Существуют разные виды шума. Используя положение головы и следуя из этого, есть один метод. Если вы посмотрите внизу этой страницы , вы найдете какой-то шум, который создает тот шум, который вы хотите, не требуя сначала положения головы.
MichaelHouse
Спасибо за подсказку. Я реализовал 3D Ridged Multifractal Noise, но результат с ним был довольно неудовлетворительным. Я попытаюсь объединить его в 2D с 2D-картой высот, а затем сообщу снова. Это может создать больше червеобразных пещер.
user000user
3

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

Том Даллинг
источник