すべての辺に対して分離軸を計算して、それでも分離軸がなかった場合…
その凸包の組は衝突しています。
なので、衝突の詳しい情報を得る作業に入ります。
まず、各凸包に対して一番めり込みが少なかった分離軸候補(以下辺と呼びます)と、
その辺に対して一番めり込んでいた頂点を探します。
この場合は以下の二つです。
さらにこの二つの頂点のめり込み距離を比較し、めり込みが少ないほうの辺を選びます。
距離が微妙ですが今回は青色の頂点という事にします。
そしてその辺の両端の頂点を、衝突候補点として選びます。
そしてその辺の法線ベクトルに対し、
法線ベクトルの向きが一番真逆に近い(内積が -1 に近い)もう片方の凸包の辺を探します。
この場合左下の辺になります。
次にその辺の占めるボロノイ領域(画像で赤く示した部分です)で、
衝突候補点のある辺を切り取ります。
この段階で衝突候補点が完全に無くなってしまう(領域の外)場合があります。
その際は、めり込んでいますが衝突なしという判定をします…
もう完了したも同然です。
各頂点候補点の辺へのめりこみ具合をチェックし、
めり込んでいればその頂点と辺から、衝突点、法線ベクトル、めり込み距離の情報が得られます。
めり込んでいなければその衝突候補点は衝突がなかったということです。
お疲れ様でした。以上で終了です。
頭の中でいろいろな凸包の形状の場合のシミュレーションをしてみると納得がいくと思います。
これらをプログラムに書き起こすのも一苦労ですが…w
P.S.明日からしばらく外出してます。一週間くらいで戻るかと。
Author:saharan
まだざっと目を通しただけですが、想像していた以上に難しそうで驚きました。
解説していただかなければきっとわからないままだったと思います!
これからこの記事を参考に多角形の衝突処理を作っていこうと思います。
また剛体シミュレーションの参考となる書籍やページがあれば教えていただきたいです。