レイトレーシング

レイトレーシングとは

コンピュータによって3次元の画像を計算するアルゴリズムの一方法である。
簡単に考え方を述べると、現実の世界では太陽や蛍光灯から出た光が 物体に当たって反射し、その反射した光が人間の目に入ってものを見ることができる。 レイトレーシングではそれとは逆に目から視線が出て、その視線が物体に 当たった時、その物体が見えていると考える。 そしてその視線が物体に当たった点に当たっている光の強さの程度に よって、その点の色を決定する。
3次元の画像を生成するためのアルゴリズムは他にも代表的なものとして、 スキャンライン、zバッファ などがある。
レイトレーシングは例えばスキャンラインやzバッファと比べて次のような特徴がある。

要するにきれいな絵が作れて、プログラムも比較的作りやすいが、 少しばかり計算に時間がかかるということである。

レイトレーシングの基本原理

視点からある方向に視線を伸ばして、その伸ばした彼方に物体があれば 視点と物体の交点における色を計算する。これがレイトレーシングの基本である。
つまり現実の世界とは逆の方向に光をシュミレーションしているともいえるだろう。
これらの計算をするためには最低限視点の位置、視線の方向、物体の位置や 半径、物体の表面の色、ライトの位置と方向などが決まっていなければならない。
また、より美しい画像を作ろうと思えば、反射、透過、屈折、影、 カラーマッピング、バンプマッピングなどの効果を駆使することになる。
レイトレーシングではこれらの効果を比較的簡単にプログラミングすることができる。

視線と球の交差判定

視線と球の交差判定は幾何学を使用してもできるが、ベクトルを使って 考えた方がはるかに簡単なのでベクトルと2次方程式を組み合わせた方法によって解説することにする。

必要な知識

交差判定の求め方

v を視点から球の中心へのベクトルとすると、 fromを視点ベクトル、pointを球の中心のベクトルとして、

v = from - point

toを視線ベクトルとして、その長さが1だとする。

(1) |to| = 1

tをある変数として、スカラー積t*toのところで視線が球と 交差すると仮定する。
その時、球の中心から視線と球との交点までのベクトルは

t*to - v

として表される。
このベクトルの内積は、この球の半径radの2乗に等しいので、

(t*to - v, t*to - v) = rad*rad

この式を展開して、

(to, to)*t*t - 2*(v, to)*t + (v, v) - rad*rad = 0

(1)より

(to, to) = |to|*|to| = 1*1 = 1

よって

t*t - 2*(v, to)*t + (v, v) - rad*rad = 0

これをtについての2次方程式と見ると

a = 1
b = 2*(v, to)
c = (v, v) - rad*rad

ゆえに2次方程式の解の公式から

(2) t = (-b + sqrt(b*b - 4*a*c))/(2*a)
= (-2*(v,to) + sqrt(2*(v,to)*2*(v,to) - 4*((v, v) - rad*rad))/2
= (-2*(v,to) + 2*sqrt((v,to)*(v,to) - ((v, v) - rad*rad))/2
= -(v,to) + sqrt((v,to)*(v,to) - ((v, v) - rad*rad)))
(2)' t' = -(v,to) - sqrt((v,to)*(v,to) - ((v, v) - rad*rad))

ここでtが実数解を持てば視線が球と交差するのでそのための条件は

det = (v,to)*(v,to) - (v,v) + rad*rad

として

det >= 0

である。この時視線が球と交差する。(2)と(2)'から

(3) t = -(v,to) + sqrt(det)
(3)' t' = -(v,to) - sqrt(det)

このtとt'のうちで
視点の前方にあってかつ小さい方が求める値となる。
この時注意しなければならないのは、t,t'の実数解が上の式から 求まったとしても、

t < 0 && t' < 0

ならば視線と球の交点は全部視点の後ろ側にあることになり、 その点は見えないことになるということである。
結局視線が球と交差する条件は

(4) det >= 0 && ( t > 0 && t' < 0 )

または(t > t' なので)

(4)' det >= 0 && t' > 0

視線が球と交差する点は
(4)の時

t*to

(4)'の時

t'*to

となる。

image of ray intersection

投影、法線とシェーディング

視線ベクトルの作り方、法線の求め方とシェーディングの方法について、 最も簡単なアルゴリズムを紹介する。

平行投影

レイトレーシングにおいてカメラや人間の目に相当するものを作る時、 簡単な方法としてこの平行投影の方法がある。
この平行投影ではカメラが無限の遠方にあると仮定して計算を行なう。
例えばz軸のプラス方向の∞から見ているとすると、視線ベクトルは
(0.0, 0.0, -1.0)
になり、投影するスクリーンの範囲(つまりレンダリングされた画像の範囲)を
たとえば、
x方向が -1.0 ~ 1.0
y方向が -1.0 ~ 1.0
であれば、視点の位置はスクリーンの位置を3.0とすると
(x, y, 3.0) x,y が-1.0 ~ 1.0の範囲で動く
となる。

法線ベクトルの求め方 (球の場合)

法線ベクトルとはその点における垂直なベクトルのことである。
法線ベクトルは長さを1にして計算に使用するのが普通だ。
不規則な形の法線ベクトルを求めるのは面倒だが、球の場合は簡単である。

(計算方法)
"視線と球の交差判定" で求めたtによって、視線と球の交点の座標を表す ベクトルは t*toになる。
求める法線ベクトルnは球の中心pointから、この交点にまで伸ばした ベクトルになる。

n = t*to - point

nが求まったら、nの長さを1にします。nの長さを|n|として、

n = 1/|n|*n = (x/|n|, y/|n|, z/|n|)

Lambertの余弦則

シェーディングのアルゴリズムの中ではもっとも簡単な方法で、どの角度からその表面を見ても同じ明るさで見えるような物体の陰影を計算する方法である。
つまりざらざらしたプラスチックのような質感になる。
つるつるした金属のようなハイライトはつかない。
計算のためにはその点における法線ベクトルnと表面の色c、ライトの向きを表すベクトルLとライトの光の強さIpが必要である。
それからその物体の拡散反射係数kdを適当に決めてやります。この値は0.0から1.0の間にする。

(計算方法)
まず入射角θのcosの値を求める

|L| = 1
|n| = 1

として

cosθ = (−L,n)

そして表面の輝度Idを求める。

Id = kd*Ip*cosθ

このIdに物体の表面の色を掛けてその点の色が決まる。

r = Id*cr
g = Id*cg
b = Id*cb

home | index
Mail