結構なボリュームの特集を最後まで取り上げるのは大変なので、今回は「球に陰影をつける」ところまでやってみます。
その先は、またいつか。
レイトレーシング
レイトレーシングとは
レイトレーシングは,光線追跡法あるいは視線探索法と訳されています.
「Ray」は、光線の意味もありますが、「視線の直線と物体の交点を求める」というアルゴリズムからして、この場合は「視線」と訳す方が適切と言えます。
レイトレーシングの実装
以下の各項目を入力し、レンダリング開始ボタンを押すと、描画が始まります。
途中でやめる場合は停止ボタンを押します。
一時停止したい場合は、ポーズボタンで止め、同じボタンが再開ボタンに変わるので、それで再開します。
視線は、視点(x,y,z)=(0,0,-1000)から目標点(0,0,0)を、z座標-400のところにある640×480ピクセルのスクリーンを通して見るように固定されています。
点光源は、一つの点から物体を放射状に照らす光源で、位置を座標で指定します。ただし今回は、光の強さは光源から離れても常に一定で計算しています。
球は、中心は原点固定、半径は、x軸、y軸、z軸それぞれに設定できます。
球の色は、アンビエント、ディフューズ、スペキュラーの3つのパラメータで決まります。なお、色はRGB(赤緑青)をそれぞれ、0~1の範囲で指定します。
アンビエントは環境光による色で、光が当たっていない場所も含めて満遍なく付けられる色になります。
ディフューズは散乱反射光による色で、光の角度で色が変わりますが、見る角度が変わっても色は変わりません。
スペキュラーは光沢による反射光で、見る角度で色が変わり、光がちょうど反射してくる角度から見ると一番明るく見えます。累乗係数は、明るく見える範囲が、値が小さければ広く、値が大きければ狭くなります。
タイルサイズは、1ピクセルごとに描画すると時間がかかるので、たとえば10であれば、10×10ピクセルごとに描画します。値を小さくすればより細かい描画になりますが、描き終わりまでに時間がかかるようになります。
再帰呼び出し単位は、例えば、100なら、100個点を描くごとにしか止めたりできなくなります。値を大きくした方が処理が速くなりますが、途中で止めたりしづらくなったり、ブラウザの制約で処理が途中でエラーになってしまったりする可能性があります。この辺りの仕様は、もともと点一つごとに止められるように作っていた名残で、高速化の余地がありそうではありますが、今回はこれで行きます。
- 点光源
- 球
- 半径
- アンビエント
- ディフューズ
- スペキュラー
- タイルサイズ
- 再帰呼び出し単位