Понимание трехмерного шума Перлина

Недавно я изучал процедурно сгенерированный ландшафт с использованием двумерного шума Перлина. Я использую чертежи Unreal Engine 4 в качестве прототипа, но скоро перейду на C ++.

У меня есть массив вершин, которые составляют двумерную плоскость. Я запускаю Perlin Noise для каждой вершины, чтобы получить случайное значение шума, а затем присваиваю его значению Z этой вершины. Это дало очень красивый ландшафт; но это всего лишь самолет. Нет никаких пещерных систем или чего-то подобного. Это вызвало у меня интерес.

Я немного исследовал 3D Perlin Noise, но я действительно не понимаю, как это работает. Функция 3D Perlin Noise принимает координаты X, Y и Z местоположения элемента и выводит значение. Но что делает это значение? 2D Perlin Noise присвоил значение третьему измерению, поэтому функция 3D присваивает его четвертому измерению? Как это значение на самом деле применяется к ландшафту?

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


person ShortStack    schedule 10.06.2019    source источник


Ответы (1)


Значения в трехмерном шуме Перлина сами по себе ничего не значат. Так же, как значение 2D шума Перлина ничего не «делает», вы можете интерпретировать его только как значение высоты.

Один из способов использования трехмерного шума Перлина под землей может заключаться в том, что любое значение, превышающее некоторый порог (например, 0.8), будет считаться «пустым».

Вот одна реализация случайного ландшафта 2d perlin + 3d perlin в воксельной системе (псевдокод)

bool IsVoxelEmpty(int x, int y, int z) 
{
    float flatPerlin = Get2DPerlin(x, z);
    float terrainHeight = perlinToHeight(flatPerlin)

    float thickPerlin = Get3DPerlin(x, y, z);
    float threshold = 0.8f;

    return (y > terrainHeight) || (thickPerlin > threshold);
}

Одним из недостатков использования чего-то подобного будет то, что на поверхности будет много «кратеров» и пещер. Вы можете изменить threshold так, чтобы он становился выше по мере приближения yPerlin к flatPerlin, чтобы количество отверстий на поверхности уменьшалось, а каверны обычно обнаруживались только после того, как вы пробили поверхность.

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

person Ruzihm    schedule 10.06.2019
comment
Вау, это многое прояснило, спасибо. Я изучу Perlin Worms. В качестве побочного вопроса, возможно ли сделать 2D Perlin Noise для верхнего ландшафта и сделать 3D Perlin Worms для подземелья? - person ShortStack; 11.06.2019
comment
@ShortStack Вы можете использовать 2D perlin, чтобы определить высоту поверхности, и 3D, чтобы определить, как размещены черви. Вам просто нужно убедиться, что на поверхности не появятся черви. Я не знаю, как работает алгоритм червя Perlin, но я ожидал, что это будет его легкая часть. - person Ruzihm; 11.06.2019