<戻る

2D衝突編
その4 正方形と正方形

 正方形と正方形の衝突は、これまでの章よりも格段に面倒になります。ただし、正方形の辺がX軸、Y軸に常に平行である場合はとっても簡単です。



@ 正方形の辺が軸に平行な場合

 正方形は1辺の長さと基準となる点があれば表現できます。通常、基準点は正方形のど真ん中、つまり対角線の交点を当てます。この方が色々と応用が利くためです。

正方形1 : 制御点P1(x1, y1)、辺の長さL1
正方形2 : 制御点P2(x2, y2)、辺の長さL2

 正方形の辺が軸に平行な場合、衝突判定はさほど難しくはありません。正方形1の左端座標はx1-L1/2、右端はx1+L1/2ですから、その間に正方形2の頂点が含まれていると、衝突している可能性があります。さらに、正方形1の下はy1-L1/2、上はy1+L1/2ですから、その間に正方形2の頂点が含まれていたならば衝突していると判定できます。

 軸に平行な正方形の当たり判定をまとめます。

正方形2の頂点 Vn(vnx, vny) , n={1,2,3,4}
(x1-L1/2)≦vnx≦(x1+L1/2)
かつ(y1-L1/2)≦vny≦(y1+L1/2)
が成り立てば衝突を起こしている

最悪の場合16回の判定を要します。ちょっと非効率な気もしますが、仕方ないところです。



A 回転する正方形の衝突

 正方形が制御点を軸として回転しだすと、その衝突判定はとたんに面倒になります。まず、回転角度θを追加します。

正方形A : 制御点PA(xa, ya)、辺の長さLa、回転角度θa
正方形B : 制御点PB(xb, yb)、辺の長さLb、回転角度θb

図では正方形Aがプラス角度に、正方形Bがマイナス角度に回転しています。衝突を起こしている場合、正方形Aの中に正方形Bの頂点が含まれているはずです。

 今、正方形Aのどこか1点から時計回りに頂点の座標が連続定義されているとしましょう。すると、時計回りのベクトルが描けます。さてここで、点が内側にある場合、4つのベクトルから見れば、その点はいつでも右側にあるように見えます。

点が外部にある場合、例えば左下のオレンジの点の場合、v1からは左に位置しています。これで判定すれば良いのです。

 ベクトルに対して点が左右のどちらにあるのか?これを一発で調べられる便利な演算がありました。外積です。例えば、v1の始点を(vx1, vy1)、終点(vx2, vy2)をとし、調べたい点(正方形Bの頂点)をP(xp, yp)とします。この時外積、

(vx2-vx1)*(yp-vy1) - (xp-vx1)*(vy2-vy1)

がプラスならば、点はベクトルv1の左側に位置します。同じ事を他のベクトルに対しても行えば、正方形Bの1つの頂点に対しての判定が終わります。これを4頂点について行います。

 回転のある正方形の衝突判定をまとめます。

正方形Aの頂点から出来るベクトル VAn=(vaxn, vayn), n={1,2,3,4}
正方形Bの頂点と正方形Aの頂点から出来るベクトル VBm(vbxm, vbym), m={1,2,3,4}
VAn×VBmで、1つのmに対すしn=1,2,3,4すべてにおいて
VAn×VBm≦0となれば衝突を起こしている。

この考え方は、正方形同士だけでなく、時計回りのベクトルで構成されたすべての平面について成り立ちます。ただ、効率面からはあまりよくはありません。(といっても効率の良い方法は特に無いのですが・・・)