2D виявлення зіткнення


11

Припустимо, я використовую цього персонажа.

птах
(джерело: iconbug.com )

Як би ви реалізували для нього виявлення зіткнень? Використання обмежувального поля не здається гарним наближенням, оскільки форма птаха ніде не знаходиться в квадраті.

Я думав мати якусь структуру даних квадратичного дерева всередині об’єкта, який представляє частини зображення. Кожен листочок може бути або false(якщо він покриває білий / прозорий простір поза птахом), або true(у випадку, якщо він являє собою ділянку птаха, тобто дзьоб, око тощо). Тоді якось випробуй єдину перешкоду на сцені на зіткнення з птахом.

Але мої проблеми в моєму підході:

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

Як би ви зробили виявлення зіткнень з неквартальними персонажами?

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

LE2: Я дбаю про досить точні зіткнення. Я не уявляю, як одна обмежувальна скринька або коло можуть принаймні пристойно наближати цю форму, тому такий підхід не буде працювати.


2
Загальна примітка: я б використовував як обмежувальний ящик, так і більш детальну перевірку: гранульований чек матиме більш високу ефективність покарання, тому ви хочете, щоб він працював якомога рідше. Тому спочатку перевірте обмежувальне поле і лише в тому випадку, якщо це потрапило, заглибиться на рівень глибше і випробуй свій більш детальний підхід (що б там не було).
Філіп Олґейер

Дякую, я все-таки планував це зробити, але я не зовсім впевнений, якою має бути «детальна перевірка». :)
async

1
Відсутня єдина важлива деталь: що ви хочете зробити з цим? Вас хвилюють точні зіткнення? Ви раді наблизити персонажа до кола? Ви хочете, щоб частинки пилу стикалися з очима персонажа окремо від решти?
Анко

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

1
Як це . Що означають навіть "добрі" та "природні"? Це філософське питання?
Анко

Відповіді:


12

Коловий колайдер. Досить добре для цього, я б сказав, якщо ви щось не фантазуєте, коли певні частини впливають на фізику або зіткнення виглядають неприродно, і навіть якщо вам потрібно розділити це на кілька частин, я вам повинен сказати одне:

Не надмірно ускладнюйте це.

Для цього вам не потрібна повна структура квадратичного дерева. Просто мати кілька коробок або кіл у прямому масиві, а потім перетинатися з усіма ними. Це може бути недостатньо критичним для роботи, і ви не отримаєте стільки від використання квад-дерева.


3
Так, просто зробіть невеликий масив з декількох фігур, якщо одна форма не покриє його. Наприклад: i.imgur.com/Dd4yyGN.png
MichaelHouse

Дякую Jonkel & @ Byte56. Використання декількох фігур здається правильним рішенням у моїй ситуації. Прямий втілення, акуратний та швидкий. Не можу повірити, що я стрибнув прямо до чотирьох дерев, не розглядаючи це! Ага.
асинхрон

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

14

Двоетапний процес перевірки

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

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

Оскільки ваше зображення є PNG (або будь-який інший формат файлу, який містить альфа-канал), це було б досить просто

  1. Обчисліть площу перетину між цим об'єктом на сцені та птахом, створивши простий прямокутник перетину на обох зображеннях
  2. У цьому перехресті перевірте, чи має кожен піксель значення альфа> 0 у ВІДКРИТИХ зображеннях
  3. Якщо такі пікселі існують, ви зіткнулися. Інакше ні

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

альфа-канал із зображення

Піксельні ідеальні зіткнення зазвичай дорогі, тому спочатку груба оцінка з обмежувальним полем або більш детальною фігурою зіткнення (як і запропонована Анко) може заощадити дорогоцінний час

"Більш тонка" детальна коробка обмеження зіткнення Анко запропонувала:

більш детальний обмежувальний ящик

PS: Якщо на вашому зображенні є ореол, ефект або інший альфа-канал, який не стосується 0, з яким ви не хочете зіткнутися, поріг алгоритму може бути легко відрегульований таким чином


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

звичайно, товариш, так, ідеальне зіткнення пікселів майже завжди є надмірним, за винятком ігор, які справді потребують цього (як 2D-бійці)
codemonkey

3

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


0

Можливо, ви могли б використовувати якийсь вибагливий багатокутник / крайовий колайдер.

Не точно знаю, як це буде працювати, але:

два об'єкти: об’єкт 1: птах (o1), об’єкт 2: річ, яка може потрапити на птаха (o2)

1) Визначте обмежувальну форму, яка є багатокутником, який тісно прилягає до першого предмета (o1).

2) Отримайте ребра o1, o2, які могли б стикатися без того, щоб можна було зіткнутися, не проходячи o2 через o1 або навпаки.

З положення та розміру форми (o2) ви, мабуть, могли виділити ребра (o1), які неможливо вразити, чи це тому, що вони «позаду» іншого краю (o1), який ближче до o2. Якщо у вас був правильний трикутник, гіпотенуза лицьова вгору та праворуч і прямокутник, що наближається до нього прямо (з довгою стороною вздовж осі x), то ви можете сказати, які ребра опускати, тому що вони починаються та закінчуються у значень y над або прямокутником нижче.

3) Визначте, чи одна з точок на краю o2 збігається з точкою на будь-якому з ребер o1, яку ви вибрали на кроці 2.

ця концепція, ймовірно, найкраще працює для зіткнення полігонів (тобто речей з чіткими краями), але, можливо, ви можете трактувати коло як один довгий край (наприклад, якщо o2 був колом).

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