Як видалити плаваючу місцевість при створенні 3D-шуму Perlin?


10

В даний час я використовую 3D Perlin Noise для генерування випадкових місцевостей у поєднанні з маршируючими кубами.

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

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

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

Дякую за будь-яку допомогу, Міфіки

Відповіді:


9

Напевно, єдиний спосіб повністю позбутися плаваючої місцевості - перевірити на зв’язність. Залежно від розміру карти, це може бути варіантом. Ви можете зробити це, вибравши базову точку, як саме дно вашого світу. Потім переконайтесь, що всі ваші вокселі:

  1. Підключений до основи.
  2. Підключено до вокселя, який підключений до бази.

Ймовірно, починаючи з відомої точки з’єднання (як, наприклад, у нижній частині вашого світу), тоді робити ширину спочатку зв'язаних вокселів буде добре. Переконайтесь, що ви позначаєте вокселі як підключені під час руху. Ви можете зробити це за шматок.

Крім того, існують менш дорогі способи мінімізувати, але не повністю видалити плаваючу місцевість.

  • Градієнтне зміщення : ви можете змістити розміщення суцільних вокселів з градієнтом. Функція градієнта дещо різко впаде після того, як ви будете вище "рівня землі". У цій статті йдеться про використання градієнта та є деякі інші акуратні поради.

  • Висота карти шуму : Ви можете створювати шум , як висота карти замість цього. Це призведе до видалення навісів і печер, але ви можете імітувати ті, хто має додатковий віднімаючий шар шуму.

  • Менш галасливий шум : Використовуйте менше октав для шуму від місцевості та генеруйте віднімаючий шум, щоб отримати нависання та печери.


Ландшафт може бути з'єднаний лише через сусідній шматок, якщо звідти це перетин.
Лорен Печтел

@Loren: Хоча це прекрасно. Поки двигун дозволяє адресувати шматки за повним індексом, він буде працювати без проблем.
Філ

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

0

це може бути занадто пізно, щоб відповісти, але я починав зараз з цієї речі породження воксельних місцевостей, з Перлін Шумом і я знайшов спосіб створити місцевість без цих плаваючих шматочків. Я думаю, що це може вам допомогти. Отже, для створення місцевості я спочатку генерую мапу висоти, ніж читаю пікселі з цієї карти висоти. Тепер приходить цікава частина, я читаю значення "яскравості" (насправді це масштаб сірого) кожного пікселя на цій мапі висоти, і це дає мені висоту для цієї конкретної частини карти, щоб потім створити місцевість, я припускаю, що ця карта висоти мій рельєф переглядається зверху, тому якщо значення пікселя (відмічений до моєї місцевості "maxHeight") на цій висоті на мапі висоти, скажімо, 30, це означає, що в цій конкретній точці моєї місцевості я генерую лише 30 вокселів на осі y, і це дає мені місцевість без плаваючих частин. Якщо ви хочете печер тощо, ви можете застосувати ще один шум на оригіналі (під поверхнею), щоб створити ці печери. Сподіваюся, це працює для вас.


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