Як відокремити об'єкти, що стикаються, не створюючи більше зіткнень


11

Припустимо, я використовую просту дискретну систему виявлення зіткнень, де переміщую всі об'єкти, а потім перевіряю на зіткнення. Я хочу, щоб будь-які об’єкти, що стикаються, були відокремлені (звичайно) та присвоєні відповідні швидкості відповіді (відмов, ковзання, зупинка тощо).

Коли у мене є пара об'єктів, що стикаються, як їх відокремити, не закінчившись тим, що один або обидва вони стикаються з іншими об’єктами?

Відповіді:


8

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

Ерін Катто дала приємне пояснення послідовного вирішення імпульсів на декількох попередніх GDC, їх можна завантажити зі сторінки завантаження Box2D , див., Наприклад, GDC 2009.


Мені це цікаво. З огляду на те, наскільки загальною є потреба у виявленні та вирішенні зіткнень, я припустив, що існує принаймні спрощений алгоритм роздільної здатності, придатний для аркадних та ігрових дій.
AJM

2
Не зовсім. За старих часів (SNES тощо) вони мали такі проблеми, як ця, із змінами в дизайні гри або компромісами. Напр. У Супер Маріо, коли гравця вдарили, Маріо на пару секунд був би непереможним, щоб обійти другий зіткнення. У Double Dragon зіткнення для гравця ігноруються, поки не закінчиться анімація за падіння назад.
yaustar

@yaustar Насправді Маріо взагалі не стикається з ворогами. Він просто спричиняє шкоду, коли його скринька перекриває їх.
Зима

3

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

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


2

Зазвичай я роблю наступне:

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


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