skovv Temat założony przez niniejszego użytkownika |
[JS]Kolizje prostokątów 2D » 2012-01-20 10:03:04 Witam. Od pewnego czasu piszę silniczek do gier, jak narazie idzie nawet sprawnie. Doszedłem do momentu w którym potrzebne są mi kolizje prostokątów z uwzględnieniem obrotu. Mógłby ktoś podpowiedzieć jak to zrobić? Mam 2 obiekty, każdy ma podane: this.X = x; this.Y = y; this.W = 64; this.H = 64; this.Angle = 50;// <- Obrót
Rysuję sobie spriteya okręconego o ileś stopni, w koło niego niebieskie linie( dla sprawdzenia poprawności kolizji ), tylko mam problem z najważniejszym... jak sprawdzić te kolizje :| |
|
madmike44 |
» 2012-01-20 11:38:44 Masz wymiary i znasz położenie. Wszystko zależy jeszcze od tego, jaka jest oś obrotu i stan początkowy. Przyjmując oś na środku prostokąta, przy obrocie jego wierzchołki poruszają się po jednym i tym samym okręgu, więc określenie ich położenia po obrocie nie jest problemem. Stricte matematycznie kolizja wygląda w tym przypadku tak:
1. Jeżeli okręgi, o których mówiłem, nie przecinają się, to na pewno nie zachodzi kolizja. 2. Jeżeli okręgi się przecinają, należy sprawdzić, czy przecinają się ze sobą dowolne dwa odcinki, z których zbudowane są dwa różne prostokąty.
Punkt pierwszy jest najprostszą optymalizacją, jaką można tutaj wprowadzić. Można też pomyśleć nad innymi, mniej oczywistymi faktami :)
Najlepiej byłoby oczywiście, gdybyś napisał, z czym konkretnie masz problem i pokazał kawałek kodu.. |
|
skovv Temat założony przez niniejszego użytkownika |
» 2012-01-20 12:41:30 Tzn konkretnie to nigdy nie pisałem takowych kolizji( jak już to prosto stojących kwadratów ). Stworzyłem sobie w klasie silniczka 3 funkcje: this.CollisionMask = function( xx, yy, ww, hh, offX, offY, dir ){ var maskacol = { X: xx,// pozycja Y: yy, W: ww, H: hh, OX: offX,// offset( przesuniecie, uzywam do zaznaczania spriteya na sorku ) OY: offY, D: dir// obrot }; return maskacol; } this.CollisionMaskDraw = function( cmask ){ this.Save();// standardowo w html5 zapis stanu this.Translate( cmask.X, cmask.Y );// wybranie pozycji do dzialania this.Rotate( cmask.D );// obrot this.DrawRectangle( this.ViewX+cmask.OX, this.ViewY+cmask.OY, cmask.W, cmask.H, 1, "blue", "" );// i rysowanie kwadratu this.Restore(); } this.CollisionMaskUpdate = function( cmask, xx, yy, ww, hh, offx, offy, dir ){ cmask.X = xx;// update stanu( jesli obiekt sie przemieszcza ) cmask.Y = yy; cmask.W = ww; cmask.H = hh; cmask.OX = offx, cmask.OY = offy, cmask.D = dir; }
I w sumie nie wiem jak to zrobić dalej :| |
|
madmike44 |
» 2012-01-20 16:19:20 Skoro nie wiesz za dużo, poszukaj sobie na forum tematów dotyczących kolizji - było ich kilkadziesiąt. A więc: |
|
« 1 » |