Шлях на нерівній планетарній поверхні


16

Моє запитання: який би був найкращий підхід до нанесення маршрутів на нерівній планетарній поверхні?


Довідкова інформація

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

введіть тут опис зображення

Мені цікаво, чи можна використовувати кожне "кулепроектоване обличчя куба" як сітки та використовувати простий алгоритм A *, щоб знайти найкращий можливий маршрут, я також хотів би врахувати висоту переміщення, щоб шлях уникнув сходження гори тощо (я думаю, це було б просто евристикою в алгоритмі A *). Ще одне врахування - це я досяг враження руху планети , використовуючи фізичний двигун Unity3d, застосовуючи гравітацію до центру планети. Чи моє запропоноване рішення вимагатиме, щоб рух агентів контролювався незалежно від гравітаційної фізики.

Щоб краще сформулювати моє запитання, це моє поточне планетарне тіло:

введіть тут опис зображення


2
Можливо, вас зацікавить це відео з Планетарного знищення. Здається, вони роблять те ж саме, що ви обмотуєте світ із куба і шукаєте шлях навколо нього. Це насправді не відповідь, але ви можете бачити, що вони використовують A * разом з деякими іншими стратегіями для оптимізації пошуку шляхів навколо сфери. Шлях пошуку шляху починається о 24:30 .
MichaelHouse

@ Byte56 Дякую за це посилання дійсно цікавий підхід до калькуляції витрат, не можу чекати, щоб побачити цю гру, коли вона закінчена!
Кай Євген

Відповіді:


12

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

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

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

введіть тут опис зображення

Оскільки A * часто отримує сусідів до свого поточного вузла, ви можете легко створити набір функцій для отримання сусідніх вузлів. Так , наприклад, getXPlus(), getXMinus(),getZPlus() і так далі. Ці функції приймуть поточний вузол і повернуть вузол у напрямку, визначеному назвою функції.

Більшу частину часу ці функції можуть просто збільшувати значення і виконуватись, проте, на краях, що зміниться.

Ви захочете відобразити поверхню куба на 2D системі координат. Однак ви вирішуєте, що вони не повинні вишикуватися, просто надайте кожному простору сітки унікальну координату X, Y.

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

Наприклад, отримання координати XPlus тут змінить і X, і Y координати, оскільки ми переходимо до нового простору сітки на новій грані. Зелена лінія являє собою край між двома гранями.

введіть тут опис зображення

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

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

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


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

Дійсно це лише ті краї, про які потрібно турбуватися. Це легко вирішується функцією обгортки (загортання куба у функцію обгортки, яка огортає ваш світ ...). Можна абстрагувати куб на рівну поверхню, яка загортається. Створіть функції для отримання сусіднього простору сітки, getXPlus () отримає сітку в напрямку XPlus, неважливо, чи знаходиться вона на межі між обличчями, функція просто переключить обличчя та поверне відповідну інформацію про сітку.
MichaelHouse

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

1
Тут важливо розуміти, що A * не обов'язково працює на площині; він діє на графіку. Хоча в межах кожної грані куба вузли розташовані та з'єднані в сітку, також є вузлові з'єднання по краях куба.
jmegaffin

1
@ Byte56 Дякую за чудову відповідь, я почав нав'язувати рішення, однак я трохи вдарив про блокпости. Можливо, я зрозумів неправильно. Я розмістив питання над stackoverflow, тому що я відчув, що це більше математика / проблема програмування stackoverflow.com/questions/16089074/…
Кай Євген
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.