Як функція 3d шуму перліну використовується для створення місцевості?


20

Я можу обернути голову, використовуючи функцію шуму 2d перлін, щоб генерувати значення висоти, але я не розумію, для чого використовувалася б 3d-функція шуму перлин. У блозі Notch, http://notch.tumblr.com/post/3746989361/terrain-generation-part-1 , він згадав, що використовує функцію 3d шуму перлін для генерації рельєфу на Minecraft. Хтось знає, як це було б зробити і чому це було б корисно? Якщо ви передаєте значення x, y і z, це не означає, що ви вже маєте висоту?

Відповіді:


19

2D перліновий шум добре підходить для карт висоти, але в цьому випадку здається, що він не використовує карту висоти. Натомість у нього є 3D-сітка, де будь-яка комірка може бути порожньою. Це дозволяє робити печери та подібні утворення, де висота землі не є єдиним значенням для даного 2D-місця.


14

Замість вибірки "висоти землі" я розглядав значення шуму як "щільність", де все, що нижче 0, було б повітрям, і все, що перевищує або дорівнює 0, було б землею.

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

Можливо, є якась додаткова алхімія, щоб вирішити, який тип блоку створюється, і вирізати печери. Але я здогадуюсь, що це безпосередньо не пов’язано з цією функцією шуму.

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


8

3D-шум стає обов'язковим, якщо місцевість потребує печерних мереж та перекриттів.

Для вилучення ізоповерхні з інформації про щільність, найпопулярнішими методами є марширувальні кубики (MC) та новіший подвійний контур (DC). Необхідна структура даних сильно відрізняється залежно від обраного методу.

Як уже згадувалося раніше, стаття про GPU Gems 3 Geiss є дуже повчальною відправною точкою для розуміння та впровадження МС місцевості на GPU (зауважте, що його підхід MC повністю працює на GPU і вимагає принаймні SM4 - GS-сумісного).

Оскільки дані про щільність вокселів МС можуть залишатися лише на краях вокселів, класичний МС може контурировать гучність без збереження особливостей різких країв. DC не страждає від цього недоліку, оскільки інформація про щільність виражається у вигляді 3D-точки (QEF-мінімізатора), що лежить в будь-якому місці всередині вокселя плюс знак у кожному куті.

З іншого боку, MC не страждає від самопересічних граней, оскільки всі згенеровані трикутники укладені у відповідні вокселі, тоді як 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/

Підхід octree / voxel по суті є «зручним для CSG», що полегшує планування чіткої повністю «руйнівної» ігрової стратегії рівня гри, але якщо потрібно все це реалізувати в грі, глибина октрі також повинна бути фруктовою -залежний.

Якщо весь матеріал вписується в пам'ять або вірно передається, дані також можуть бути використані для надання АТ та обчислення фізики / зіткнень.


"3D-шум стає обов'язковим, якщо місцевість потребує печерних мереж та перекриттів". Обов’язково? Як в, це єдиний спосіб генерувати печери і нависання? Ні. Я створюю мапу висоти з 2D-перлінного шуму, а потім вирізаю печери і нависаю в неї як окремий крок, для більш природного вигляду. Не вводити в оману молодих розробників ігор, сказати, що це ТІЛЬКИЙ спосіб генерувати печери і нависання в світі, що створюється процедурою.
Домарій

5

Я припускаю, що в цьому конкретному прикладі є те, що він використовував значення z для визначення типу матеріалу: основи, каменю, бруду чи повітря.


-3

Minecraft використовує алгоритм маршируючих кубів для створення 3D-рельєфу. Я не маю на це посилання, пробачте. Я не впевнений, про що саме говорив Нотч, коли згадував функцію Perlin Noise - можливо, насіння для алгоритму маршируючих кубів. Більше інформації тут:

І чудова стаття про дорогоцінні камені GPU, якщо вам цікаво пройти кубиками:


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; Навіть із доданим вами уточненням це досить погана відповідь, вона чітко не пояснює мету фрагмента коду, ані його семантичний вплив на отримані дані, а також не стосується більшості питань, які насправді мав користувач.

Ive редагував код, а як тепер?
Максим DC

Це пояснює, як 3D-шум використовується для створення місцевості, на мою думку, це правильно
Максим

Потім поясніть це у своїй відповіді та зверніться до питань, які виникли у користувача. Інакше це відповідь мертвого коду.
Том «Блакитний» Піддок
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.