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


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.