トーラスとレイの交差判定

トーラスは3DCGではよく見かける立体ですが交差判定は結構複雑です.

トーラス

x-z平面に置かれてるトーラスの方程式は以下のようなものです.

\( (x^{2}+y^{2}+z^{2}+R^{2}-r^{2})^{2}=4R^{2}(x^{2}+z^{2}) \ldots (1) \)

これに半直線\({\bf x}={\bf p}+t{\bf d}\)を代入して$$t$$に関して整理するわけです.

(1)は解析表示なわけですが,計算が大変なので,これを無理矢理ベクトル方程式にしてみます.

\( (|{\bf x}|^{2}+R^{2}-r^{2})^{2}=4R^{2}|{\bf x}{\bf M}|^2 \ldots (2) \)

ただし

\({\bf M}=\left(\begin{array} \\ 1 & 0 & 0 \\ 0 & 0 & 0 \\ 0 & 0 & 1 \end{array}\right)\)

です.

(2)はトーラスの中心が原点にあることを前提としているので,中心が$${\bf c}$$であるとすると,以下のようになります.

\((|{\bf x}-{\bf c}|^{2}+R^{2}-r^{2})^{2}=4R^{2}|({\bf x}-{\bf c}){\bf M}|^2 \ldots (2)’\)

これに

\({\bf x}={\bf p}+t{\bf d}\)

を代入します.それでも大変なので部分部分に分けて計算します.

$$ \sqrt{(left-side)}=|{\bf p}+t{\bf d}-{\bf c}|^{2}+R^{2}-r^{2} $$

この式の一部は先日の球の式と同じなので計算を省略します.

$$ \sqrt{(left-side)}=|{\bf d}|^{2}t^{2}+2\left({\bf d}\cdot({\bf p}-{\bf c})\right)t+|{\bf p}-{\bf c}|^{2}+R^{2}-r^{2} $$

ここで$$ C_{1}=|{\bf d}|^{2} $$, $$ C_{2}=2\left({\bf d}\cdot({\bf p}-{\bf c})\right) $$, $$ C_{3}=|{\bf p}-{\bf c}|^{2}+R^{2}-r^{2} $$と置いて

$$ \sqrt{(left-side)}=C_{1}t^{2}+C_{2}t+C_{3} $$
$$ (left-side)=\left(C_{1}t^{2}+C_{2}t+C_{3}\right)^{2} $$ $$ =C_{1}^2t^{4} + 2C_{1}t^{2}\left(C_{2}t+C_{3}\right) + \left(C_{2}t+C_{3}\right)^{2} $$ $$ =C_{1}^2t^{4} + 2C_{1}C_{2}t^{3} + 2C_{1}C_{3}t^{2} + C_{2}^{2}t^{2} + 2C_{2}C_{3}t + C_{3}^{2} $$ $$ =C_{1}^2t^{4} + 2C_{1}C_{2}t^{3} + \left(2C_{1}C_{3} + C_{2}^{2}\right)t^{2} + 2C_{2}C_{3}t + C_{3}^{2} $$

$$ (right-side)=4R^{2}|({\bf p}+t{\bf d}-{\bf c}){\bf M}|^{2} $$ $$ =4R^{2}|{\bf pM} + t{\bf dM} – {\bf cM}|^{2} $$

結局こちらも$${\bf M}$$が掛かっている以外は先日の球の式と同じです.

$$ =4R^{2}|{\bf dM}|^{2}t^{2} + 8R^{2}\left({\bf dM}\cdot(({\bf p} – {\bf c}){\bf M})\right)t + 4R^{2}|({\bf p} – {\bf c}){\bf M}|^{2} $$

$$ C_{4}=4R^{2}|{\bf dM}|^{2} $$, $$ C_{5}=8R^{2}\left({\bf dM}\cdot(({\bf p} – {\bf c}){\bf M})\right) $$, $$ C_{6}=4R^{2}|({\bf p} – {\bf c}){\bf M}|^{2} $$と置いて,

$$ (right-side)=C_{4}t^{2}+C_{5}t+C_{6} $$

左右を元に戻して,

$$ C_{1}^2t^{4} + 2C_{1}C_{2}t^{3} + \left(2C_{1}C_{3} + C_{2}^{2}\right)t^{2} + 2C_{2}C_{3}t + C_{3}^{2}=C_{4}t^{2}+C_{5}t+C_{6} $$

$$t$$に関して整理して,

$$ C_{1}^2t^{4} + 2C_{1}C_{2}t^{3} + \left(2C_{1}C_{3} + C_{2}^{2} -C_{4}\right)t^{2} + (2C_{2}C_{3}-C_{5})t + C_{3}^{2}-C_{6}=0 $$

まとめると,

$$ At^{4} + Bt^{3} + Ct^{2} + Dt + E = 0 $$

$$ A=C_{1}^{2} $$
$$ B=2C_{1}C_{2} $$
$$ C=2C_{1}C_{3} + C_{2}^{2} -C_{4} $$
$$ D=2C_{2}C_{3}-C_{5} $$
$$ E=C_{3}^{2}-C_{6} $$

$$ C_{1}=|{\bf d}|^{2} $$
$$ C_{2}=2\left({\bf d}\cdot({\bf p}-{\bf c})\right) $$
$$ C_{3}=|{\bf p}-{\bf c}|^{2}+R^{2}-r^{2} $$
$$ C_{4}=4R^{2}|{\bf dM}|^{2} $$
$$ C_{5}=8R^{2}\left({\bf dM}\cdot(({\bf p} – {\bf c}){\bf M})\right) $$
$$ C_{6}=4R^{2}|({\bf p} – {\bf c}){\bf M}|^{2} $$

この四次方程式を解けば交点(最大で4つ)が求まります. 四次方程式の解法はとても難しいので次回書きます.


参考 :

Leave a Reply