Я використовую такий підхід (подібний до алгоритму масового розщеплення Tonge http://www.richardtonge.com/ ):
- виявити всі пари, що стикаються у вашій сцені / контексті. Нехай (A, B) є такою парою. Застосуйте ідею розбиття примари / маси: якщо A контактує з M тілами, а B контактує з N іншими тілами, тоді тимчасово встановіть масу A на,
m_A/M
а B наm_B/N
- обчислити внески на реакцію / реституцію для кожної пари (A, B) і зберегти ці внески у власних акумуляторах A і B
- обчислюйте швидкості відновлення з імпульсів (як ви заявили) та зберігайте їх таким же чином (як залишки швидкості deltaV у власних акумуляторах для кожної пари (A, B))
- обчислити зміщення штрафних санкцій (знову ж таки, накопичуйте переміщення, не застосовуйте їх миттєво!)
- скинути маси всіх органів, які раніше були визначені сторонами в зіткненнях пар (
m_A = m_A * M
і m_B = m_B * N
)
Цей підхід схожий на те, як ітераційний алгоритм Якобі працює з лінійними одночасними системами рівнянь. І це не гарантовано конвергується, але в моєму тренажері це виконує роботу досить гладко .. в 3D (так, додатковий вимір додає вдвічі складніше!).
Caveat : виправляйте положення та швидкості лише після того, як ваша фаза виявлення / керування зіткненням закінчиться! Таким чином ви одночасно оновлюєте своїх учасників, що стикаються. Також сили реституції слід враховувати наступного разу при інтеграції для позицій та швидкостей.
EDIT: Ну, я думаю, ви використовуєте вже зловживали методом інтеграції Verlet (цей став домашньою назвою серед ентузіастів gamedev). У цьому спектрі керування зіткненнями та інтеграції ви можете поглянути тут .
ОНОВЛЕННЯ. Деякі відомості про те, як наблизитись до зіткнення (і самовпевненого з цього приводу), можна знайти в цих документах:
Запропонований мною підхід - це далеко не оригінальний внесок, багато ігор використовують його з правдоподібними результатами, і його найкраще застосував Якобсен у своєму ігровому двигуні Hitman.
З дещо практичного досвіду, штрафні сили (подібні до лінійних або експоненціальних пружин, які отримують свій вхід з відстані проникнення), не вирішують належним чином проникнення, коли інші сили, що стикаються з тіл, що стикаються, встигають бути більшими за них. Ось чому я вирішив поєднати три (майже зайві) підходи: ньютонівські сили реакції (ти відштовхуєш стіну, стіна відштовхується назад), швидкість походження імпульсу (стикаються кулі снукера) та неприродне "переміщення тіл один від одного геометрично "рішення. Вони, схоже, забезпечують все: позбудуться більшостіпотворні артефакти взаємопроникнення, що стикаються тіла, як правило, взаємодіють один з одним у довгостроковій перспективі (через швидкість і сили реституції - принаймні сили, що мали тенденцію перетягувати тіла за сценарієм зіткнення, скасовуються, а тіла відштовхуються одне від одного) . Нарешті, для подальшого розуміння цих простих, але поширених понять, пропоную проаналізувати ці слайди .
Мій епітет "зловживаного методу", що описує кроки інтеграції Верле, орієнтований на переконання популярної культури, що це Святий Грааль методів інтеграції. Він просто незначно кращий, ніж його симплектичний Ойлер (його також називають якийсь напівзрозумілий Ейлер) двоюрідний брат. Існують способи більш складних методів інтеграції (і всі вони мають імпліцитну назву). Потужні ігрові двигуни використовують їх, але інді-розробники не встигають експериментувати з тими, оскільки Verlet, налаштований на конкретний сценарій, справді творить чудеса. Крім того, немає абсолютно ніякого методу інтеграції, який би міг вирішувати жорсткі обмеження, не залучаючи жодного обману (не можу знайти посилання, але документ, про який я посилаюся, повинен називатися "X.Provot -" Деформаційні обмеження в масі -спрінг-модель для опису жорсткої поведінки тканини "