Методи виявлення зіткнень двигуна безперервної фізики


10

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

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

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

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

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


Я рекомендую вам переглянути ці книги amazon.com/Real-Time-Collision-Detection-Interactive-Technology/… amazon.com/…
concept3d

Вибачте, додаю, але чому б не використовувати Box2D? Його переносять майже на кожну мову. Якщо ви не плануєте використовувати його, чому б не переглядати його джерело, щоб ви могли бачити, як він управляє його колозією?
Дерек

Відповіді:


2

Я справді просто кидаю ідеї сюди. Якщо припустити, що ви (як мінімум) займаєте currentпосаду і nextположення; для кожного кадру.

Вам знадобляться дві окремі широкі фази, за якими слід вузька фаза:

  • Той, який з'ясовує, що станеться зіткнення.
  • Такий, який приблизно визначає, де насправді відбувається зіткнення (наприклад, широка фаза / неточний SAT)
  • Нарешті, ваша вузька фаза покращила б результат другої широкої фази.

Початкова широка фаза

Ви можете заглянути в просторове хешування (використовуючи nextположення, не current) для початкової широкої фази. Це добре розділить ваш проблемний простір на групи кандидатів зіткнення.

Друга широка фаза

Зробіть двійкову мульти-вибірку, використовуючи описаний вами метод перетину кола. Іншими словами:

left = current
right = next
midpoint = (left + right) / 2
loop a desired amount of times tweaked to the accuracy you want:
  is a collision occuring at midpoint?
    right = midpoint
  else?
    left = midpoint
  midpoint = (left + right) / 2
pointOfCollision = midpoint

Ця точність налаштування може також враховувати відстань - я думаю, що використання "довжини в квадраті" next - currentмає отримати піксельний ідеальний результат.

Вузька фаза

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

Нарешті

Ви зможете відпрацювати час-перетину з pointOfCollision, currentі вашим поточним speedі acceleration(якщо у вас є розумний інтегратора).


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

Також, що саме робить Pmask? сайт насправді не пояснює = /.
Гриффін

@Griffin ваш перший коментар може спрацювати - подивіться, чи зможете ви зрозуміти. Я в основному роблю двійковий пошук по простору зіткнення ... PMask досить розумний. Дивіться непідписаний 64-int як сітку пікселів 8x8 (увімкнено / вимкнено) - простий AND (двійковий) визначає, чи відбувається зіткнення (ненульове); вам потрібно спочатку зробити кілька розумних розрядів, але це ідея. Прочитайте джерело для отримання додаткової інформації; тут важко пояснити (а точніше, моє пояснення буде смоктати) - вам справді потрібно посилатися на джерело.
Джонатан Дікінсон

1

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

Для вашої першої широкофазної перевірки настійно рекомендую просторовий хеш .

По суті, ви розділите ваш екран на сітки рівного розміру. Потім, якщо об’єкт лежить всередині сітки, ви додаєте його до "відра" в 1D хеш-таблиці.

Це ваша перша перевірка зроблена. Якщо об’єкти не в одному відрі, їх перетинати було б неможливо.

Продовжуючи це, тепер у вас є список відра з об'єктами (потенційно) в них. Ви можете зробити ще одну широкофазну перевірку тут:

A.) Ділення цього відра на 4 інші відра та перевірка отриманої 1D хеш-таблиці. Якщо вони не в одному відрі, не виникає зіткнень.

Або:

B.) Проведення простої перевірки відстані та пам'ятаючи про ширину та / або висоту предмета, щоб забезпечити точність.

Але як бути, коли у вас потенційно зіткнеться?

Тоді я б рекомендував щось у цьому напрямку . Це по суті своєрідна суміш між полігональним зіткненням (для складних фігур) або прямокутником / колом для менш складних фігур.

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

Якщо два об’єкти знаходяться в одному відрі, вони можуть зіткнутися.

Крім того, чи є об'єкти досить близькими, щоб вони могли незабаром зіткнутися? (З урахуванням швидкості, розміру об'єкта та відстані)

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


" Стара відповідь

Ну, на жаль, я пробув свій підручник "Усі типи зіткнень та для чого вони використовуються". :)

Однак, хоча це надзвичайно широкий квест, я розпочну вас.

Там хороший (відповів) питання , що стосується чого - то , як це тут .

Як і в статті людей , які зробили N і N + над тут .

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

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

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


Забув додати метод, на якому я базувався на моєму зіткненні (Per-Pixel, використовуючи дизайн Hull). web.archive.org/web/20090126230334/http://www.ziggyware.com/…
electroflame
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.