コンピュータグラフィックス:理論(4)(抜粋)

レンダリング(1)


数学的基礎

ベクトルの内積(dot product) と外積(cross product)

ベクトル $ \overrightarrow{v_1} = \begin{pmatrix}x_1 \\ y_1 \\ z_1 \end{pmatrix} $ , $ \overrightarrow{v_2} = \begin{pmatrix}x_2 \\ y_2 \\ z_2 \end{pmatrix} $ のなす角を$\theta$とすると、
内積 $ \overrightarrow{v_1} \cdot \overrightarrow{v_1} = x_1 x_2 + y_1 y_2 + z_1 z_2 = |\overrightarrow{v_1}| |\overrightarrow{v_2}| \cos\theta $ ,
外積 $ \overrightarrow{v_1} \times \overrightarrow{v_1} = \begin{pmatrix} y_1 z_2 - z_1 y_2 \\ z_1 x2 - x_1 z_2 \\ x_1 y2 - y_1 x_2 \end{pmatrix} \equiv \overrightarrow{v_3} $ $\quad\quad\quad$計算方法
$\overrightarrow{v_3} $ は「 $\overrightarrow{v_1}$ が $\overrightarrow{v_2}$ の方向を向くように回転させたとき右ねじが進む方向 」 のベクトルであり、大きさは「$\overrightarrow{v_1}$ と $\overrightarrow{v_2}$が作る平行四辺形」の面積と等しい。
$|\overrightarrow{v_3}| = |\overrightarrow{v_1}| |\overrightarrow{v_2}| \sin\theta $
$\overrightarrow{v_3} \cdot \overrightarrow{v_1} = 0 \quad , \quad \quad \overrightarrow{v_3} \cdot \overrightarrow{v_2} = 0 $

証明

$\displaystyle \begin{eqnarray} \overrightarrow{v_3} \cdot \overrightarrow{v_1} & = & (y_1 z_2 - z_1 y_2)x_1 + (z_1 x_2 - x_1 z_2) y_1 + (x_1 y_2 - y_1 x_2) z_1 \\ & = & x_1 y_1 z_2 - x_1 y_2 z_1 + x_2y_1z_1 - x_1y_1z_2 + x_1y_2z_1 - y_1x_2z_1 \\ & = & 0 \\ \overrightarrow{v_3} \cdot \overrightarrow{v_2} & = & (y_1 z_2 - z_1 y_2)x_2 + (z_1 x_2 - x_1 z_2) y_2 + (x_1 y_2 - y_1 x_2) z_2 \\ & = & x_2 y_1 z_2 - x_2 y_2 z_1 + x_2 y_2 z_1 - x_1 y_2 z_2 + x_1 y_2 z_2 - x_2 y_1 z_2 \\ & = & 0 \\ \end{eqnarray} $
$|\overrightarrow{v_3}| = |\overrightarrow{v_1}| |\overrightarrow{v_2}| \sin\theta $ を証明する。 ベクトル $ \overrightarrow{v_1} = \begin{pmatrix}x_1 \\ y_1 \\ 0 \end{pmatrix} $ , $ \overrightarrow{v_2} = \begin{pmatrix}x_2 \\ y_2 \\ 0 \end{pmatrix} $ とおいても一般性能は失われない。このとき $ \overrightarrow{v_3} = \begin{pmatrix}0 \\ 0 \\ x_1 y_2 - y_1 x_2 \end{pmatrix} $
$ \overrightarrow{v_1}$ と $ \overrightarrow{v_2}$ のなす角を $\theta$ とすると、
$\displaystyle \begin{eqnarray} |\overrightarrow{v_1}| |\overrightarrow{v_2}| \sin \theta & = & |\overrightarrow{v_1}| |\overrightarrow{v_2}| \sqrt{1-\cos^2 \theta} \\ & = & |\overrightarrow{v_1}| |\overrightarrow{v_2}| \sqrt{1- \left( \frac{\overrightarrow{v_1} \cdot \overrightarrow{v_2}}{|\overrightarrow{v_1}| |\overrightarrow{v_2}|} \right)^2 } \\ & = & \sqrt{|\overrightarrow{v_1}|^2 |\overrightarrow{v_2}|^2 - (\overrightarrow{v_1} \cdot \overrightarrow{v_2})^2} \\ & = & \sqrt{(x_1^2 + y_1^2)(x_2^2+y_2^2) - (x_1 x_2 + y_1 y_2)^2} \\ & = & \sqrt{x_1^2 x_2^2 + x_1^2 y_2^2 + y_1^2 x_2^2 + y_1^2 y_2^2 - (x_1^2 x_2^2 + 2 x_1 x_2 y_1 y_2 + y_1^2 y_2^2)} \\ & = & \sqrt{x_1^2 y_2^2 - 2 x_1 x_2 y_1 y_2 + y_1^2 x_2^2} \\ & = & \sqrt{ (x_1 y_2 - y_1 x_2)^2} \\ & = & |x_1 y_2 - y_1 x_2| \\ & = & |\overrightarrow{v_3}| \end{eqnarray} $

概要

「レンダリング」とは 「コンピュータ内部に記述された形状データから2次元デジタル画像を生成する処理」 のことである。光の物理的な性質に基づいて描画を行うことで写実的な画像を生成できる。


写実表現のレベル

3次元物体を2次元画像として表示する。 カメラで実際の物体を撮影したときに得られるような 写実的な画像を生成するフォトリアリスティックレンダリング手法が開発されてきた。


リアリティの要素

写実的表現のためのモデリング

3次元モデルの幾何学的形状だけでなく、物体の材質や 表面の滑らかさなどの物理的な属性も重要である。 複雑なシーンについてリアルな画像を生成するには、適切なモデリングと レンダリング手法を組み合わせることが必要となる。

レンダリングを構成する処理



陰面消去

バックフェースカリング

バックフェースカリング (back-face culling) は、陰面消去の前処理で、 視点から不可視となる裏面を除去する処理のことである。 面の法線ベクトル $\vec{N}$ と視線方向ベクトル $\vec{V}$ のなす角度が、鋭角のときは可視(表面)、 鈍角のときは不可視(裏面)と判断する。 ベクトルの内積 $\vec{V}\cdot\vec{N}$ で計算できる。

$\vec{V}\cdot\vec{N} = |\vec{V}| |\vec{N}| \cos \theta$


視線方向ベクトルと法線ベクトル

視線方向ベクトル V は、面を構成する任意の頂点 $\vec{P_i}$ から視点 $\vec{P_E}$ へのベクトルなので $\vec{V} = \overrightarrow{P_i P_E} = \vec{P_E} - \vec{P_i}$ となる。

物体を構成する凸ポリゴンの頂点は、物体を外側から見て反時計回りに番号付けされているものとする。 ポリゴンの任意の3頂点を$P_i$, $P_j$, $P_k$ (ただし$i \lt j \lt k$)を用いて、 法線ベクトル $\vec{N}$ は次の式で計算できる。
$\vec{N} = \overrightarrow{P_j P_i} \times \overrightarrow{P_k P_j} = \overrightarrow{P_i P_j} \times \overrightarrow{P_j P_k}$

2つのベクトルの外積とはつぎのような計算である。 $ (x_0,y_0, z_0) \times (x_1,y_1, z_1) = ( y_0 * z_1 - y_1 * z_0 , z_0 * x_1 - z_ 1 * x_ 0 , x_0 * y_1 - x_1 * y_0 ) $

隠面消去法

Zバッファ法

Zバッファ法 (Z-buffer algorithm) は、画素ごとに奥行きの判定を行い 隠面消去を行う方法。

フレームバッファ (画像の画素の色を格納する)と同じ解像度の Zバッファ (奥行きであるz座標を格納する。デプスバッファとも言う) を設ける。



ポリゴンの奥行き(z値)の計算
  1. ポリゴンの法線ベクトル $\vec{N} =(n_x, n_y, n_z)$ 、 ポリゴンのいずれかの頂点を $\vec{P_i} = (x_i, y_i,z_i)$, ポリゴンを含む平面上の点を $\vec{P} = (x,y,z)$ とすると、 $\overrightarrow{P_i P} \cdot \vec{N} = 0$ これを成分で表すと $n_x x + n_y y + n_z z - (n_x x_i + n_y y_i + n_z z_i) = 0$ 。
  2. $z = (-n_x x - n_y y + n_x x_i + n_y y_i +n_z z_i) / n_z$
  3. すなわち、$x$が1だけ変化すると$z$は$-n_x / n_z$変化するだけなので、単なる加算で計算できる。
Zバッファ法の特徴

コンピュータグラフィックス:理論(5)(抜粋)

レンダリング(2)


シェーディング

光源によって照らされた、物体の面の明るさや色を求める際に、 光の物理手な性質や法則をシェーディングモデルに導入することにより、 リアルな画像を生成することができる。

シェーディングの基礎と概要

3次元CGにおいて、光の当たり具合によって濃淡が変化する部分の明るさを 計算して表示することを「シェーディング (shading) 」とよぶ。

他の物体や面によって光が遮られた領域には影 (shadow) ができる。 影を表示するには、影付け (shadowing) の処理が必要となる。


放射量と測光量

光は電磁波であり、エネルギーは放射によって伝播し、波長の違いは色として認識される。 光の物理エネルギーは放射量(radiant quantities)として、 人間の眼が感じる明るさは測光量(luminous quantities)として扱われる。


シェーディングモデル

光源によって照らされた物体を表示するための物理モデルが 「シェーディングモデル(shading model, 照明モデル、ライティングモデルとも言う)」。

光源の種類には平行光線、点光源、線光源、面光源がある。

光と物質の相互作用で光は分類できる。

環境光

「環境光(ambient light)」とは間接光を非常に大まかに近似したもので、 周囲からくる一様な光である。 環境光に照らされた物体面の反射光の強さ$I$ は $k_a$を環境光に対する反射率、 $I_a$を環境光の強さとすると $I = k_a I_a$ となる。環境光は陰や影の領域にもある程度の明るさを与えるために 用いられる。 間接光を精度良く計算する手法に「ラジオシティ法 」がある。

拡散反射

「拡散反射 (diffuse reflection)」とは、 入射した光が物体内部の浅い部分で多重散乱したあと、表面から放射された 光である。 石膏やチョークの表面での反射のように、どの方向から見ても物体面の 輝度が一定となる反射である。

鏡面反射

「鏡面反射 (specular reflection)」は、物体表面での直接反射によって生じた光である。 金属表面などでは、鏡面反射によりハイライト (highlight)を生じる。 入射角と等しい反射角となる正反射方向に強く反射される。


鏡面反射の計算よく用いられる「フォンのモデル」では、 視点方向と正反射方向のなす角 γ により、鏡面反射成分を cos n γ で減少させる。 入射光の強さを $I_i$, 視線方向と正反射光のなす角を γ , 面の鏡面反射率を $W(\alpha)$ とすると、 鏡面反射光の強さ $I$ は $I = W(\alpha) I_i \cos^{n}\gamma$ となる。 入射光の波長によって鏡面反射律は異なるが、通常は一定値として計算することが多い。

より精密なモデルである 「ブリンのモデル」では、「面を微小な完全鏡面反射面の集まりと考えて、その微小な面の 法線を特定の分布にしたがって設定する」。 さらに改良した 「クック・トランスのモデル」では、 反射率が光の波長に依存することや、反射率分布の入射角に依存することを 考慮して計算する。

スムーズシェーディング

曲面を小さなポリゴンで近似して表示を行うことが多い。