コンピュータグラフィックス:理論(2)
投影
投影の原理
3次元の物体を2次元の平面に描画するには、「投影 (projection)」という操作が必要である。
投影では、3次元空間内に目やカメラの位置に相当する視点(投影中心)を置き、その前に、
図形を投影するための投影面 (projection plane) を置く。
投影 (projection) には、透視投影 (perspective projection) と
平行投影 (parallel projection) の2種類がある。
- 平行投影
3次元図形の各点から投射面に垂直に線(投射線)を引くと、投射線と投射面の交点の
集まりとして投射図が得られる。投射面上でのx', y'座標は元のx, y座標と同じである。
x' = x
y' = y
透視投影
3次元図形の各点から視点に向かって線(投射線)を引くと、投射線と投射面の交点の集まりとして
投射図が得られる。z方向に遠いほど、投射面上でのx', y' が小さくなる(遠近法)。
x' = x / z
y' = y / z
ビューボリュームと投影
投影面上に、辺が座標軸と並行な長方形(ウィンドウ, window)を考えて、
この範囲に投影される図形のみを描く。
透視投影では、視点からウィンドウをカバーする角度を考えて、これを視野角とよぶ。
視野角が小さいと望遠レンズのような効果(遠くの物体が拡大される。
遠方の物体は距離が多少違っても、投影面上での大きさはあまり変化しない)が得られ、
視野角が大きいと広角レンズ(広い範囲が見える。視野の端の歪みが大きくなる。
距離が異なると、投影面上での大きさが大きく変化する。)のような効果が得られる。
奥行き(z方向)に関しても手前と奥に投影面と並行の面を考えて、その間の図形のみを描く。
視点に近いものを「前方クリップ面 (front clipping plane)」、
遠いものを「後方クリップ面 (back clipping plane)」と呼ぶ。
この描かれる範囲をビューボリューム (view volume) と呼ぶが、
透視投影では四角錐台の形、平行投影では直方体の形となる。
ビューボリューム内部の図形を投影する手順は以下の通り。
- もとの座標系は右手系なので、左手系(画面上の座標にx軸y軸をあわせた時視点から遠いほどz座標が大きくなる)に直す。
- ビューボリュームを正規化ビューボリュームに変換する
- 正規化ビューボリュームを投影する。
z軸方向の座標ももとめて、結果として描画される範囲が
-1 ≤ x ≤ 1,
-1 ≤ y ≤ 1,
0 ≤ z ≤ 1,
の直方体に収まる座標系(投影座標系, projection coordinate system)に変換する。
ビューボリュームからはみ出す図形を描画しない処理を、「クリッピング (clipping)」 とよぶ。
透視投影の計算方法
- 右手座標系を左手座標系に直す変換は S(1,1,-1)
-
視点からウィンドウまでの距離をdとし、
ウィンドウの大きさをx方向が2a, y方向が2bとする。
正規化ビューボリュームでは、元のビューボリュームの zmaxを1に、
そこでの4隅の x, y 座標値が -1 から 1になるように拡大縮小するので、その変換は
S(d/(a zmax), d/(b zmax), 1/zmax)
となる。
- 正規化ビューボリュームは奥行きが zmin / zmax から
1 の範囲となる。これを 0〜1の範囲に変換するには、
z: zmin/zmax --> 1
z': 0 --> 1
なので、z=zminのとき z' = 0 なので z' = k (z - zmin/zmax)とおける。
この式で z=1 のとき z' = 1として
1 = k (1 - zmin/zmax)が成り立つ。
k=1/(1 - zmin/zmax)より
z' = (z - zmin/zmax) / (1 - zmin/zmax)となる。
$\tilde{z}_{min} = \frac{z_{min}}{z_{max}}$とおくと式(2.29)になる。
$
\begin{pmatrix}X'\\Y'\\Z'\\W'\end{pmatrix}
= \begin{pmatrix}
1 & 0 & 0 & 0\\
0 & 1 & 0 & 0\\
0 & 0 & \frac{1}{1-\tilde{z}_{min}} & \frac{-\tilde{z}_{min}}{1-\tilde{z}_{min}}\\
0 & 0 & 0 & 1\\
\end{pmatrix}
\begin{pmatrix}x\\y\\z\\1\end{pmatrix}
= p(\tilde{z}_{min})\begin{pmatrix}x\\y\\z\\1\end{pmatrix}
$ 式(2.29)
-
したがって、透視投影の計算全体の式は次のようになる。
$
\begin{pmatrix}X'\\Y'\\Z'\\W'\end{pmatrix} =
P(\frac{z_{min}}{z_{max}})
S(\frac{d}{a z_{max}},\frac{d}{b z_{max}},\frac{1}{z_{max}})
S(1,1,-1)
\begin{pmatrix}x\\y\\z\\1\end{pmatrix}
$式(2.32)
投影の性質
透視投影は遠近法ともよばれ、3次元空間における平行な直線群が投影図上では1点に集中する。
平行投影では、投射線が投影面に垂直な場合を「直投射 (orthographic projection)」と、
垂直でない場合を「斜投射 (oblique projection」と呼ぶ。
ビューイングパイプライン
図形が定義され、変換を受けて、最終的に表示されるまでの一連の過程を、
「ビューイングパイプライン (viewing pipeline)」と呼ぶ。
- モデリング変換
CGでは、世界の基準となる1つの座標系(ワールド座標系, world coordinate system)を設ける。
しかし、物体の形状を直接ワールド座標系で与えると、物体がワールド座標を移動するたびに
形状を定義しなおさなくてはならなくなる。
物体の形状はモデリング座標系 (modeling coordinagte system)で与えておき、
ワールド座標系に配置する際に、モデリング座標系からワールド座標系への変換を行う(図2.43[a])。
これをモデリング変換 (M)という。
複雑な物体は、モデルが階層的に定義されるので、モデリング座標系もまた階層的になる。
- 視野変換
ワールド座標系での目やカメラの位置と方向を表すには、
カメラ座標系 (camera coordinate system) を用いる。
原点は視点であり、x軸とy軸はそれぞれ最終的な画像の水平方向、垂直方向である。
さらに、視点の方向がz軸の負の方向を向く。
ワールド座標系からカメラ座標系への幾何学的変換を視野変換 (viewing transformation)
とよび V で表す。
- 投影変換
カメラ座標系を投影座標系に変換する透視投影や平行投影のことであり、
P で表す。
- ビューポート変換
投影座標系で -1 ≤ x ≤ 1, -1 ≤ y ≤ 1 の範囲が表示される範囲であり、
ウィンドウである。
実際に表示される画面上の座標系を「デバイス座標系 (device coordinate system) とよぶ。
一般には、デバイス座標系でさらに長方形を指定し、その長方形のみに表示させる。
この長方形をビューポート (viewport) と呼び、ウィンドウの範囲がちょうど
ビューポートに収まるようにする変換をビューポート変換 (viewport transformation) とよび
U で表す。
- 全体の変換
モデリング座標系の点 v' は
v' = U P V M v によって、デバイス座標系
v'=(X' Y' Z' W')t に変換される。
これは、通常座標系では (X'/W', Y'/W', Z'/W') である。
クリッピング
図形をビューポート内だけに表示させるために、表示領域外の図形の全体または一部を
除外する必要がある。これをクリッピング (clipping) とよぶ。
教科書では、p.44に2次元で線分をクリッピングするアルゴリズムが示されている。
3次元CGでは、前方と後方のクリッピング面で図形の全体または一部の
除外判定を行う操作が必要で、それを「3次元クリッピング」とよぶ。
階層モデリング
図2.48では、ワールド座標系 Cw (xwyw座標系)
をもとに
モデリング座標系 C1 (x1y1座標系)が定義され、
さらに C1 をもとに別のモデリング座標系
C2 (x2y2座標系)が定義された例である。
このような階層的なモデリング変換では、それぞれのモデリング座標系ごとに図形を描く必要が
あるが、そのためにスタック (stack) を用いる。