Autor Wątek: kolizja AABB we współrzędnych swiata z AABB we współrzędnych obiektu, C++  (Przeczytany 951 razy)

Offline wolfenstein

  • Użytkownik

# Grudzień 05, 2010, 13:52:08
Witam,
szukam jakiegoś sposobu (i najlepiej kodu) na sprawdzenie, czy bounding box (opisane za pomocą wektorów mins/maxs) we współrzędnych świata koliduje z bounding boxem we współrzędnych obiektu (mam daną pozycję i rotację tego obiektu). Zna ktoś odpowiednie algorytmy?
Z góry dziękuje za pomoc..

Offline Mr. Spam

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

Offline Kuba D.

  • Użytkownik

# Grudzień 05, 2010, 14:18:30
Najprościej przenieść układ współrzędnych pierwszego bboxa do układu współrzędnych drugiego i sprawdzić kolizję.

EDIT:
Swoją drogą przy kolizjach AABB rotacji się nie uwzględnia gdyż ten rodzaj bboxa jest z definicji wyrównany do osi ;) Możesz co najwyżej go uaktualniać przy obrocie i przesunięciu obiektu ( czyli przebudowujesz aabb uwzględniając położenia punktów po ich przekształceniach). A to znacznie upraszcza całe zagadnienie.

EDIT1:
Możesz też przebudować bboxa w prostszy i znacznie szybszy sposób, mianowicie przekształcasz wszystkie punkty bboxa ( czyli 8 punktów) przez odpowiednią macierz przekształceń obiektu ( obroty i przesunięcia) a następnie konstruujesz nowego bboxa na podstawie min i max współrzędnych punktów tego przekształconego. I otrzymujesz aabb który uwzględnia wszelkie obroty i translacje obiektu który opisuje.
« Ostatnia zmiana: Grudzień 05, 2010, 14:30:34 wysłana przez Kuba D. »

Offline Reg

  • Administrator
    • Adam Sawicki - Home Page

# Grudzień 05, 2010, 16:37:02
Na pewno trzeba sprowadzić obydwa boksy do tego samego układu współrzędnych. Potem są dwie opcje: Albo jeden z nich będzie AABB a drugi obrócony (OBB) i testujesz kolizję OBB, albo znajdujesz też AABB tego drugiego po przekształceniu. Jeśli wybierasz tą drugą opcję, to AABB obiektu w jego współrzędnych lokalnych przekształcasz w AABB we współrzędnych świata i porównujesz z tym pierwszym. Takie przekształcenie to jest oczywiście pewnego przybliżenie - AABB otaczający OBB. Najprościej można go wyliczyć przekształcając wszystkie 8 wierzchołków ze współrzędnych lokalnych do współrzędnych świata i znajdując AABB wokół nich. Ale jest lepszy algorytm:

void TransformBox(BOX *Out, const BOX &In, const MATRIX &M)
{
/* Nowy algorytm, na podstawie książki:
Real-Time Collision Detection, Christer Ericson
*/

// For all three axes
for (int i = 0; i < 3; i++)
{
// Start by adding in translation
Out->Min[i] = Out->Max[i] = ( (VEC3&)M._41 )[i];
// Form extent by summing smaller and larger terms respectively
for (int j = 0; j < 3; j++)
{
float e = M(j, i) * In.Min[j];
float f = M(j, i) * In.Max[j];
if (e < f)
{
Out->Min[i] += e;
Out->Max[i] += f;
}
else
{
Out->Min[i] += f;
Out->Max[i] += e;
}
}
}
}