金森由博 (kanamori@cs, 内線 5724, F 棟 828) 工藤博幸 (kudo@cs, 内線 5516, 総合 B 棟 902)
※メールアドレスは上記 "@cs" に続けて、".tsukuba.ac.jp" としてください。
※レジュメ中の " main.cpp ファイルの RecursiveRayTrace 関数 " というのは誤りで 正しくは " RecursiveRayTracer.cpp ファイルの traceRec 関数 " です。
同梱の Visual Studio 2008 用プロジェクトファイルを用いてコンパイルする。Linux や Mac で開発したい場合は応相談。
視点から見える物体を調べるために、 視点から放射される直線 (視線) と物体とが互いに交差するかを計算する。 そして視線上の交点のうち、一番視点に近いものを出力する。 あらかじめ、レイと球や平面との交差判定は実装されているので、 それを参考に、レイと三角形の交差判定を実装する。
簡単のため、光が物体表面で 1 回だけ反射して視点に届くものと仮定すると、 物体表面での反射光の色を計算すればよい。 この色は、物体の材質によって異なる。 いくつかの単純化された材質モデルを用いて、この計算を行う。
上記 3 では反射が 1 回と単純化したが、実際には光は視点に届くまでに反射や屈折を繰り返す。 光が鏡面・屈折面のみで反射・屈折するものとして、光が複数回反射した結果得られる色を計算する。
物体表面に、関数や画像データなどを用いて模様をつける。これによって、 物体の見た目をより写実的にすることができる。
テクスチャマッピングを施したとき、特に白黒のチェッカー模様のテクスチャを使うと、 遠くの物体では模様にギザギザが現れて見た目が悪くなる。このような視覚的不具合をエリアシングとよび、 その対策をアンチエリアシングという。一般的な対策として、画素ごとのサンプル数 (レイの数) を 増やし、フィルタリングを行う。
物体を取り囲む背景を画像として与え、反射光をその背景画像に基づいて計算すると、 比較的容易に写実的な画像が得られる。物体が鏡面であり、光が物体に遮られることなく物体表面で 1 回だけ反射すると仮定する。 このとき、反射光を背景画像の対応する画素によって決定する処理は 一種のテクスチャマッピングであり、特に、環境マッピング (反射マッピング) と呼ばれる。 サイコロのような六面体の展開図として与えられる背景画像を用い、環境マッピングを行う。
環境マッピングは完全鏡面や屈折面を対象としていたが、環境マップを光源と見立てて 拡散面や光沢面の照明を行うには、あらゆる方向から入ってくる光を考慮する必要がある。
複雑な 3D モデルを表現するのに、三角形を網目状に配置した三角形メッシュがよく用いられる。三角形メッシュを読み込んでレンダリングできるようにする。
レイとの交差判定を行う対象の物体数が増えると、計算に非常に時間がかかるようになる。特に三角形メッシュなどは、ひとつの物体の中に数多くの三角形が含まれるため、レンダリングに時間がかかる。ここでは三角形メッシュに一様グリッドと呼ばれる空間的データ構造を導入し、高速化を図る。
陰関数曲面 ( f(x) = 0 という方程式の根となる点 x の集合であるような曲面 ) を用いると、なめらかな曲面を表現できる。そのひとつである、メタボールを用いて、有機的な形状をレンダリングできるようにする。
最終更新: 2011/12/07