Chapter1. レイトレーシング法とは何か

[—ATOC—] 1 [—AUTO_SECTION_NUMBER—] 1

レイトレーシング法とは何か

本実験ではレイトレーシング法という写実的な3DCGを生成する技術について学ぶ. レイトレーシング法(光線追跡法ともいう)は1980年にTurner Whittedによって提案された手法で,現在のより高度な3DCG生成技術の基礎となっている.

レイトレーシング法の特徴として,

  • 実装がきわめて単純である
  • 様々な幾何形状を扱うことができる
  • 完全鏡面反射や屈折を扱うことができる

といった特徴がある.以下にレイトレーシング法によって生成した画像の作例を示す.

作例:

実験環境

本実験では,実験環境としてLinux(東京電機大学の演習室PCのUbuntu)を用いる. 少なくとも基本的なシェルコマンド(ファイル操作など)を学習していることを前提とする.

また,プログラミング言語はC言語(コンパイラはgcc)を用いる.受講対象者は, C言語の機能(変数,制御構造,配列,構造体,共用体,ポインタ,etc…)に一通り触れたことのある者を前提とする.

実験用ディレクトリ

本実験用にディレクトリを用意し,そこで全ての作業を行うことを推奨する.例えば各自のホームディレクトリ直下に RayTracingという名前のディレクトリを用意する.

$ cd ~ $ mdkir RayTracing $ cd RayTracing
(※ ダラーマーク’$’を打ち込む必要はない.ダラーマークはコマンドライン端末のプロンプトを表している.)

レイトレーシング法のしくみ

我々が何らかの物体を「見る」までには,光は以下のような過程を経ている.

  1. 光源から光が発せられる
  2. 物体の表面で光が反射する.
    • (あるいは光が物体に進入し屈折する.)
  3. 観察者の目に物体によって反射(あるいは屈折)した光が届く.

図1にその様子を示す.


図1. 光が光源に届くまでの様子

レイトレーシング法は,光が光源から我々の目に届くまでの過程を目から光源に向かって 追跡しどのように見えるかを再現する手法である.

処理の手順は以下のようになる(図2).

  1. 観察者の視点位置と視線方向を決める.
  2. 視線方向で最も近い物体を探し,その物体との交点位置とその点での法線ベクトルを求める.
  3. 物体表面の光源の性質を使ってその点での色を決定する.


図2. レイトレーシング法の処理手順

このため視線追跡法という呼び方をされることもある.また英単語のrayは光線という意味の他に半直線という意味もある. 以降では半直線の意味でレイという言葉を用いる.

アルゴリズム

前節では目→物体→光源の単一の追跡のみを説明したが,我々の視界は線ではなく広がりを持っている. そこで空間中に矩形のスクリーンを想定し,スクリーン上の各点に対して前節で説明したような視線の追跡を行う. このスクリーンは最終的な出力画像に対応する.

したがって処理手順は以下のようになる(図3).

  1. 視点の位置を決める
  2. スクリーン上の各点(x,y)について以下の処理を行う.
    1. 視点から点(x,y)に向かってレイを飛ばす.
    2. そのレイと交差する物体がないか調べる.
      1. (図3a) 交差する物体がない場合,次の点を処理する.
      2. (図3b) 物体の交点と光源の間に他の物体がないならば,シェーディングの処理を行う.
      3. (図3c) 物体の交点と光源の間に他の物体があるならば,影として扱う.
    3. スクリーン上の点(x,y)における色を決定する.


図3. レイトレーシング法の処理手順

擬似コードとして表すと以下のようになる.

リスト1. レイトレーシング法の擬似コード #define WIDTH /* 画像の幅 */ #define HIEGHT /* 画像の高さ */ void raytracing() { int x,y; /* 画像ファイルをオープンする.*/ /* 画像のヘッダーを画像に書き込む. */ for ( y = 0; y < HEIGHT; ++y ) { for( x = 0; x < WIDTH; ++x ) { /* 視点から点(x,y)方向へのレイを飛ばす. */ if ( /* 交差がある場合 */ ) { if ( /* 交点と光源の間に他の物体がない場合 */ ) { /* 画素値の計算 */ } else /* 交点と光源の間に他の物体がある場合 */ { /* 画素値の計算 */ } } /* 画素値の書き込み */ } } /* 画像ファイルをクローズする.*/ } [/c]

Leave a Comment


NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>