Autor Wątek: DOKLADNA I SZYBKA kolizja aabb i sphere  (Przeczytany 679 razy)

Offline Tadekprogramista

  • Użytkownik

# Grudzień 01, 2011, 21:21:57
Witam.
Tak jak w temacie.
szukam czegos dokladniejszego do obliczania kolizji aabb i sphere.
Aabb wyglada tak:
class aabb
{
 Vector Min,Max;
}
sphere tak
{
Vector Center;
Real Radius;
}
Chce czegos wiecej, niz zamiana sphere na aabb opisany na niej i sprowadzenie problemu do kolizji aabb/aabb, funkcja powinna byc dokladniejsza, ale rowniez w miare wydajna. Prosze o pomoc.
Funkcja powinna zwracac tylko true/false, bym wiedzial czy jest kolizja. Zadnych contakc pointow nie potrzebuje.
< z gory przepraszam za brak polskich znakow >

Offline Mr. Spam

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

Offline Reg

  • Administrator
    • Adam Sawicki - Home Page

# Grudzień 01, 2011, 21:31:58
Moje rozwiązanie polega na znalezieniu punktu z wnętrza AABB najbliższego do środka sfery i sprawdzeniu, czy należy on do sfery (odległość znalezionego punktu od środka sfery jest mniejsza niż promień sfery).

Funkcja DistanceSq liczy kwadrat odległości, który jest porównywany z kwadratem promienia - to optymalizacja, żeby nie trzeba było liczyć pierwiastka jak przy liczeniu normalnej odległości.

void ClosestPointInBox(VEC3 *Out, const BOX &Box, const VEC3 &p)
{
Out->x = minmax(Box.Min.x, p.x, Box.Max.x);
Out->y = minmax(Box.Min.y, p.y, Box.Max.y);
Out->z = minmax(Box.Min.z, p.z, Box.Max.z);
}

bool SphereToBox(const VEC3 &SphereCenter, float SphereRadius, const BOX &Box)
{
VEC3 PointInBox;
ClosestPointInBox(&PointInBox, Box, SphereCenter);
return DistanceSq(SphereCenter, PointInBox) < SphereRadius*SphereRadius;
}