Autor Wątek: kolizja dwoch szescianow  (Przeczytany 970 razy)

Offline deniol

  • Użytkownik

# Grudzień 03, 2011, 12:14:46
witam, mam dwa szesciany
struct cube
{
float x, y, z; //pozycja
};

ich rozmiary to 2.0f x 2.0f x 2.0f, jak mogę sprawdzić czy kolidują ze sobą ?

szesciany nie ulegaja rotacji innej niz w osi Y
« Ostatnia zmiana: Grudzień 03, 2011, 12:21:13 wysłana przez deniol »

Offline Mr. Spam

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

Offline Oti

  • Użytkownik

# Grudzień 03, 2011, 13:15:58
W takim razie wzdłuż osi Y można zrobić tak jak w zwykłym AABB.

Natomiast na płaszczyźnie XZ należy zrobić tak, jak przy liczeniu kolizji dwóch kwadratów w 2D:
[2D]
Dla każdego kwadratu znaleźć 4 wierzchołki(x,y) i 4 proste(a,b,c) będące bokami.

...A1--------A2..B1------B2
...|.........|...|.......|
...|.........|...|.......|
...|.........|...|.......|
...|.........|...B4------B3
...A4--------A3
Ważne jest, by wszystkie proste były jednakowo zorientowane-np. wszystkie proste są zwrócone prawą stroną do środka kwadratu, a lewą  na zewnątrz(lub na odwrót-ważne, by było tak samo dla wszystkich).

Wtedy po kolei dla każdego wierzchołka kwadratu A sprawdzasz czy jest po wewnętrznej stronie wszystkich prostych(o ile mnie pamięć nie myli: ax+by+c>0 dla punktu (x,y) znajdującego się po prawej stronie prostej). Następnie do samo, tylko, że w drugą stronę. Jeśli którykolwiek wierzchołek A jest w B, lub którykolwiek wierzchołek B jest A, to mamy kolizję.
[/2D]

W 3D należy jeszcze dołożyć to, co napisałem na samym początku: Dodatkowym warunkiem zajścia kolizji jest nachodzenie się przedziałów <Ymin,Ymax> obu sześcianów.
« Ostatnia zmiana: Grudzień 03, 2011, 13:20:18 wysłana przez Oti »

Offline koirat

  • Użytkownik

# Grudzień 08, 2011, 00:16:50
Ja bym to zrobił tak jak w tym linku tylko dla dwóch trójkątów z których składa się prostokąt.
http://www.blackpawn.com/texts/pointinpoly/default.html
Jeśli trójkąty dobrane tak iż "otwierają się na siebie" można zoptymalizować jeśli u lub v mniejsze od zera, i darować sobie test dla drugiego trójkąta.


Opcjonalnie policzyc u i v dla jednego trójkąta (musi być złożony z boków a nie przekątnej) i sprawdzić czy u <= 1 i v <=1   oraz u i v >= 0 dla każdego punktów drugiego trójkąta.
Ta drugą opcje wymyslilem teraz wiec nie testowana ale wyglada ok.
« Ostatnia zmiana: Grudzień 08, 2011, 00:26:00 wysłana przez koirat »