!!!3DCGプログラミング 初歩の初歩から「3DCGとは?」と言ったことを説明していきます。 3Dの仮想的な世界を「'''シーン'''」と言ったりしますが、これをとある視点から とある方向を見て「2次元の絵」として描画することを「'''レンダリング'''」と言います。 シーン内には以下のような要素が存在しています。 ::視点 :::自分自身がいる位置と向いている向き、スクリーンのサイズ(幅と高さ)、 :::視野角度などを持ちます。「カメラ」とも言います。 ::光源 :::呼んで字のごとく、光の元となる要素です。 :::良く知られているものとしては、「平行光源」(Shadeで言う無限遠光源)、 :::「点光源」「スポットライト」があります。これらは光源としての大きさを持ちません。 :::これを拡張したものとしてはエリアライト(面光源)があります。エリアライトは、 :::面積を持っています。その他、線光源・物体自身を発光させて光源にしてしまう、など、いうなれば何でも光源にできてしまいます。 ::物体 :::「オブジェクト」といったりしますが、対象となる形状です。 :::式で表すことができる(球・直方体・円・四角形など。これらの基本物体を「プリミティブ」と言います)場合と、ポリゴン(頂点座標を結んで面にする)であらわされる :::場合があります。物体をどのような表現で具現化するか、といったことはソフトに依存しています。 !!レンダリング方法 !ラスタライズ方式 グラフィックアクセラレータ(GPU)としてATI/nVIDIAなどのメーカが有名ですが、 これらでのレンダリングはゲームなどのリアルタイムで使用されます。 レンダリングはZバッファベースでレンダリング処理の性質上「'''ラスタライズ方式'''」と呼ばれます。 OpenGL/DirectX(API)のように3Dの表現を行うことができるAPIがありますが、双方ともラスタライズ方式のレンダリングを行います。 これは、Zバッファにてレンダリングするため「速い」ですが、反面反射・屈折するような表現はフェイクでの表現となります。 (できないわけではありません。ちょっと細工をして反射などを実装する必要があります) !レイトレーシング方式 かわって、オフラインレンダラとして(ムービーとか映画とか)使われる手法は、 「'''レイトレーシング方式'''」がよく使用されます。 「レイトレーシング」としていますが、レイトレ的な直接照明だけの表現ではなく GI(グローバルイルミネーション)の間接照明を扱う場合も基底的に使用されます。 これは、レイを始点・方向ベクトルとして定義し、シーン内を進んだときにぶつかる オブジェクト(ポリゴン)との交差判定を行う(レイシューティングを行う)、ということを繰り返す方法です。 1ピクセルごとにレイシューティングを行うため、並列化しやすく・反射なども忠実に(割と簡単に)再現できる反面、処理時間がかかってしまいます。 ここでは、「レイトレーシング方式」に焦点を絞ってレンダラ作成に関する知識を解説していくことにします。 !!レンダラで必要な数学の基礎 *[[三角関数|三角関数_3DCG]] !!レンダラ作成に向けてのTips *[[よく使うベクトル・行列計算関数|よく使うベクトル・行列計算関数_3DCG]] *[[実装の手順|実装の手順_3DCG]] *[[アフィン変換|アフィン変換_3DCG]] *[[ポリゴンとの交差判定|交差判定_3DCG]] *[[面法線と頂点法線|面法線と頂点法線_3DCG]] *[[直交基底|直交基底_3DCG]]