レイと平面の当たり判定

レイと平面の当たり判定をする必要があったので、どのように考えたのかをメモ。(正しいかどうかはわかりません)

位置 p\bm{p}、方向 d\bm{d} で表されるレイが、ある点 p\bm{p'} を通り、法線 n\bm{n} で示される平面を通過する地点までの距離 tt を求めるものとします。

p\bm{p'} からレイが衝突する地点までのベクトル m\bm{m} と法線ベクトル n\bm{n} のなす角は直角になるはずなので、以下の式が成り立ちます。

nm=0\bm{n} \cdot \bm{m} = 0

このとき、図の通り m=p(p+td)\bm{m} = \bm{p'} - (\bm{p} + t \bm{d}) で表せるので、

n(p(p+td))=0\bm{n} \cdot (\bm{p'} - (\bm{p} + t \bm{d})) = \bm{0}

となり、これを 内積計算の分配法則などを利用して 変形していくと、

npnptnd=0\bm{n} \cdot \bm{p'} - \bm{n} \cdot \bm{p} - t\bm{n} \cdot \bm{d} = \bm{0}

さらに整理して、

t=n(pp)ndt = \frac{\bm{n} \cdot (\bm{p'} - \bm{p})}{\bm{n} \cdot \bm{d}}

となります。この tt がレイの始点から平面までの距離となり、衝突位置は p+td\bm{p} + t\bm{d} で求めることができます。

なお、この式の分母 nd\bm{n} \cdot \bm{d} が 0 になる場合は tt の値を求めることはできませんが、この場合は面の法線ベクトルとレイの方向ベクトルが直交することになるので、レイと平面が平行ということになり、交わる点がないということを表しています。

このカウンタは @piyoppi/counter-tools を使っています。

クリックすると匿名でいいねできます。