Я думаю, ви, можливо, намагаєтесь помістити квадратний ключ у круглий отвір, застосувавши SAT таким, яким ви є, тут. Очевидно, що він не розроблений для увігнутих увігнутих зіткнень, і хоча я вдячний за ваші зусилля, щоб адаптувати його для цієї мети, є міркування, завдяки яким це навряд чи спрацює.
Реалізм
Кутова імпульс і його стукітні ефекти - це назва цієї гри.
Порядок контактних точок важливий для реалістичного вирішення колізій. У реальному світі одна з цих точок завжди збирається завдати удару перед іншою. І тільки в емуляції того порядку контакту та результатів кожного "підрозділу", представленого цим, можна очікувати отримання реалістичного результату в моделюванні. Це одна з самих причин, чому ви розбиваєте свою увігнуту в опуклу, в першу чергу - це дозволяє кусочно виявити, яка частина влучила першою. Звичайно, це також можна наслідувати відповідно до мого коментаря під заголовком "Менше реалізму".
Ваші опуклі світильники поєднуються, щоб надати об'єкту як його контур, так і його центроїд (і, звичайно, у складніших моделюваннях, кожне кріплення також може впливати на щільність по-різному). Причину, про яку я згадую, полягає в тому, що для вирішення зіткнень реалістично вам доведеться обчислювати не тільки лінійний, але й кутовий імпульс, слідуючи за кожним «підрядним зіткненням» своїх контактних точок. Це не так просто, як базовий "push apart", який ви застосовуєте за допомогою SAT.
Потім це повністю змінює характер вашої проблеми, оскільки, як ви бачите, безглуздо отримувати та намагатися використовувати 2 та більше контактних точок, адже насправді це лише перше, що має значення. Після того, як ви вирішите перший з точки зору лінійного та кутового імпульсу, вам потрібно буде перерахувати для подальших зіткнень, оскільки орієнтації кожного об'єкта змінилися. Крім того, виявлення кожного окремого контакту на етапі потім може бути або не потрібно робити протягом цього ж кроку - залежно від часу між контактами, що стосується першої точки контакту об'єктів, подається наступний лінійний і кутовий імпульс, другий дотики до контактних точок тощо.
Менше реалізму
Звичайно, якщо припустити, що ви зовсім не зацікавлені у вирішенні кутового імпульсу, то найкраще, що ви можете зробити з SAT, стає по суті саме тим, що ви робили, якби ви загорнули ці багатокутники як опуклими, використовуючи щось на зразок сканування Грема: Відштовхуючись єдиним розділенням вектор. Іншими словами, мало сенсу намагатися вирішити три вектори в тандемі, як ви продемонстрували. Це найбільший у купі, який налічується.
РЕДИТУЙТЕ у відповідь на ваше запитання
Що потрібно зробити, якщо ви хочете спрощеного підходу, це наступне:
Визначте правильне напрямок переміщення. Це найлегше зробити опуклим обваленням кожного та визначенням норм до осі, що розділяє.
Тепер потрібно визначити величину переміщення . Чому ми не можемо просто використовувати величину, яку задає SAT? Тому що якщо ви подумаєте над цим, глибина взаємопроникнення буде потенційно більшою для опуклих корпусів, ніж для їх зібраних увігнутих корпусів - подумайте про два Е з зубами один в одного! Як ви робили вище, знайдіть усі точки контакту для даного кроку, але знайдіть їх паралельно нормалам осі, оскільки це правильний напрямок переміщення. Тепер визначте, який із цих паралельних векторів перекриття є найдовшим. Перемістіть цю, відмовтесь від решти і перейдіть до наступного кроку з фізики.