線と四角形の衝突判定

line-box-test.png

slab

slabs2.png slabの英語的な意味は、平板という意味だが、ここでは平行な平面の2つの間の空間という意味で話を進める。
3次元の四角い箱の体積というのは、
このようなslab3つ、互いに直角にの交差するところで表現できる
x軸、y軸、z軸、の3つの方向のslabで成り立っているということである。
この図の場合
黄色:x-slab
青:y-slab
赤:z-slab
になる

まずこのslabとの判定をすることによって、最初の段階で簡単に衝突してるかどうかを見抜くことができるのだ。
まず、テストしたい直線があるとして(線分でも、半直線でも、直線でもなんでもいい)
直線と、各slabと交差する線分を求める。
1つのslabと交差する線分が、他のslabと交差する線分とまったくオーバーラップしていなかったら、
その直線は、ボックスの中に入っていない。

1つのslabと交差する線分が、他のslabと交差する線分とオーバーラップしていたら
その直線はボックスの中に入っているのである

int IntersectRayAABB(Point p,Vector d,AABB a,float &tmin,Point &q){
    tmin=0.0f;//最初に衝突判定する線では-FLT_MAXを初期値として入れておく
    float tmax=FLT_MAX;
    //
}

サポートサイト Wikidot.com