Как функция 3D-шума Перлина используется для создания рельефа?

20

Я могу обернуть голову, используя 2-мерную функцию перлин-шума, чтобы сгенерировать значение высоты, но я не понимаю, почему была бы использована 3d-функция перлин-шума. В блоге Нотча , http://notch.tumblr.com/post/3746989361/terrain-generation-part-1 , он упомянул использование функции шума 3d-перлина для генерации рельефа на Minecraft. Кто-нибудь знает, как это будет сделано и почему это будет полезно? Если вы передаете значения x, y и z, значит ли это, что у вас уже есть высота?

Ксавье
источник

Ответы:

19

Шум 2D-перлина хорош для карт высот, но в этом случае кажется, что он не использует карту высот. Вместо этого у него есть 3D-сетка, где любая клетка может быть пустой. Это позволяет использовать пещеры и такие формации, где высота земли не является единственным значением для данного 2D-местоположения.

msell
источник
14

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

Проще говоря, для каждого места, где может быть блок, оценивается шумовая функция, и, если она> 0, блок помещается. Функция шума Нотча искажается путем добавления высоты от уровня воды к его значению, поэтому нижние области в основном сплошные (высота большая отрицательная, поэтому высота + шум тоже отрицательные), а более высокие области в основном пусты (высота большая положительная, поэтому высота + шум тоже положительный).

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

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

Ничего
источник
8

3D-шум становится обязательным, если на местности требуются пещерные сети и выступы.

Чтобы извлечь изоповерхность из информации о плотности, 2 самых популярных метода - это Marching Cubes (MC) и более новый Dual Contouring (DC). Необходимая структура данных сильно отличается в зависимости от выбранного метода.

Как упоминалось ранее, статья Geiss Gem 3 по GPU - очень поучительная отправная точка для понимания и реализации ландшафтов MC на GPU (обратите внимание, что его подход MC полностью работает на GPU и требует как минимум SM4 - GS-совместимого).

Поскольку данные о плотности на вокселях MC могут оставаться только на краях вокселя, классический MC может очерчивать объем, не сохраняя при этом острых краев. DC не страдает этим недостатком, поскольку информация о плотности выражается в виде трехмерной точки (минимизатор QEF), лежащей в любом месте внутри вокселя плюс знак в каждом углу.

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

http://www.cs.wustl.edu/~taoju/research/interfree_paper_final.pdf

http://www.cs.berkeley.edu/~jrs/meshpapers/SchaeferWarren2.pdf

Этот сотрудник также предлагает более чистый подход, основанный на выпуклом / вогнутом анализе, чтобы избежать самопересечений. Он также использует лучшие правила разбиения четырехугольников, чтобы помочь сохранить ориентацию ребер:

http://www2.mae.cuhk.edu.hk/~cwang/pubs/TRIntersectionFreeDC.pdf

Классический MC также не является стандартным «без трещин» и может потребовать исправления трещин, если он работает на неограниченных октреях. DC не страдает от этого последнего вопроса.

Вот довольно хороший и полный обзор большинства методов извлечения сетки: http://www.cs.berkeley.edu/~jrs/mesh/

Подход с октавой / вокселем по своей сути «дружествен к CSG», что облегчает планирование аккуратной полностью «разрушаемой» стратегии уровня игры, но если нужно реализовать все это в игре, глубина октрея также должна быть усеченной. -зависимая.

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

окр
источник
«3D-шум становится обязательным, если местность нуждается в пещерных сетях и выступах». Обязательный? Как, в, это единственный способ генерировать пещеры и выступы? Нет. Я создаю карту высот из 2D-шума перлина, а затем делаю пещеры и выступы в нем как отдельный шаг для более естественного вида. Молодые начинающие разработчики игр вводят в заблуждение, говоря, что это ЕДИНСТВЕННЫЙ способ создания пещер и выступов в процедурном мире.
Домариус
5

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

тетрада
источник
-3

Minecraft использует алгоритм движущихся кубов для создания трехмерного ландшафта. У меня нет ссылки на это, извините. Я точно не знаю, о чем говорил Нотч, когда упомянул функцию шума Перлина - возможно, семя для алгоритма движущихся кубов. Больше информации здесь:

И отличная статья о GPU Gems, если вы заинтересованы в походных кубах:

Аарон Сносвелл
источник
2
Марширующие кубы - это алгоритм генерации сетки из скалярного поля. Это означает, что сначала нужно иметь данные, а затем генерировать сетку, чтобы соответствовать данным. Это не для генерации данных или местности.
MichaelHouse
-6
for (int x = 0; x < Width) 
{
  for (int y = 0; y < Depth) 
  {
    for (int z = 0; z < Height) 
    {
      if(z < Noise2D(x, y) * Height) 
      {
        Array[x][y][z] = Noise3D(x, y, z)
      } else {
        Array[x][y][z] = 0
      }
    } 
  } 
} 
Максим ДК
источник
2
-1; Даже с добавленным вами пояснением это довольно плохой ответ, он не дает четкого объяснения цели фрагмента кода и его семантического воздействия на полученные данные, а также не отвечает на большинство вопросов, которые фактически имел пользователь.
Я редактировал код, как насчет сейчас?
Максим DC
Это объясняет, как 3D-шум используется для создания рельефа, на мой взгляд, это правильно
Maxim DC
Затем объясните это в своем ответе и ответьте на вопросы пользователя. В противном случае это тупиковый ответ.
Том Блю Пиддок