Autor Wątek: [Box2d 2.0.1] z której strony kolidują boxy  (Przeczytany 764 razy)

Offline C'mons

  • Użytkownik

# Luty 07, 2011, 22:37:32
Pracuję z Box2D 2.0.1 (nie jest to najnowsza wersja w której wprowadzono fixtury, bue) i zastanawiam się jak mogę wyznaczyć z której strony jeden prostokąt uderzył w drugiego. Z lewej, prawej, od góry czy z dołu.

Każde ciało ma prostokąt za figurę i nie może się obracać. Tak więc mamy do czynienia z kolizją zwyczajnych prostokątów.

Za dane mam strukturę o punkcie uderzenia:
struct b2ContactPoint
{
b2Shape* shape1; ///< the first shape
b2Shape* shape2; ///< the second shape
b2Vec2 position; ///< position in world coordinates
b2Vec2 velocity; ///< velocity of point on body2 relative to point on body1 (pre-solver)
b2Vec2 normal; ///< points from shape1 to shape2
float32 separation; ///< the separation is negative when shapes are touching
float32 friction; ///< the combined friction coefficient
float32 restitution; ///< the combined restitution coefficient
b2ContactID id; ///< the contact id identifies the features in contact
};
Oraz obecne (po kolizji) współrzędne ciał. A właściwie całe struktury definiujące te ciała, jak wiadomo b2Shape przechowuje wskaźnik do ciała.

Dokonywałem już różnych kombinacji z danymi, ale nie mogę znaleźć skutecznego sposobu, który powie mi z której strony shape1 uderzył w shape2. Innymi słowy na wyjściu szukam danej w stylu: (top, bottom, left or right).
« Ostatnia zmiana: Luty 07, 2011, 22:40:25 wysłana przez C'mons »

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

bs.mechanik

  • Gość
# Luty 07, 2011, 22:52:24
Zaimplementuj listener kolizji i tam sprawdz. Mowiac szczerze nie pamietam jak on wygladal w tej wersji, bo od tego czasu troche zmian w boxie bylo.

Offline C'mons

  • Użytkownik

# Luty 07, 2011, 22:56:03
Mam go. W każdym razie na wejściu jest struktura contact point którą dostaję od niego i ją chcę przemielić tak by otrzymać tą stronę uderzenia.

bs.mechanik

  • Gość
# Luty 07, 2011, 23:00:02
Hmm.. a predkosc liniowa obiektow jest wtedy juz zerowa? Bo nie wiem kiedy te listenerowe metody sie wykonywaly - przed liczeniem czy po liczeniu kolizji (w nowszych wersjach masz metoy Pre i Post Solve).

Offline C'mons

  • Użytkownik

# Luty 07, 2011, 23:31:22
Jest już po modyfikacji. Tzn ma przeciwny zwrot i pewnie jest to wypadkowa po uderzeniu.

bs.mechanik

  • Gość
# Luty 08, 2011, 00:13:28
A ja mam moze pomysl - zrob sensor wokolo obiektu w ktory strzelasz. Niech bedzie to cos w stylu circle o  sporym promieniu. Teraz jesli sensor wykryje jakis obiekt, pobierasz jego polozenie, a pozniej robisz to w trakcie reagowania na kolizje. Liczysz wektor i masz.
Na okretke to, ale powinno zadzialac.