Ray Tracing in WebGL » Cylinder

Rendering of a cylinder

Equation of a cylinder

まず円柱を表す式について確認する.下図において,p1が3次元座標の原点,p2がz軸上にある場合,無限に長い円柱は以下の式で表される.

(1)x2+y2=r2

円柱のローカルな基底は以下のように求められる.これらは一般に,グローバル座標系の基底とは向きが異なり,原点も別の位置にある.

(2)RX=p3p1|p3p1|,  RZ=p2p1|p2p1|,  RY=RZ×RX

ローカル座標(X,Y,Z)からグローバル座標(x,y,z)への変換は以下のように表される.

(3)[xyz]=[RXRYRZ][XYZ]+p1

Intersections of a ray and a cylinder

一般の位置・方向の円柱を式で表すと複雑になるので,(1)で表された円柱と直線の交点を求めよう.

(4)[xyz]=[xoyozo]+t[ulvlwl]

直線(3)をローカル座標に変換すると,(4)の形に書き換えられる.

(5)[XYZ]=[XoYoZo]+t[UlVlWl],  where  [XoYoZo]=[RXRYRZ]T{[xoyozo]p1},  [UlVlWl]=[RXRYRZ]T[ulvlwl]

これを(1)に代入し,tについての2次方程式を解くと,円柱と直線の交点がローカル座標で求められる.

(6)(Xo+tUl)2+(Yo+tVl)2=r2(7)(Ul2+Vl2)t2+2(XoUl+YoVl)t+Xo2+Yo2r2=0

交点の数は判別式を用いて確認できる.

(8)D=(XoUl+YoVl)2(Ul2+Vl2)(Xo2+Yo2r2)

交点が存在する場合,対応するtは以下のように求められる.

(9)t±=(XoUl+YoVl)±DUl2+Vl2

これより交点のローカル座標は以下のように表される.

(10)[X±Y±Z±]=[XoYoZo]+t±[UlVlWl]

得られた交点が,円柱の特定の一部に含まれるかは,以下の条件を確認すればよい.

(11)0z|p2p1| (12)start_angleθend_angle,  where  θ=atan2(y,x)