ねこでじ(Nekodigi)

Nekodigi’s diary

学習中の気づきをまとめています。応援よろしくお願いします

【Processing】線と球面、線と平面の交差

成果物

www.youtube.com
今回は、前回の2次元上でのRayを、3次元に拡張しました。球と無限の大きさの平面に対応しています。

解説

計算式はこちらです。Rayの原点をo、向きをl、円の中心をc、円の半径をrとしています。
 \begin{array}{l}
b=l\cdot ( o-c)\\
c=( o-c) \cdot ( o-c) -r^{2}\\
\frac{D}{4} =b^{2} -c\\
d=-b-\sqrt{\frac{D}{4}}\\
x=o+dl\\
n_{result} =( x-c) /r
\end{array}
Wikipediaに書いてあるとうり、交点は二次方程式を解くことで求めることができます。Wikipediaのbは偶数になっていますが、ここでのbはそれを半分にした値にしています。なので判定式はD/4になっています。後は-bから判定式の平方根を引けばRayの原点から交点までの距離がわかります。-bに判定式の平方根を足せば奥側にあるもう一つの交点までの距離も求めることができますが、今回は、奥側の点に衝突することはないので省略しています。最後にo+dlをすれば、交点の場所がわかります。ちなみに、衝突した地点での球の法線は次の式で求められます。(x-c) /r
en.wikipedia.org

平面

計算式はこちらです。Rayの原点をo、向きをl、平面の中心をc、法線をnとしています。
 \begin{array}{l}
d=\frac{( c-o) \cdot n}{l\cdot n}\\
x=o+dl
\end{array}
上の式で、Rayの原点から交点までの距離がわかります。それをもとに先ほどと同様にo+dlとして交点の座標を求めることができます。

コード

Rayのリポジトリの中に追加しました。
RayCast_3DIntersectionというなまえです。
github.com