点とカプセルの衝突
この記事では点とカプセルの衝突についてまとめていきます。
考え方
カプセルの定義
カプセルは円が線分上を移動することで出来上がる図形です。
カプセルの定義については、衝突判定用の形状定義に記載していますが、線分と円の半径(カプセルの太さ)の情報から定義しています。
衝突判定
点とカプセルの衝突を考える際に、カプセルの形のままでは判定できないので少し考え方を変えます。
点とカプセルがあります。
●をドラッグして見て欲しいのですが、まず最初に、点とカプセルの線分の最も近い点を探します。
点と線分の最も近い点の求め方は点と線分の最近傍点にて解説しているのでこちらをお読みください。
点と線分の最も近い場所がわかったら、そこに円があるものとして、その円と点が衝突しているかを調べます。
つまり、●から★までの距離と、円の半径の長さを比較します。
点と円が衝突してる場合、点とカプセルが衝突しているという事になります。
点と円の衝突は点と円の衝突で解説しているのでこちらをお読みください。
まとめ
点とカプセルの衝突は以下の手順で求める。
- 点とカプセルの線分の最近傍点を求める。
- 最近傍点に円があるものとして、点と円の衝突判定を行う。
サンプルコード
/**
* 点とカプセルが当たっているかどうか
* @param point 点
* @param capsule カプセル
*/
export function isHit(point:Vector2, capsule:Capsule)
{
// カプセルと点の最近傍点を求める
const p = PointAndSegment.getNearest(point, capsule.s);
// 最近傍点から点に向かうベクトル
const v = Vector2.sub(point, p);
// 最近傍点と点の距離がカプセルの半径(太さ)より短ければ当たっている
return (v.sqrMagnitude < capsule.r * capsule.r);
}