2013-04-07

"コンピュータグラフィックス理論と実践" James D. Foley, Andries van Dam, Steven K. Feiner, John F. Hughes 共著

マンデルブロのフラクタル幾何学では、数学に裏付けられた抽象画に魅せられた。惚れっぽい酔っ払いは、CG芸術に惹かれる。とはいえ、なにせド素人!CG技術が概観できそうなものを探していると、ある専門家からこの本を薦められた。ちと古いが、この分野の教科書的な存在で、学生向きにも書かれているそうな。しかーし、1万5千円を超える値段にたじろぐ。図書館へ見物に行くと、千ページを超える分厚さにたじろぐ。
ところで、障害が大きいほど燃える!というのは本当であろうか?愛の場合はそうかもしれん。だが、速読術は速愛術のようにはいかんよ...

本書は、ソフトウェアとハードウェアの両面から議論される。その網羅する範囲は驚異的で、もう満腹!吐きそう!ソフトウェア面では、対話型インターフェースから、幾何変換、3次元投影法、可視面の決定における数学的方法論に、曲線や曲面の補正、色彩処理やシェーディングといったフィルタリング理論など、その技法とアルゴリズムが検討される。ハードウェア面では、画像操作と記憶メカニズムに、パイプラインや並列処理といった基本的なアーキテクチャが検討され、おまけに、SIMD や MIMD にまで議論が及び、高性能なGPUの必要性を感じさせる。メモリ資源が十分確保できれば、レイヤー毎のキャンバスをメモリ上に展開しておくことで、表示性能を向上させることができるだろう。そして、replace, and, or, xor といった単純な論理演算がサポートされるだけでも、かなりのことができそうだ。この分野は、メモリ容量、演算性能、高精細な表示デバイスといった十分なリソースが前提されるというわけか。コンピュータグラフィックスとは、ハードウェア資源の制約からソフトウェアを開放してきた歴史とすることができそうだ。それは、心理的リアリズムの追求の歴史とでもしておこうか。

  SIMD: Single Instruction Multiple Data
  MIMD: Multiple Instruction stream, Multiple Data stream

デスクトップの概念は、いまや仮想空間へ誘なうメタファのような存在となっている。その思想でよく耳にするのが、WYSIWYG(what you see is what you get)で、見たまんまの操作性に則るということ。これが対話型GUIの基本であろう。アイコンのデザインひとつとっても、設計センスがうかがえる。
しかし、良いデザインは、高精細な表示デバイスとセットで、より説得力を持つ。高精細ディスプレイだからこそ、斜線や曲線の処理を疎かにはできない。ドットが長方形に配列されれば、最も原始的な処理ではアンチエイリアシングが重要となる。画像の合成や結合などで用いるクリッピング処理では、キャラクタが背景に溶け込むような境界処理も必要となる。
表示デバイスの性能は、ドットの繊細さとアドレス指定能力で決まるという。ドット間隔がドットサイズよりも小さく指定できれば、それだけ柔軟性を与える。もちろん色階調も欠かせない要素だ。ちなみに、知人のデザイナーは、画面と印刷の色の微妙な違いが気になってしょうがないとボヤく。ディスプレイが違うだけでも微妙に色が違う。Webデザイナーともなると、そんな事まで配慮するのだろう。例えば、自動車メーカのサイトで、車体に微妙な光源処理を施しているのは、実物色との違いを誤魔化しているのかは知らん。
また、マッピング技法には、MIP という概念があるという。"multum in parvo"の略で、多くのものが小さな場所にあるという意味だそうな。その着想は、ウェーブレット変換に通ずるものがある。領域別にフィルタリングのレベルや演算方法を変えながら、線形補間によってスムージングするという考え方はあるだろう。そして、画像の領域を幾何学的に認識するような仕掛けも欲しい。今のところ人間がやる方が現実的かも。
心理物理学ともなれば、色相、彩度、明度が精神に与える影響を検討する。光の波長に対する視感効率関数というものがあると聞く。色彩のエネルギースペクトルと刺激量には、なんらかの関係がありそうな気がする。エネルギー分布関数を考慮すれば、ある心理状態を呼び覚ますこともできるかもしれない。ちなみに、色の知覚に関するものに、三刺激理論というものがあるそうな。網膜が、赤、緑、青の光にピーク感度を持つ3種類のセンサーを持っているという仮説だそうだが、これが三原色と関係するかは知らん。デザイナーは、数学的に編み出した色彩関数のようなものを直感的に知っているのかもしれない。プロフェショナルとは、素人の想像も及ばない領域で生きているものであろう。

ところで、むかーしから疑問に思っている事がある。なぜ走査線は横方向なのだろうか?ラスタースキャンが主流なのはブラウン管からの名残りと聞いたことがあるが、なんとなく疑わしい。タイプライタやラインプリンタも、文字単位の走査だけど、やはり横方向ではないか。対して、ベクタースキャンは、とんと聞かない。オシロスコープなどの測定器で見かけるぐらいか。心臓の波形モニタもそうか。尚、生体情報モニタと呼ぶらしい。
TFT などはスイッチのお化けなんだから、VRAMのランダムスキャンでもよさそうなもの。いや、通信効率が悪いか!ドライバの対応も辛いか!
長方形の画面を全スキャンしようとすると、走査線は横か縦になるのだろう。人間にとって四角形が自然なのか?インテリアの形状はだいたい四角形だが、貝殻を見ていると、螺旋の方が宇宙則に適っていそうな気もする。ただ言えることは、どんなスキャン方式を用いようが、今のところ、三次元空間を二次元平面に投影することに変わりはないということ。そう、いかに人間の眼を誤魔化すか、これがコンピュータグラフィックスの真髄であろうか。
今後、ディスプレイの大画面化と高精細化はますます進むであろう。解像度では、4KウルトラHDに突入しつつある。過去の画像データも、品質の陳腐化が目立つであろう。ピクセルデータでは、データ処理がかさむことになる。となれば、ベクタデータが見直されることもありうるかもしれない。GUIは、まさにゲシュタルト心理学の世界にある。いや、人の眼が脳を誤魔化すと言った方がいいか。

1. SRGP と SPHIGS
本書でちと気になるのが、SRGP と SPHIGS という二つの API を基準に書かれていることである。OpenGL が対象ならば言うことなしだが、関数群を眺めるだけでもだいたいの実装イメージが見えてくる。
SRGP は、QuickDraw と Xlib の2D整数パッケージの特徴を組み合わせたものだそうな。その制約では、整数座標系なので浮動小数点を要求するような精度や範囲には向かない、アクション履歴を持たないので他のプログラムから損傷を受けても再表示できない、あるいは三次元空間をサポートしていない、といったことがあるという。
そこで、三次元をサポートする高度な API として、SPHIGS が紹介される。SPHIGS は、PHIGS をベースに、3D浮動小数点パッケージの基本的な特徴に階層的な表示リストを加えたものだそうな。注目したい特徴は、データベース構造を採用していることである。オブジェクトデータ構造が、データベースによる階層ツリー構造というのは、古い時代にしてはやや驚きか。また、2Dの画面空間ではなく、抽象化された3Dワールド座標系で動作するという。つまり、ピクセルの直接操作はサポートされないとのこと。SRGP は、画面上のピクセル操作のために持ち出しているわけか。それぞれのグラフィックスパッケージには特徴と用途が異なり、万能なものは存在しないということであろう。
それにしても、この手のAPIでいつも悩まされるのが、標準座標系はどうなってんの?ってことだ。OpenGL と DirectX でも右手座標系と左手座標系で違う。この業界の住人は不便を感じないのだろうか?それとも、座標系に柔軟性を持たせた方が想像空間が拡がるということであろうか?

  SRGP: Simple Raster Graphics Package
  SPHIGS: Simple PHIGS(Programmer's Hierarchical Interactive Graphics System

2. プリミティブなアルゴリズム
最も原始的な技法に、二次元のアンチエイリアシングを持ち出す。それは、斜線や曲線に発生する階段状のギザギザ(ジャギー)を目立たなくする手法である。そして、クリッピングアルゴリズムとスキャン変換アルゴリズムを検討している。
むかーし、この実装で悩んだことがある。小型システムでは、CPUの能力やメモリ容量が十分ではないので、演算支援回路を装備することになる。今では、ソフトとハード支援部の役割分担も随分と変わってはいるが、小型化の欲求は納まりそうにない。例えば、昔の自動車のバックモニタなどは、機能は単純で斜線と曲線に対応すればよかった。だが、これが結構悩ましい。増分アルゴリズムや補正アルゴリズムで、単純な近似ではうまくいかない。四捨五入計算にしても、ピクセル数が多くなると処理時間は馬鹿にはならない。
ここに紹介される古典的な中点線分アルゴリズムは感動モノ。というより正式名を知らなかった。その名を Bresenham(ブレゼンハム)のアルゴリズムという。中点アルゴリズム自体は単純で、線分より実際の点が上にあるか下にあるかを判定して近似する。ただそれを、整数演算のみでやってやがる。ラインをスキャン変換するのに、整数決定変数を計算して符号のみをチェックし、数理線に最も近いピクセルを選択することで割り算を避けるという考え方である。当時の実装でも、これに近いことをやった。ただ、符号位置は数学的ではなく実験的に探ったものだ。画像処理では、クリップ矩形のエッジから始めて、勾配の関数として線分の輝度を変化させるといったことをやる。境界演算を回路で実装し、輝度調整をプログラムがやることによってスムージングを実装する。こういうプリミティブな技術は経験的に蓄積されるようで、付き合う開発部隊によって様々な文化が見て取れるから面白い。
また、ラインのクリッピングでは、使用頻度の高い Cohen-Sutherland アルゴリズムと、パラメトリック線分クリッピングアルゴリズムが検討される。ここで鍵となるのは交点計算である。
Cohen-Sutherland アルゴリズムでは、予め交点計算が必要かどうかを判定し、端点座標からエッジに対する位置、すなわち上下、左右を判定するといったイメージ。まず、クリップ矩形のエッジの周辺を9面に拡張し、それぞれの領域に4ビットのコードを割り当てる。そして、第1ビットを (ymax - y)、第2ビットを (y - ymin)、第3ビットを (xmax - x)、第4ビットを (x - xmin) の計算を符号ビットとして位置判定をする。
パラメトリック線分クリッピングアルゴリズムでは、Beck/Liang-Barsky のアルゴリズムが紹介される。パラメトリックでは、線分がクリッピングエッジを無限に延長した線と交差する点を考慮するという。関数的に求めるイメージであろうか。そのパラメータは、次式の公式が元になっているという。

  P(t) = P0 + (P1 - P0)t

P0, P1 は線分の端点。線分の延長関数 P(t) と、エッジ上の任意の点 PEi において、ベクトル P(t) - PEi と、エッジの外向法線ベクトル Ni との関係を考察する。
そして、内積、Ni・[P(t) - PEi] の値によって、点がどの領域にあるかを判定するという。
他には、文字のクリッピング、Sutherland-Hodgman 多角形クリッピングアルゴリズム、重み付けエリアサンプリング、Gupta-Sproull のスキャン変換アルゴリズムなどが紹介される。

3. 幾何変換と同次座標系
二次元でも、三次元でも、幾何変換では、平行移動、スケーリング、回転が基本になる。むかーし、座標系の行列表現で最初に戸惑ったのが、座標系の拡張であった。それは、演算効率を高めるためのトリックで、直交の概念が有効だということ。二次元変換系は、3 x 3 のマトリックス、三次元変換系は、4 x 4 のマトリックスで表現すると、極端に演算量が減る。尚、以下の行列式は数値演算言語 octave 風に表記している。

二次元変換系では...
  平行移動: [x'; y'; 1] = [1 0 dx; 0 1 dy; 0 0 1][x; y; 1]
  スケーリング: [x'; y'; 1] = [Sx 0 0; 0 Sy 0; 0 0 1][x; y; 1]
  回転: [x'; y'; 1] = [cosθ -sinθ 0; sinθ cosθ 0; 0 0 1][x; y; 1]

三次元変換系では...
  平行移動: [x'; y'; z'; 1] = [1 0 0 dx; 0 1 0 dy; 0 0 1 dz; 0 0 0 1][x; y; z; 1]
  スケーリング: [x'; y'; z'; 1] = [Sx 0 0 0; 0 Sy 0 0; 0 0 Sz 0; 0 0 0 0 1][x; y; z; 1]
  回転: [x'; y'; z'; 1] = [cosθ -sinθ 0 0; sinθ cosθ 0 0; 0 0 1 0; 0 0 0 1][x; y; z; 1]

4. 平面幾何投影
三次元オブジェクトと二次元表示との間の不整合性を埋めるのに、投影を用いるのは画家と同じ。平面幾何投影は、透視投影と平行投影に区分できるという。その違いは、投影面と投影中心との位置関係にある。投影中心が1点に収束する場合は透視投影、投影面と平行な場合は平行投影となる。透視投影は、平行線が無限遠点の消失点に収束し、写真や人間の可視系の表示効果と類似しておりリアリティを感じさせる。平行投影は、各軸方向に一定の距離を保つ効果があり、リアリティに欠けるものの正確な寸法表示ができる。
さらに平行投影は、投影線と投影面の角度の関係によって、正投影と斜投影に分類されるという。正投影は、投影線と投影面の角度が垂直であり、最も一般的な方法は、正面、上面、側面の投影であろう。組立図など工業製図によく用いられるが、この図面から実物をイメージするのはかなりの熟練を要する。
また、軸測正投影という手法があるそうな。主軸に垂直でない投影面を利用して、オブジェクトのいくつかの面を同時に表示するという。透視投影に似ているが、奥行きの短縮度合いが投影中心からの距離に関係なく、均一である点が異なる。
等角投影は、一般によく用いられる軸測投影の一つだそうな。投影面垂線は各主軸に対して等角を形成する。等角投影は、三次元の3つの軸が等しく短縮されるという特性を持ち、同一尺度での軸に沿った寸法測定が可能になる。
斜投影は、軸測投影を用いて、正面、上面、側面の正投影を組み上げたもの。その代表に、カバリエ投影とキャビネット投影が紹介される。カバリエ投影は、投影方向が投影面との傾きに対して、奥行きが実寸で表される。一方、キャビネット投影は、奥行きが短縮されるために、よりリアルに見える。なるほど、リアルとは眼を欺くという意味か。

5. 曲線と曲面の表現法
滑らかな曲線や曲面を生成するのは、実に難しい。現存するものでは数学的に記述できないものが多くある。よって、数学的に記述できる平面、球、他の形状を組み合わせて近似することになる。本書では、一般的なサーフェスモデリングが紹介されるが、この領域は広範すぎる。ここでは、ポリゴンメッシュとパラメトリック三次曲線について触れておこう。
ポリゴンメッシュは、エッジ、頂点、多角形(ポリゴン)が接続された集合で、2つの多角形が各エッジを共有する。各ポリゴンは頂点座標のリストで表現される。

  P( (x1, y1, z1), (x2, y2, z2), ...,(xn, yn, zn) )

1つの頂点と、それに付帯するエッジ関連のすべてをドラッグするには、頂点を共有するポリゴンをすべて検索する必要がある。最も効率良くやるには、N個の三次元座標をソートすることだという。それでも、N log2N 回の処理を要する。四捨五入のために、同じ頂点が若干異なる座標値を持つという危険性もある。まずは、エッジリストへのポインタでポリゴンを定義することを考えてみよう。メッシュのモデリング要素には、頂点、エッジ(線)、面、ポリゴン(多角形)、サーフェス(表面)がある。


例えば、4つの頂点 (V1, V2, V3, V4) を持つ図形において、エッジリストを使用して定義したポリゴンメッシュは、次のようなデータ構造になる。

  V = (V1, V2, V3, V4) = ((x1, y1, z1), ..., (x4, y4, z4))
  E1 = (V1, V2, P1, null)
  E2 = (V2, V3, P2, null)
  E3 = (V3, V4, P2, null)
  E4 = (V4, V2, P1, P2)
  E5 = (V4, V1, P1, null)
  P1 = (E1, E4, E5)
  P2 = (E2, E3, E4)
  ただし、V; 頂点(vertice) E; エッジ(edge)、P: ポリゴン(polygon)

次に、頂点リストへのインデックスを用いて定義すると、データ構造はコンパクトになる。

  V = (V1, V2, V3, V4) = ((x1, y1, z1), ..., (x4, y4, z4))
  P1 = (1, 2, 4)
  P2 = (4, 2, 3)

いずれにせよ、データ構造の整合性を保ちながら、複雑な画像処理を繰り返すのは大変であろう。3次多項式で定義できれば、ポリゴンメッシュのような情報量は必要ない。そこで、パラメトリック三次曲線の登場だ。曲線のパラメトリック表現を、  Q(t) = (x(t), y(t), z(t)) とし、3次多項式で定義すると。

  x(t) = axt3 + bxt2 + cxt + dx
  y(t) = ayt3 + byt2 + cyt + dy
  z(t) = azt3 + bzt2 + czt + dz
  ただし、0 ≦ t ≦ 1

T = [t3 t2 t 1] を用いて、係数行列を

  C = [ax ay az; bx by bz; cx cy cz; dx dy dz]

と定義すると。

  Q(t) = [x(t), y(t), z(t)] = T・C

Q(t)の導関数は、曲線のパラメトリック接線ベクトルである。

  (d/dt)Q(t) = (d/dt)T・C = [3t2 2t 1 0]・C
  = [3axt2 + 2bxt + c3ayt2 + 2byt + cy 3azt2 + 2bzt + cz]

三次関数を扱う具体的な方法では、エルミート(Hermite)曲線、ベジエ(Bezier)曲線、スプライン(spline)曲線などがある。エルミート曲線は、始点と終点、及び、始点の接線ベクトルと終点の接線ベクトルによって決定される。ベジエ曲線は、曲線上には存在しない2つの中間点を指定することによって、端点接線ベクトルを間接的に指定する。スプライン曲線は、複数の制御点をすべて通るが、B-スプライン曲線は、両端以外の複数の制御点は通らない。尚、ベジエ曲線やB-スプライン曲線は、描画ソフトでもお馴染みのやつだ。

0 コメント:

コメントを投稿