Як вирішити зіткнення складених фігур за допомогою SAT?


16

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

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

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

Приклад SAT 1

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

Приклад SAT 2

Цей підхід не зможе розділити вектори, які вказують у протилежному напрямку один від одного або у випадку, як показано на наступному малюнку:

Приклад SAT 3

Тут ми б нескінченно повторювались між державою ліворуч та державою праворуч.

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


Чи можете ви уточнити, для чого ви хочете використовувати вектор?
Буде чи

@Will Вектор слід використовувати для вирішення зіткнення, щоб форми більше не перетиналися. Тому я міг перемістити жовтий об’єкт за отриманим вектором, і два об'єкти більше не стикаються.
bummzack

Відповіді:


7

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

Реалізм

Кутова імпульс і його стукітні ефекти - це назва цієї гри.

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

Ваші опуклі світильники поєднуються, щоб надати об'єкту як його контур, так і його центроїд (і, звичайно, у складніших моделюваннях, кожне кріплення також може впливати на щільність по-різному). Причину, про яку я згадую, полягає в тому, що для вирішення зіткнень реалістично вам доведеться обчислювати не тільки лінійний, але й кутовий імпульс, слідуючи за кожним «підрядним зіткненням» своїх контактних точок. Це не так просто, як базовий "push apart", який ви застосовуєте за допомогою SAT.

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

Менше реалізму

Звичайно, якщо припустити, що ви зовсім не зацікавлені у вирішенні кутового імпульсу, то найкраще, що ви можете зробити з SAT, стає по суті саме тим, що ви робили, якби ви загорнули ці багатокутники як опуклими, використовуючи щось на зразок сканування Грема: Відштовхуючись єдиним розділенням вектор. Іншими словами, мало сенсу намагатися вирішити три вектори в тандемі, як ви продемонстрували. Це найбільший у купі, який налічується.

РЕДИТУЙТЕ у відповідь на ваше запитання

Що потрібно зробити, якщо ви хочете спрощеного підходу, це наступне:

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

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


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

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