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

Използвам стандартен Box2D ContactListener, за да слушам събития на сблъсък. Това, което искам, е да изчисля силата на удара от сблъсъка между телата.

Прочетох много различни описания на това как хората го изчисляват. Някои използват обратното извикване preSolve, други използват postSolve. Някои използват Manifold, други ContactImpulse. Някои вземат само нормален импулс+тангентен импулс на първата точка, други вземат сумата от всички точки, а трети, отново, вземат максимума. Някои хора напълно пренебрегват тангентните импулси...

Не мога да разбера този проблем. Понякога получавам само импулси в 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
-1E15 до -1E30 е ниско, не е малко в сравнение с 1E-15 до 1E-30. Имам и много малки стойности, но може наистина да са валидни. Разглеждам сблъсъка между динамично и статично тяло. Може ли това да е причината за странните числа? - person noone; 13.10.2013
comment
Е, в зависимост от посоката, числото е положително или отрицателно. - person Tarik; 13.10.2013