Як можна створити навігаційну сітку для 3D-світу?


11

Я намагаюся знайти рішення цієї проблеми. Я намагаюся побудувати навігаційну сітку у форматі сітки вершин, зафіксованих на x, y покладені координати у формі квадратів для 3D-простору. Але у мене виникають проблеми, намагаючись розібратися з цим шляхом.

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

Наступною моєю думкою було зробити те, що раніше робив Unreal Engine 3.

https://udn.epicgames.com/Three/NavigationMeshReference.html

Який повинен був використовувати промені для створення сітки. Я не міг зрозуміти, як зупинити радіопередачу.

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

Мої основні проблеми - це, здається, не дуже оптимально. Не замислюючись над цим, при оцінці процес є O (N ^ 3) для багатошарового рівня. Що може стати досить неприємним.

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

Тож питання ...

Який був би ефективний спосіб генерувати цей захищений навмеш? І який би був хороший спосіб створити плитку?


Коли ви очікуєте генерації сітки? Час компіляції, час завантаження чи реальний час? Ми боролися з цією самою проблемою, і, врешті-решт, вирішили, що це є надмірним для нашого сценарію (генерація часу завантаження у шутері зверху вниз без перекриття контурів), і ми вирішили піти з підходом на квадратичному дереві. Це працювало досить добре для нас. Тож я здогадуюсь, що я запитую, чи вам це справді потрібно, або яке найпростіше рішення, яке відповідає вашим початковим вимогам, оскільки це може бути часом? Якщо ви все-таки керуєте хорошим рішенням, я хотів би почути, як ви його виправили.
Нільс

@Niels Я планую заздалегідь створити, а потім завантажити його в гру.
самогон

Тоді витрата часу не повинна бути занадто великим початковим недоліком, оскільки гравець не буде його чекати. Ви завжди можете оптимізувати, коли у вас щось працює.
Нільс

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

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

Відповіді:


1

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

Це було б простим рішенням. Існує багато алгоритмів для пошуку шляху та генерації навмеша.

Я хотів би поділитися чимось, що я прочитав деякий час тому.

Приклад01

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

Приклад02

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

Щодо питання, я б рекомендував вам перейти до відповіді Кромстера у списку алгоритмів генерування навмеш.

Також ознайомтеся з AI Systems of Left 4 Dead, частиною яких є приклади. Ще багато цікавих тем висвітлювалося

Щасти.


0

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


Гарна ідея, але не життєздатна для досягнення кінцевих цілей. Мені потрібно підтримувати великий світ і дозволяти ШІ переходити з одного боку континенту на інший бік континенту. Це багато можливо, але мені потрібно мати фіксовану сітку наві для створення вищих вузлів.
самогон

0

Це проблема, яку я бачив всюди. Хитрість - «розділення проблем». «Скажи що?», Я чув, як ти думаєш. Те, що відображається на екрані, НЕ, що таке "структура даних". Важливо зберігати візуальні зображення окремо від даних для побудови візуального. Це завжди буде "доказом" вашої гри, коли будуть випущені нові базові версії програмного забезпечення.

Побудуйте структуру даних (aka: model), яка буде представляти ваш ігровий світ. Потім побудуйте "вид" моделі структури даних. Якщо ви хочете змінити світ із сітки шашки на шестикутну сітку, структура даних (модель) залишається такою ж, але дисплей буде "малювати" (надавати) інший вигляд.


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

-2

Складіть подвійний масив. І тоді, якщо об'єкт / об'єкти є непрохідними, майте метод, щоб сказати масиву, що положення не є прохідним. Коли AI спробує рухатись, вони переглянуть подвійний масив і побачать, чи він прохідний.


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