Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

SAT Separating Axis Theorem

Ostatnio zmodyfikowano 2016-10-07 22:11
Autor Wiadomość
Crax
Temat założony przez niniejszego użytkownika
SAT Separating Axis Theorem
» 2016-10-07 22:11:52
Od tygodnia pracuje na projektem gry typu Solda, mimo wielu prób utknąłem jednak przy kolizjach.

SAT
SAT
 
Od dwóch dni szukam informacji na temat SAT. Przeszukując internet natknąłem się na taki poradnik:
https://gamedevelopment.tutsplus.com/tutorials/collision-detection-using-the-separating-axis-theorem--gamedev-169
Dotyczy on innego języki i technologi, co nie sprawia jednak problemów.

Nie wszystko jednak jest dla mnie jeszcze jasne, i mam kilka pytań:

1. Mapa gry, nie jest figurą wypukłą, więc SAT nie wile tu da. Funkcja wykrywania kolizji opiera się jednak na punktach zaznaczonych na mapie, które połączone są liniami, i to właśnie między nimi a graczem (kwadratem) wykorzystany jest algorytm. Moje pytanie, czy takie podejście jest dobre?

2.Sposób działania algorytmu jest prawie dla mnie jasny. Umiem już wykrywać kolizje miedzy, prostymi figurami cały czas mam jednak problem z rotacjami. (Dokładnej mówiąc badam oś x i y, przy rotacjach obiektów konieczna jest jednak jeszcze jedna oś której nie umiem opisać).
Czy ktoś mógł by mi polecić jakieś materiały o rotacjach i SAT (Najlepiej w c++), lub chociaż wytłumaczyć ten kod?


var dot10:Point = box1.getDot(0);
var dot11:Point = box1.getDot(1);
 
var dot20:Point = box2.getDot(0);
var dot24:Point = box2.getDot(4);
 
//Actual calculations
var axis:Vector2d = new Vector2d(1, -1).unitVector;
var C:Vector2d = new Vector2d(
    dot20.x - dot10.x,
    dot20.y - dot10.y
)
var A:Vector2d = new Vector2d(
    dot11.x - dot10.x,
    dot11.y - dot10.y
)
var B:Vector2d = new Vector2d(
    dot24.x - dot20.x,
    dot24.y - dot20.y
)
var projC:Number = C.dotProduct(axis)
var projA:Number = A.dotProduct(axis);
var projB:Number = B.dotProduct(axis);
 
var gap:Number = projC - projA + projB; //projB is expected to be a negative value
if (gap > 0) t.text = "There's a gap between both boxes"
else if (gap > 0) t.text = "Boxes are touching each other"
else t.text = "Penetration had happened."

Pozdrawiam.
P-152315
« 1 »
  Strona 1 z 1