Як вирішити проникнення двох тіл, що стикаються


9

Я реалізував простий двигун фізики 3D-ігор. У мене вже є пристойне виявлення зіткнення, тепер я намагаюся розібратися у частині відповіді на зіткнення. Я використовую імпульсний метод для обчислення швидкостей після зіткнення. Це працює досить добре, однак це не заважає органам продовжувати взаємопроникати. Тож у мене є додатковий фрагмент коду, щоб вирішити проникнення. В даний час я просто переміщую тіла вздовж нормального контакту на половину глибини проникнення - перше тіло в напрямку нормального контакту, друге тіло в зворотному напрямку.

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

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

Відповіді:


3

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

Скажімо, у вас є кроки моделювання 100 мс і що в якомусь кадрі у вас є дві кулі, які стикаються на половині шляху (50 мс) у кадр. По-перше, ви виявите, що вони зіткнулися в будь-якій точці кадру (що, я вважаю, ви вже робите ефективно). Вони визначать, в який момент під час кадру вони зіткнулися. Тепер вирішуйте зіткнення, включаючи перші 50 мс кадру, в якому вони не стикалися. Тепер у вас з'являться нові швидкості кульок, і ви також можете зараз вжити заходів, щоб переконатися, що вони не проникають (таких має бути дуже мало, оскільки це "щойно сталося".) Нарешті, ви змоделюєте наступні 50-ті роки каркас. Зауважте, що в цей період може статися чергове зіткнення з одним або обома цими кулями.


1
Тож ви, головним чином, пропонуєте здійснити безперервне виявлення зіткнення, а потім обробити проникнення, як і раніше, так само, як і я, оскільки вони, ймовірно, будуть дуже малі. Мабуть, це може спрацювати. Тепер мені залишається лише розібратися, як зробити моє виявлення зіткнень безперервним :)
— adam

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

Безперервне виявлення зіткнення означає, що замість перевірки перетину між двома статичними об'єктами (3d-проблема) ви перевіряєте контакт двох рухомих об’єктів (в основному, проблема 4d). Зазвичай достатньо враховувати лише постійні швидкості, тому що ви можете наближати траєкторії кусково-лінійними кривими. Перевага полягає в тому, що відстань проникнення завжди буде нульовою (або близькою до, через помилки поплавкового округлення). Я хоч ти і говорив про це, але, можливо, я неправильно трактував твою відповідь?
— адам

@adam Так, саме про це я говорю.
— notlesh

2

Ознайомтеся з цією статтею, яка була розміщена тут багато разів раніше, просто шукайте запитання щодо виявлення зіткнень із тегами Q & As - вона показує вам, як зробити "безперервне" дозвіл зіткнення, про яке говорив Стефелтон:

http://www.gamasutra.com/view/feature/3383/simple_intersection_tests_for_games.php?page=3

В основному, ви вирішуєте деякі основні рівняння кінематики для точної часової точки, коли ваші два обмежувальні поля почали перетинатися. Ви вирішите свої зіткнення в той самий момент, а потім продовжите час, що залишився у вашому кадрі. Можливо, вам доведеться повторно моделювати те, що станеться після моменту зіткнення, оскільки швидкості / прискорення ваших об'єктів зміниться. Але все-таки є ваша відправна точка ... ура!


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