Печерна генерація з черв’яками Перліна


12

На даний момент я намагаюся створити Minecraft, наприклад, воксельний рельєф з 3D Simplex Noise, а також хочу реалізувати печери.

Я знайшов метод Перліна Черв'яків у цій нитці, який дає дуже гарні результати. Однак у мене немає поняття, як генерувати це на шматках за допомогою шматка. Чи можливо це чи є альтернативи, які виробляють подібного хробака, як печера на шматках?

Редагувати: Це проблема, яку я не знаю, як вирішити.

Edit2: Це результат поєднання двовимірного Ridged мультифрактального шуму з симплекс-схемою висоти шуму. Все ще потрібне певне налаштування, але це в значній мірі результат, якого я хотів. Завдяки Byte56.


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

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


2
Дякую за відповідь. Однак я не знаю, як використовувати "звичайний" Perlin чи Simplex шум для створення черв'якових печер. Вони або сферичні, масштабовані в одну сторону, або не дуже довгі. А для алгоритму Перліна Черв'яків я не знаю, як визначити, чи є поточне положення всередині черв'яка, не знаючи положення голови.
user000user

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

Основна генерація ландшафту з 3D Simplex шумом працює чудово, але я не знаю, як визначити положення / сегмент черв'яків всередині шматка. З того, що я зрозумів, ви даєте черв'яку положення голови і n сегментів і обчислюєте кут між сегментами за допомогою функції шуму. Ось зображення, яке може краще пояснити, у чому полягає моя проблема: посилання .
user000user

2
Існують різні типи шуму. Використовуючи положення голови та слідуючи за ним, існує один метод. Якщо ви придивитесь до нижньої частини цієї сторінки , ви знайдете шум, який створює потрібний шум, не потребуючи попереднього положення голови.
MichaelHouse

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

3

Я думаю, саме так це працює в Minecraft. Кожен черв’як має максимальну довжину (назвемо його так M). Головки кожного черв’яка розраховуються виходячи з положення шматка. Коли ви робите кожен шматок, ви повинні перевірити всі шматки в Mрадіусі та дотримуватися всіх їх червів. Це не ідеально з точки зору продуктивності, але це працює.

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