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

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

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

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

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

4 голоса | спросил noone 13 +04002013-10-13T11:43:04+04:00312013bEurope/MoscowSun, 13 Oct 2013 11:43:04 +0400 2013, 11:43:04

2 ответа


0

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

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

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

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

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

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

ответил iforce2d 15 +04002013-10-15T01:33:37+04:00312013bEurope/MoscowTue, 15 Oct 2013 01:33:37 +0400 2013, 01:33:37
0

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

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

ответил Tarik 13 +04002013-10-13T12:00:42+04:00312013bEurope/MoscowSun, 13 Oct 2013 12:00:42 +0400 2013, 12:00:42

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132