CGによる画像生成では、まず描きたい物体の形・位置・大きさなどをコンピュータ内部の データとして表現しなければならない。 この作業が「モデリング」であり、できあがったデータが「モデル」である。
稜線だけを記録することによって立体を表現したモデル。 高速に処理できるが、面のデータを持たないために隠面消去や隠線消去できず、 たとえば図3.2[a]において[b]〜[d]のどれを表しているかわからない点が 欠点としてあげられる。
ワイヤフレームモデルの稜線のデータに、面の情報を付加したモデルで 隠線消去、陰面消去、面の陰影表示が行える。 どこが物体の内部であるかの情報をもたないため、体積計算や、物体同士の集合演算が できない点が欠点としてあげられる。
サーフェスモデルのデータに、物体の内外を区別する情報を持ち,内部の詰まった 演算物体を表現できる。 物体同士の集合演算や、干渉計算、有限要素法によるさまざまな解析などを行うことができる。
B-reps (boundary representations) とも呼ばれ、頂点 (vertex), 稜線 (edge), 面 (face) のデータと、その接続関係をグラフで保持することにより立体を表現する。
CSG (Constructive Solid Geometry) は、プリミティブ (primitive) とよぶ 基本立体を集合演算によって組み合わせることにより立体を表現する。 基本立体は直方体・円柱・多面体・錐体・球・半空間(平面で分けられた一方)などが、 集合演算には和(union)・積(intersection)・差(differenc)などがある。
スイープ表現 (sweep representation) は、立体の断面を表す2次元図形を、定められた 軌道 (trajectory) に沿って移動したときの軌跡として形状を表現する。
立体を表現する最も簡単なデータ構造は、頂点の座標と面を構成する頂点番号の 並びを配列に格納したもの(例が図3.11)であるが、面を構成する頂点の数が可変個 である上に、面の接続関係がわかりにくい。
そこで、境界表現として、ウイングドエッジ (winged-edge) 構造とよばれる データ構造を用いて、要素間の接続関係を管理する。 図3.5[a]の四角錐のウイングドエッジ構造での表現は図3.12で、 [a]が稜線Eを中心に頂点・面・稜線の接続関係、 [b]が頂点のx,y,z座標データ、 [c]が稜線ごとの頂点・稜線・面の結合状態である。
ソリッドモデルで扱う立体は二多様体 (two-manifold) とよばれるもので、 面に穴を含まない場合、面の数 f, 稜線の数 e, 頂点の数 v の 間に v - e + f = 2 という式(オイラーの公式)が成り立つ。 この関係を保持するように変形する操作が「オイラー操作 (Euler operation) 」であり、 「局所変形 (local transformation)」とも呼ばれる。 図3.15[a]は、 「新しい頂点と稜線を追加することで頂点を分割するMEV (Make Edge Vertex)操作」 と「頂点と稜線を削除するKEV (Kill Edge Vertex)操作」を、 図3.15[b]は 「新しい稜線と面を追加することで面を分割するMEF (Make Edge Face) 操作」 と 「稜線と面を削除するKEF (Kill Edge Face)操作を示している」 示している。
立体の稜線を曲線で、面を曲面で表す方法について説明する。 表示のときに曲線を近似的に折れ線として、曲面をポリゴンの 集まりとして表現する場合でも、モデルは曲線・曲面で表現して おくとメモリの節約になる。
1つの座標値を他の座標値の関数によって定める。
平面曲線: y = f(x), 曲面: z = f(x,y)
関数を陰に用いて曲線や曲面を定義する(1つの等式により1自由度が制限されるので)。
平面曲線 f(x,y)=0, 空間曲線 f(x,y,z) = g(x,y,z) = 0, 曲面 f(x,y,z) = 0この形式は交点計算などには適しているので、たとえばレイトレーシング法に向いている。 しかし、曲線や曲面を表示するために値を求めるためには方程式を解く必要があり、 面倒である。 関数が多項式関数であるものを「代数曲線(algebraic curve)」や 「代数曲面(algebraic surface)」とよぶ。 2次の代数曲線は「2次曲線(quadratic curve)」や「円錐曲線(conics)」、2次の代数曲面は 「2次曲面(quadratic surface)」とよばれる。
個々の座標をパラメータ (媒介変数, parameter) の関数として表現する。
平面曲線 x = f(t), y = g(t) 空間曲線 x = f(t), y = g(t), z = h(t) 曲面 x = f(u,v), y = g(u,v), z = h(u,v) (例) xy平面上の、原点を中心とする半径rの円のパラメータ形式 x = r cos t, y = r sin t (0 ≤ t ≤ 2 π)パラメータ形式の曲線や曲面 (パラメトリック曲線やパラメトリック曲面) は、 曲線・曲面上で点列を求めることが容易であるため、CG で非常によく用いられる。 ただし交点の計算などは連立方程式を解く必要があり、面倒となる。
2次曲線は a x2 + b y2 + c + 2dxy + 3ex + 2fy = 0 のような陰関数表現によって表現される代数曲線である。 係数によって楕円、放物線、双曲線に分類される。 2次曲線が円錐曲線ともよばれるのは、円錐面の断面線として得られるからである。
2次曲線は、平行移動と回転によって、標準系 (canonical form) に変換できる。
陰関数形式 x2/a2 + y2/b2 - 1 = 0 (a, b > 0) パラメータ形式 x = a cos θ, y = b cos θ
陰関数形式 y2 - ax = 0
陰関数形式 x2/a2 - y2/b2 - 1 = 0 (a, b > 0) パラメータ形式 x = a cosh t;, y = b cosh t;
パラメトリック曲線は、おのおのの座標がパラメータの陽関数形式で表現された曲線である。 関数が多項式であれば「多項式曲線 (polynominal curve)」、 有理式であれば「有理式曲線 (rational curve)」と呼ばれる。
複雑な曲線は、複数のセグメント(区間)からなる複合曲線 (composite curve) で表される。各セグメントはそれぞれ1つの式で表わされている。 各セグメントが多項式曲線であれば区分多項式曲線 (piecewise polynominal curve), 有理式曲線であれば区分有理式曲線とよぶ。
CGでは、ファガーソン曲線、ベジエ曲線、Bスプライン曲線、 有理ベジエ曲線、NURBS (非一様性有理Bスプライン曲線)がよく利用される。
ベジエ曲線 (Bezier curve) は、制御点(control point)とよばれる 複数の点 { Pi } を、ある比率で混合することにより 表される多項式曲線である。
n次のベジエ曲線を定義するにはn+1個の制御点が必要である。 CGでは3次のベジエ曲線がよく用いられる。 この場合制御点はP0, P1, P2, P3の4点である (1 ≤ t ≤ 1)。
P(t) = P0B30(t) + P1B31(t) + P2B32(t) + P3B33(t) ...式(3.21)
混合比を表す関数 B3i(t)は3次の バーンスタイン基底関数 (Bernstein basic function)は式(3.22)である。
B30(t) = (1 - t)3 B31(t) = 3 t (1 - t)2 B32(t) = 3 t2 (1 - t) B33(t) = t3
一般に n 次のベジエ曲線は、n+1個の制御点にn次のバーンスタイン基底関数 Bin(t)を混合比として P(t) = Σni=0 PiBin(t)である。また、バーンスタイン基底関数は Bin(t) = iCn t i(1-t) n-i である。
ベジエ曲線では、 曲線の両端点が両端の制御点 P0, Pn に一致し(端点一致性)、 そこでの接ベクトルがベクトルP0P1および ベクトルPn-1 , Pnの向きと一致する。 また、制御点によって定義される凸包 (convex hull) の中に、曲線が完全に含まれる。
Bスプライン曲線 (B-spline curve) は、制御点 { Pi } と ノット列 (knot vector) { ti } によって定義された曲線である。 複数の多項式曲線を接続して1本の曲線としたもので、 接続点でのパラメータの値を指定するのがノットである。
ノット列を使ってBスプライン基底関数を求める。 一様3次Bスプライン基底関数は 式(3.30) となる。 一様n次Bスプラインのとき 「Cn-1連続」となるので、 一様3次Bスプラインでは C2連続であり、法線方向だけでなく 曲率まで連続となる。
2次曲面は、2次多項式によって表現される代数曲面である。
a x2 + b y2 + c z2 2eyz + 2fzx + g2xy + 2hx 2iy + 2jz = 0 式(3.34)
2次曲面はa〜jの値によって図(3.34)の9種類に分類される。
パラメトリック曲面 (parametric surface) は、座標がS=F(u,v)として 表現された曲面である。 Fがu,vについての多項式や有理式である、多項式曲面や有理曲面がよく用いられる。 Fがu,vについてそれぞれn次、m次であるときは n×m次曲面とよばれ、 n=mのときは双n次曲面と呼ばれる。
複雑な形状は、複数の曲面(パッチ、patch)をつなぎあわせて表現し、 複合曲面 (composite surface) とよぶ。
CGでよく使うのは、双3次クーンズ曲面、ベジエ曲面、Bスプライン曲面、 有理ベジエ曲面、NURBS曲面である。 このうち、制御点を用いて形状を決定する4種類の曲面の性質が表(3.3)である。
ベジエ曲面 (Bezier surface) は (n+1)×(m+1)個の格子状に並べた 制御点 { Pij } によって定義される曲面である。 P00, Pn0, P0m, Pnm の4個の制御点が4隅の位置を指定し、その他の制御点で 曲面の形を定める。 ベジエ曲面は、 u をパラメータとする曲線の制御点をパラメータ v 方向 に沿って移動するような、ベジエ曲線の移動軌跡とみなすことができる。
CGでは、3次までのベジエ曲面がよく用いられる。 双3次ベジエ曲面は、16個の制御点P00, ..., P33 によって定められる(図3.37)。
ベジエ曲面は次の式であたえられる。
S(u,v) = Σi=03 Σj=03 PijBi3(u) Bj3(u) Bin(u) = nCi ui (1-u)n-i n次のバーンスタイン基底関数 Bjm(u) = mCj uj (1-u)n-j m次のバーンスタイン基底関数
曲面形状に対して、レンダリング処理をほどこしディスプレイモニタに表示する場合、 「曲面表現のままで処理する方法」と、 「曲面をポリゴンで近似してから処理する方法」がある。 ポリゴンで近似する方法は、 曲面をポリゴンに分割する処理を付加するだけで あとはハードウェアが高速にレンダリングできるので、 よく使われている。
ポリゴン曲面 (polygon surface) とは、数式で表現された曲面でなく、 多数の細かいポリゴンの集合として表現された曲面である。 ポリゴンの集まりで表現された形状データをメッシュ (mesh) とよぶ。
パラメトリック曲面を用いる方法では曲面パッチ間の連続性が問題になるが、 ポリゴン曲面ではこれが保証されているのが利点である。
ポリゴン表現の面としては、平面性が保証されている三角形を使うことが多い。
細分割曲面 (subdivision surface) は、初期メッシュに単純な分割操作を 再帰的に適用してなめらかな曲面を得る手法である。
細分割曲面は分割操作を無限回適用した極限として定義されるが、個々の ポリゴンをスクリーンへ投射したときの大きさが1画素より小さくなれば それ以上の分割は不要である。
頂点を追加し、メッシュの分割の仕方を決める。
それぞれの頂点の座標値を修正する。修正したい頂点と、その頂点に 接続しているほかの頂点座標の重み付け平均を用いる。 重みをマスク (mask) やステンシル (stencil) と呼ぶ。
四辺形を基本とする。 分割ステップでは、面上点の座標をその面の構成点の平均で求め[a]、 辺上点の座標を辺の両端点と辺の左右の面上点の平均で求める[b]。 平滑化ステップでは、頂点の座標を、頂点の元の座標とそのまわりの 面上点と辺上点の重み付け平均で求める[c]。
三角メッシュに対する細分割曲面。 分割ステップでは頂点を増やし(図3.42[a])、 平滑化ステップでは重みつけ平均で頂点の座標を修正する(図3.42[b])。
3次元デジタイザなどを用いて実物からポリゴン曲面データを得た場合は、 ノイズを除去するために、ポリゴン曲面の平滑化(smoothing)処理を行う。
ポリゴン曲面の平滑化には、画像処理用のフィルタを用いることもできるが、 曲面固有の特徴(周波数、曲率など)を考慮したフィルタが提案されている。
ポリゴン曲面では、パラメトリック曲面のようなパラメータ座標系(u,v) からの写像は存在しない。テクスチャマッピングをする場合には、 パラメータ座標系からの写像を構築する(パラメータ化、parametrization)。
ポリゴン曲面が視点からある程度離れていると、それぞれの面が1画素にも 満たない大きさになる。 その場合は、ポリゴン曲面に簡単化(simplification)を行うと処理が効率化できる。 形状の詳細度を調整する手法を、ポリゴン曲面の詳細度(LOD: Level of Detail) 制御とよぶ。
自然物や現象の表現に適した表現方法について説明する。
立体を3次元の格子点上の小立方体の集合で表すのがボクセル表現である。 ボクセル表現はデータ構造が簡単で集合演算を簡単に行うことができる。 各ボクセルに、その部分の透過率などのデータを持たせ、 物体内部まで表現したデータをボリュームデータと呼ぶ。 ボリュームデータをレンダリングするには、
「四分木」は画像集合で定義された2次元図形を表す手法である。 図形全体を囲う正方形を縦横に2等分することで4個の小正方形が 図形に完全に含まれるか、全く含まれない場合はこれ以上分割しない。 部分的に含まれる場合は、正方形を再帰的に分割する。
「八分木」は3次元図形に適用したもの。 ボクセル表現のデータを縮小したものに相当する。
全体形状と部分形状に相似関係があるとき、「自己相似性を持つ」といい そのような図形を「フラクタル」と呼ぶ。 コッホ曲線、マンデルブロ集合、ジュリア集合などがある。
「フラクタル次元」はフラクタル図形の複雑さを表す尺度である。 n倍のサイズの図形をつくるためにA 個の基本図形が必要なとき、 その空間は log A /log n 次元である。
雲、海岸線、シダの葉などの自然物の図形をコンピュータの計算によって 作り出す手法として、中点変位法、 IFS (Iterated Function system)を用いる方法、 生成文法を利用する方法などがある。
メタボールは、濃度分布を持つ球の集合によって形状を定義するもので、 雲や人体などの表現に使われる。 濃度の和が一定となる面(等値面)によって曲面を表す。 濃度分布は正規分布に基づく分布、区分的な2次関数などで定義される。 メタボールをレンダリングするにはレイトレーシング法が必要であり、 時間がかかる。 そのため、濃度分布をボクセルで表現し、マーチングキューブ法などで ポリゴン化する場合もある。
形が不定で明確な表面が存在しない物体(葉の集まりとしての樹木、 火の粉の集まりとしての炎、水滴の集まりとしての滝など)は、 一定の規則で生成したパーティクル(粒子)の集まりで表現する。
パーティクルは、位置や色などの属性を持ち、ある規則にしたがって 生成・移動・消滅する。物理的な裏付けの有る規則を用いることで、 リアルなモデルを作ることができる。