Расчет воздействия столкновения Box2D

Я использую стандартный Box2D ContactListener для прослушивания событий столкновения. Я хочу рассчитать силу удара при столкновении тел.

Я читал много разных описаний того, как люди его вычисляют. Некоторые используют обратный вызов preSolve, другие используют postSolve. Некоторые используют Manifold, другие ContactImpulse. Некоторые берут только normalImpulse+tangentImpulse первой точки, другие берут сумму всех точек, а третьи, опять же, берут максимум. Некоторые люди полностью игнорируют TangentImpulses...

Я не могу понять эту проблему. Иногда я получаю только импульсы в postSolve, а импульсов в preSolve всего 0. Иногда бывает наоборот. Иногда я получаю смехотворно высокие значения (скажем, от 1E15 до 1E30), а иногда они смехотворно низкие (скажем, от -1E15 до -1E30). У меня даже был случай, когда один из импульсов был NaN (Не Число).

Есть ли кто-нибудь, кто может объяснить мне, как решить эту проблему и, возможно, объяснить, как интерпретировать эти импульсы? Или, может быть, покажите мне какую-нибудь игру с открытым исходным кодом, в которой используется Box2D, а также необходимо рассчитать влияние для любой системы повреждений?


person noone    schedule 13.10.2013    source источник


Ответы (2)


Я думаю, вам нужно определить, что вы считаете «силой удара», прежде чем кто-либо сможет сказать вам, как вы должны ее рассчитать. Как вы сказали, есть много способов подойти к проблеме.

Вот несколько советов, которые я мог бы упомянуть:

  • только postSolve будет иметь действительные значения для примененного импульса
  • за одно столкновение может произойти много вызовов preSolve/postSolve
  • нормальный импульс направлен от тела А к телу В
  • может быть только один импульс (что NaN был из второй точки, я предполагаю?)

На этой странице есть более подробная информация: http://www.iforce2d.net/b2dtut/collision-anatomy

Обычно просто смотрят на значения импульса в первом сообщении postSolve после начала контакта, поскольку оно обычно является самым большим и представляет собой начальное попадание.

Другой подход может состоять в том, чтобы отслеживать общие значения импульсов, скажем, за последние 0,5 секунды, и если они превышают некоторый порог, объект должен сломаться. Это позволит вам справиться со случаем, когда два объекта уже соприкасаются, а третий ударяет их (например, если два объекта сложены, а третий объект падает сверху, здравый смысл подсказывает нам, что тот, что внизу, не должен избежать падения). поврежден только потому, что его не трогали напрямую).

person iforce2d    schedule 14.10.2013

«Иногда я получаю смехотворно высокие значения (скажем, от 1E15 до 1E30), а иногда они смехотворно низкие (скажем, от -1E15 до -1E30)».

В зависимости от направления сила будет либо положительной, либо отрицательной. Для чрезвычайно твердых тел столкновения даже на умеренных скоростях могут привести к чрезвычайно высоким силам/ускорениям (в абсолютных значениях). Подумайте, например, о двух стальных сферах, сталкивающихся на скорости 200 км/ч.

person Tarik    schedule 13.10.2013
comment
-1Е15 до -1Е30 низкий, не маленький по сравнению с 1Е-15 до 1Е-30. У меня также есть очень маленькие значения, но они действительно могут быть действительными. Я смотрю на столкновение между динамическим и статическим телом. Может ли это быть причиной странных цифр? - person noone; 13.10.2013
comment
Ну, в зависимости от направления, число либо положительное, либо отрицательное. - person Tarik; 13.10.2013