Як я можу генерувати 2d навігаційну сітку в динамічному середовищі під час виконання?


9

Тому я зрозумів, як використовувати A * для пошуку шляху, і я в змозі використовувати його в сітці. Однак мій ігровий світ величезний, і у мене є багато ворогів, які рухаються до гравця, який є рухомою ціллю, тому сіткова система занадто повільна для пошуку шляху. Мені потрібно спростити графік вузла за допомогою навігаційної сітки.

Я розумію поняття "як" працює сітка (знаходження шляху через вузли на вершинах та / або центрах ребер многокутників).

У моїй грі використовуються динамічні перешкоди, які процедурно створюються під час виконання.

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

навігаційна сітка

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

Я використовую JavaScript у nodejs, якщо це має значення.


1
Динамічний розділ, який ви намагаєтеся реалізувати, залежатиме від особливостей елементів вашої карти. Чи ваші елементи перешкод повністю складаються із сітчастих прямокутників, як показано у вашому прикладі? Обертаються прямокутники? Неправильні багатокутники? Або неоднокутні форми з великою кількістю кривих? Чи є у вас точки / полі дані для форми перешкод? Якщо так, то дані форми у формі трикутників, прямокутників, виключно опуклих багатокутників або суміші опуклих і увігнутих багатокутників?
Matthew R

@Matthew Мій світ складається з опуклих багатокутних перешкод, без кривих і увігнутих багатокутників. Кожна перешкода зберігається як багатокутний об’єкт з вершинами, представленими векторними об'єктами.
Стівен

1
Для чого це варто, я працюю над рішенням, заснованим на цій роботі: gradworks.umi.com/3493710.pdf Якщо я досягну успіху, я опублікую своє рішення.
Стівен

1
навігаційна сітка не існує, щоб на 100% сказати, чи можете ви кудись поїхати чи ні, це лише основний контур прогулянкових областей, ви все ще повинні робити перевірки зіткнення щодо динамічних об’єктів, редагувати: майже все, що сказав Рей
дрета

@Stephen - Дивіться відповідь на довгий коментар .
Метью R

Відповіді:


3

@Stephen - Довгий коментар - Цей документ виглядає так, що, можливо, варто його прочитати, коли у мене є деякий час. В основному те, що я б запропонував, - це щось уздовж алгоритму Гертел-Мелхорн, який згадується у статті (посилання на цей конкретний алгоритм можна знайти тут http://www.bringyou.to/compgeom/ ) з додаванням підрозділення сторін карти (за межами межі ігрової зони) деяку кількість часу, щоб зменшити виникнення у кутах кількох маленьких трикутників. Ці маленькі трикутники можуть бути проблематичними, оскільки вони можуть бути меншими за те, що ви робите для пошуку шляху. Hertel-Mehlhorn призначений для скорочення полігонів, що утворюються трикутним перегородкою, якщо вас тут цікавить, більше стосується тріангуляції:http://www.personal.kent.edu/~rmuhamma/Compgeometry/MyCG/PolyPart/polyPartition.htm .

Крім того, якщо ви бажаєте не винаходити колесо, я думаю, що ця бібліотека дійсно виконає все необхідне: http://code.google.com/p/polypartition/ . Він виконує триангуляції та скорочення з одним із ряду різних варіантів, включаючи Гертел-Мельхорн. Це ліцензія MIT, що означає, що її можна використовувати для закритих джерел та комерційних проектів, якщо це проблема.

Якщо ви все-таки вирішите продовжувати працювати над власною реалізацією, я хотів би побачити, що ви придумали.


1
Чудова відповідь, @Mathew. І ви обов'язково повинні прочитати цей папір! Дотримуватися та пояснювати чудову техніку легко (особливо Додаток А, який говорить про відкриття / генерацію сітки на основі агентів). Я кодую версію цього алгоритму для JavaScript, і він добре поєднується. Я відправлю це як відповідь, коли це буде зроблено.
Стівен

@Stephen хотів би побачити цю роботу
kevzettler

@Stephen Я також шукаю версію javascript
Аполо

6

Замість сітки ви можете просто розглянути ієрархічний підхід A *. Найбільша перевага сітки - це спілкування з ігровими світами, які не вирівняні по сітці, а не у зменшенні складності з сітки.

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

Ієрархічний підхід дасть накази на кращу ефективність, тоді як сітка в кращому випадку лише надасть вам невелике лінійне вдосконалення.

Наївний підхід полягає в тому, щоб просто розділити ваш світ на X на більші шматки, вирівняні по сітці, генерувати інформацію про зв’язок між ними (наприклад, чи існує шлях між кусками 2x1 від 3x1 до 2x2, і яка відстань середнього шляху) .

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


1
Я повинен пояснити далі: Моя гра не вирівняна за сіткою. Я будував сітку в області розміром 800 x 600 пікселів, кожен піксель - це один пробіл у сітці (я все ще з'ясовував A *, тому про продуктивність цього ще не думав). У мене є перешкоди, не такі прості, як ті, які наведені у наведеному вище прикладі, я просто намагався проілюструвати проблему. Очевидно, таке ігрове поле потрібно було переглянути, і після деяких досліджень я думаю, що навігаційна сітка була б правильним шляхом.
Стівен

3

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

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

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