Простий і швидкий алгоритм генерації ландшафту

Простий і швидкий алгоритм генерації ландшафту +13

  • 10.01.17 11:22 •
  • Deathberry •
  • # 319226 •
  • Хабрахабр •
  • З пісочниці •
  • 38 •
  • 9200

- такий же як Forbes, тільки краще.

В якій ситуації зручний алгоритм

Алгоритм і результат

Перш ніж описувати сам алгоритм поділюся його результатами:

Простий і швидкий алгоритм генерації ландшафту


Алгоритм полягає в тому, що програма в випадкових координатах заповнює карту прямокутниками випадкового розміру. Карта має вигляд двомірного масиву, що представляє карту висот нашого ландшафту.

Для простоти створимо структуру прямокутника:


Змінні x1 і y1 - ліва нижня координата прямокутника, x2 і y2 - права верхня.

- Наша карта представлена ​​у вигляді масиву HM [mapsizex] [mapsizey];
- mapsizey і mapsizex - змінні, що визначають розмір вашої карти;
- genStep - змінна, що відповідає за кількість наших прямокутників;
- zscale - якийсь коефіцієнт розтягування карти в висоту. Можна замінити числом.
- recSizex і recSizey - межі розмірів прямокутника.

Тепер необхідно заповнити нашу карту прямокутниками:


Рельєф зі скріншота був отриманий значеннями:

genStep = 1024
zscale = 512
mapsizex і mapsizey = 128
recSize = 10
Далі ви виводите карту на екран будь-яким доступним вам способом. У моєму випадку - openGl + glfw.

Переваги та недоліки алгоритму

  • Простота і швидкість в написанні самого алгоритму
  • Швидкість виконання алгоритму

недоліки:
  • примітивність
  • При маленькому кроці заповнення карти ландшафт стає «квадратним»
  • Відсутня можливість розбивати ландшафт на біоми по ходу генерації карти висот

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

Бачив програму-скрінсейвер для DOS, що малює по точно таким же алгоритмом різнокольорову "плазму". Алгоритм, що складається в заповненні поля випадковими прямокутниками, був помітний при уповільненні роботи програми, наприклад, засобами DOSBox. Просто замість висоти алгоритм генерував порядковий номер відтінку з градієнтної палітри.

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

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

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

Якщо є необхідність зробити побудова - вирівнюємо шматок ландшафту, припустимо, 4х4 ігрових полігону і на ньому робимо наше побудова.

Бачив схожий алгоритм для
планет
за змістом те ж саме, тільки робиться довільними розрізами.

А взагалі всім, хто цікавиться ось ресурс. Тема знатна і багатюща, хоча і не проста.

Мені здається, що при малих кількостях кроків алгоритму, карта буде вже дуже квадратної, що, власне, і описано в мінусах. А при великих кількостях кроків - перша: тоді пропадає потреба у використанні алгоритму, якщо основний аргумент - швидкість; друге - як я розумію, висота буде накопичуватися в нижньому правому куті карти (максимальні значення x і y). Тобто клітини карти розташовані в цьому кутку будуть оброблятися частіше за інших.

Абсолютно вірно. Якщо, наприклад, метою є terrain на 4000х4000 полігонів - алгоритм затягнеться, ні про яку генерації в реальному часі для всієї ділянки вже можна і не говорити. Однак алгоритм добре підходить для сіток розмірами від 32х32 до 512х512.
Що відносно другої проблеми - на практиці даної проблеми при розмірах більше 32х32 не виникне. Якщо ж є необхідність залишити краю карти пологими можна обмежити площу, на якій генеруються квадрати.

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

Це все має в алгоритмі описуватися, так адже? Є у нас на ділянці дві гори, значить вистачить. А глибина озера не більше 25 одиниць. І щоб поля були, три штуки - мале, середнє і дуже середнє. А ось розташування вже рандомноє, інакше у вас просто отрисовка наперед визначеного ландшафту. Генерація невипадкових величин взагалі буває?