BOX COLLISION
eli siis se laatikkotörmäys. Kun kaksi kappaletta liikkuu ruudulla, on hyvä tietää josko net ovat törmäämässä.
Tähän tuli pyörä, vai liekkö tässä tapauksessa laatikko, keksittyä uudelleen.
A
B
Eli meillä on laatikot A, ja B, joilla on koordinaatit x, y, leveys & korkeus w, h.
Pystyakselin törmäys:
Jos A.x + A.w // oikea ylänurkka
on suurempi tai yhtäsuuri kuin B.x // vasen ylänurkka
JA
A.x on pienempi kuin B.x + B.w
Niin, kappaleet ovat samalla pystylinjalla, ja voimme tarkistaa varsinaisen törmäyksen.
Jos samalla linjalla olevissa kappaleissa,
A.y + A.h eli kappaleen A alareuna, on suurempi kuin B.y,
JA
A.y on pienempi kuin B.y, A ja B ovat törmänneet reunoistaan, B:n yläreunasta.
alapuolen törmäykseen voimme vain nakata A:n ja B:n ristiin.
Vaakasuuntaisessa törmäyksessä käännämme vain yhtälön kyljelleen.
A
B
Pseudokoodia:
if a.x+a.w <= b.x and a.x <= b.x+b.w then:
if a.y+a.h >= b.y and a.y < b.y then:
collision at b.y
if b.y+b.h >= a.y and b.y < a.y then:
collision at b.y+b.h
if a.y+a.h <= b.y and a.y <= b.y+b.h then:
if a.x+a.w >= b.x and a.x < b.x then:
collision at b.x
if b.x+b.w >= a.x and b.x < a.x then:
collision at b.x+b.w
Nyt, tämä koodi tuottaa ongelmia kun useassa tilanteessa rekisteröidään sekä x- ja y-akselin törmäys.
Tämän voi ratkaista laskemalla kollisio linjalle keskipisteestä. Esimerkiksi ylläolevassa kuvassa, kappaleen A keskipisteestä piirretyssä pysty- ja vaakasuuntaisissa linjoissa x-akselilla ei tapahdu törmäystä kappaleeseen B, kun taas y-akselilla tapahtuu. Yleisesti, boxcollision on lähinnä lähtökohta tarkemmalle törmäystarkastelulle.
No comments:
Post a Comment