コンテンツにスキップ
- レイトレーシングとは?
- 現実世界では、太陽や電球などの光源から無数の光(光線)が放たれ、物体に当たって反射や屈折を繰り返し、最終的に私たちの目に届くことでモノの色や形を認識している。この現象をコンピュータ上で忠実に再現すれば、非常にリアルな画像を作ることができる。しかし、光源から放たれた光のほとんどは目に届かないため、計算の無駄が非常に多くなってしまう。そこで、逆に「目(カメラ)」からスクリーン(画面)の各ピクセルを通して光線(レイ)を飛ばし、物体にぶつかったらその色を計算するという、効率的な手法がレイトレーシングである。
- 「目」とは具体的にどのようなものなの?
- レイトレーシングにおける「目」とは、3次元空間上のある**「点(位置)」と「向いている方向」の情報を持つ、仮想的なカメラのこと。この点だけでは画像を生成できないため、目の少し前に仮想的なスクリーン(ビュープレーン)**を設置する。そして、最終的に出力したい画像のピクセル一つひとつに対応するスクリーンの点へ、目からレイを飛ばす。例えば、画像の左上のピクセルの色を知りたい場合、目からスクリーンの左上に向かってレイを飛ばす。そのレイが赤いボールに当たれば、そのピクセルの色は赤を基準に計算される、という仕組みとなる。このスクリーン自体は計算の補助線のようなもので、物体として当たり判定の対象になることはない。
- 物体の色はどのように決まるの?
- 現実世界でりんごが赤く見えるのは、りんごの表面が赤色以外の光を吸収し、赤色の光を主に反射する性質を持っているから。レイトレーシングでもこれを模倣し、各物体に**「マテリアル(材質)」**という情報を設定する。マテリアルには、物体の色(どの光を反射・吸収するか)、光沢(鏡のように反射するか)、透明度(光が透過するか)などの情報が含まれている。レイが物体に衝突すると、このマテリアルの情報に基づいてレイが運ぶ色の情報が変化(計算)される。
- 目からレイを飛ばすと、色の計算が逆にならないのか?
- 色の計算は、レイが物体に当たるたびに、その点に届いている光の情報を集めていく(Gathering)という考え方で行われる。例えば、レイが赤い壁に当たった場合、「この赤い壁を照らしている光は何か?」を探すために、さらに反射したレイを飛ばして光源や他の物体からの光を探しに行く。このように、光の経路を逆にたどりながら、目に届く光の情報を収集していくように計算が設計されているため、最終的に正しい色が得られる。単純な掛け算の順序の問題ではなく、光の物理法則を逆方向からシミュレートしている、と考えると分かりやすい。
- レイは物体に一度衝突したら計算は終わるの?
- 一度の衝突で終わるのではなく、現実の光が鏡やガラスで何度も反射・屈折するように、レイも物体に衝突したあと、反射や屈折をしてさらに飛んでいく。この「跳ね返り(バウンス)」を繰り返すことで、ある物体が別の物体の色を映り込ませる「映り込み」や、光が間接的に回り込んで影の中を照らす「間接光」のような、リアルな表現が可能になる。ただし、無限に計算を続けるわけにはいかないので、「最大バウンス回数」をあらかじめ決めておき、その回数に達するか、レイがどの物体にも衝突せず背景(宇宙空間など)に飛んでいったら計算を終了する。どの物体にも当たらなかった場合は、背景の色がそのピクセルの色として採用する。
- 物体との衝突判定はどのような計算になるの?
- レイと物体の衝突判定は、それぞれの図形を数式で表し、交点を求める計算で行う。最も単純な例が、レイ(直線)と球体の衝突となる。レイは一次方程式(P(t)=A+tB)で表すことができ、Aはレイの始点、Bはレイの方向、tは距離を表す変数となる。球体は中心点からの距離が一定である点の集合なので二次方程式で表せれる。この二つを連立させて解くと、tに関する二次方程式が得られる。あとは**「解の公式」**を使ってこの二次方程式を解き、解が存在するかどうか(tが正の実数解を持つか)で衝突の有無を判定する。解が存在する場合、そのtの値をレイの式に代入すれば、具体的な衝突点の座標を求めることができる。