CG 入門と概論

コンピュータとグラフィッククス(概論と入門)
1 コンピュータとグラフィックス (CG) の定義と範囲
1.1 狭義の定義範囲
画像グラフィックス用 API(Application Programmers Interface) を利用して画像をプログラムで作成する
こと.静止画像(image, texture)や文字 (text) とも合成される.
1.2 広義の定義範囲
写真画像,スケッチ画像,動画,文字画像などの素材を基にしてこれらを合成したり,静止画像から動画を
作成したりする.マルチメディアとして扱われることが多い.一般に CG というとこの意味で使われているこ
とが多い(例:CG クリエータ).一般に高額な装置やツールが使用される.
1.3 中間の意味
画像処理ツールを利用して画像を作成すること.
■paint tool
使い方は WYSIWYG 方式で,ポインタを絵筆のように使って画像を製作する.または写真や
手書きの図をスキャナで取り込んだものを素材とすることもできる.製作された図の要素には円,直線といっ
た幾何的情報はない.画素単位の情報しか持たないのでデータ形式は,BMP,JPEG, PNG,ZIF など画像
扱いである.Adobe の Photoshop,UNIX 系では GIMP/GTK+ がある.
■draw tool 主に線画を図の基本要素としているが四角形,楕円,折れ線,スプライン曲線等の基本図形は
モジュールとして持っている.図形は座標を使ったアウトライン情報で表されているので,それを利用して自
由に拡大縮小ができる.また,モジュール (オブジェクト) 化の機能が充実していて自分で作成した図形をモ
ジュールとして登録できる.構造的な作図に適しているが,不規則な形や手描きには適していない.データ形
式は,そのプログラム固有の中間データ形式で,画像はベクトル情報やアウトライン情報で記録されるので,
解像度は取り扱う機器の解像度に依存する.共通の画像記述言語として Adobe が提案した PostScript 形式が
ある.PostScript データはテキストデータであるが,画像化するには専用の PS 対応プリンター,ディスプレ
イでは Ghostscript というフリープログラムが必要.Windows ではフリーのものは Dynamic Draw,有料の
ものでは Adobe Illustrator,UNIX 系 ではフリーの tgiff+ や fdraw など豊富.
■CAD tool
コンピュータで螺子などの機械部品,IC,携帯電話,自動車,船舶,航空機,宇宙船,建物,都
市まで設計するのに使用されるソフトウェアを CAD(computer aided design) とよぶ.CAD の歴史は古く,
これだけで CG とは別格のプロフェッショナルな分野となっている.CAD のデータは NC 旋盤やロボット
など生産現場に直接利用される.これを CAM(computer aided manufacturing) という.
2 CG の歴史
1936 Zuse, Stibitz: 2 進法を用いたコンピュータの特許
1
1944 Turing 達、最初のプログラム式コンピュータ (イギリスでエニグマ暗号解読に使用)
1956 Lawrence Livermore National Labs connects graphics display to IBM 704; (グラフィック・ディス
プレイの初め)
*1960 William Fetter of Boeing coins the term ”computer graphics” for his human factors cockpit
drawings (人物像で,この事実は“CG の初め”として引用される)
*1961 Spacewars, 1st video game, developed by Steve Russell at MIT for the PDP-1(ヴィデオ・ゲーム
の初め)
1963 Mouse invented by Doug Englebart of SRI (マウスの初め)
*1963 DAC-1, first commercial CAD system, developed in 1959 by IBM for General Motors is shown at
JCC (CAD システム商品の初め)
1963 Roberts hidden line algorithm (MIT) (隠線処理アルゴリズム)
1963 Fetter of Boeing creates the ”First Man” digital human for cockpit studies
1964 The BASIC programming language developed by Kurtz and Kemeny (BASIC の開発)
1964 Ruth Weiss introduces drawing software that performs hidden line elimination (Ref: Weiss, Ruth
E. BE VISION, a Package of IBM 7090 FORTRAN Programs to Drive Views of Combinations of
Plane and Quadric Surfaces. Journal of the ACM 13(4) April 1966, p. 194-204. ) (隠線処理に関
するソフトウェアの紹介)
*1965 1st computer art exhibition, at Technische Hochschule in Stuttgart (コンピュータ・アート展)
1965 1st U.S. computer art exhibition, at Howard Wise Gallery in New York
1965 Bresenham Algorithm for plotting lines (Ref: Bresenham, J. E. Algorithm for Computer Control
of a Digital Plotter. IBM Systems Journal 4(1) 1965, p. 25-30.) (直線描画のアルゴリズム)
1965 CADAM developed at Lockheed; CADD developed at McDonnell Douglas (高級 CAD システム
の商品)
*1966 Cambridge で W.Feuerzeig と S.Papert が Logo を開発 (turtle graphic が教育用の応用として話題
になる)
1966 Odyssey, home video game developed by Ralph Baer of Sanders Assoc., is 1st consumer CG product
(ヴィデオゲームの商品の初め)
1967 GE introduces first full color real time interactive flight simulator for NASA - Rod Rougelet (リ
アルタイム・フルカラーのフライトシミュレータ)
1968 Edsger Dijkstra writes article Go To Statement Considered Harmful which signals beginning of
structured programming (構造化プログラミングの提唱)
1968 Tektronix 4010(高級グラフィック・ディスプレイ)
1968 Cybernetic Serendipity: The Computer and the Arts exhibition at London Institute of Contemporary Arts(コンピュータと芸術展)
1969 UNIX developed by Thompson and Ritchie at Bell Labs (in PDP-7 assembly code) (UNIX の開
発,システム記述用語は後にC言語となる)
*1969 Graphical User Interface (GUI) developed by Xerox (Alan Kay) (GUI の提唱)
1969 SIGGRAPH formed (began as special interest committee in 1967 by Sam Matsa and Andy vanDam) (コンピュータ・グラフィックスの国際会議が設置される)
1969 ARPANET is born (インターネットの先祖)
2
1970 Watkins algorithm for visible surfaces (表面処理のアルゴリズム)
1970 Pascal programming language developed by Wirth (Pascal の開発)
1971 Intel 4004 4-bit processor (1チップ電卓の IC,後のマイコン IC の初め,4bit,2300Tr,0.06MIPS,
108kHz)
1972 Newell, Newell and Sancha visible surface algorithm (Ref: Newell, M. E., R. G. Newell and T. L.
Sancha. A Solution to the Hidden Surface Problem. Proceedings of the ACM National Conference
1972, p. 443-450) (表面処理のアルゴリズム)
1973 first SIGGRAPH conference (Boulder) (グラフィックス国際会議の初め)
1973 Rich Riesenfeld (Syracuse) introduces b-splines for geometric design (Ref: R.F. Riesenfeld. Applications of B-Spline Approximation to Geometric Problems of Computer Aided Design. PhD
Dissertation, Syracuse University , 1973. ) (スプライン曲線の導入)
1974 Barnhill and Riesenfeld introduce the name ”Computer-Aided Geometric Design” (CAGD)
1974 DEC VT52 incorporated the first addressable cursor in a graphics display terminal (ディスプレ
イ画面上でカーソルを対話的に移動させる技術の確立)
1974 z-buffer developed by Ed Catmull (University of Utah) (Ref: E. Catmull. A Subdivision Algorithm
for Computer Display of Curved Surfaces, Ph.D. Thesis, Report UTEC-CSc-74-133, Computer
Science Department, University of Utah, Salt Lake City, UT, 1974) (曲面描画のアルゴリズム)
1975 fractals - Benoit Mandelbrot (IBM) (フラクタル画像の初め)
1975 Catmull curved surface rendering algorithm (Ref: Catmull, Edwin. Computer Display of Curved
Surfaces. Proceedings of the IEEE Conference on Computer Graphics, Pattern Recognition and
Data Structures (IEEE Cat. No. 75CH0981-1C) 1975, p. 11-17. ) (曲面処理のアルゴリズム)
1975 Bill Gates starts Microsoft (マイクロソフトの初め)
1977 GKS (Graphical Kernal System) graphics standard introduced (GKS; グラフィックス用の標準
言語)
1979 IBM 3279 color terminal (カラーディスプレイの初め)
1980 SIGGRAPH Core standard reorganized as ANSC X3H3.1 (PHIGS) (PHIGS; グラフィック用の標
準言語)
1984 Robert Able & Associates produces the 1st computer generated 30 second commercial used for
Super Bowl (Brilliance) (CG を利用したコマーシャルの初め)
1984 Radiosity born - Cornell University (Ref: Goral, Cindy M., Kenneth E. Torrence, Donald P.
Greenberg and Bennett Battaile. Modeling the Interaction of Light Between Diffuse Surfaces,
Computer Graphics (SIGGRAPH 84 Proceedings) 18(3) July 1984, p. 213-222. ) (散乱光の処理)
1984 The GUI had its roots in the 1950s but was not developed until the 1970s when a group at the
Xerox Palo Alto Research Center (PARC) developed the Alto, a GUI-based computer. The Alto
was the size of a large desk, and Xerox believed it unmarketable. Jobs took a tour of PARC in
1979, and saw the future of personal computing in the Alto. Although much of the Interface of
both the Lisa and the Mac was based (at least intellectually) heavily on the work done at PARC,
and many of the engineers there later left to join Apple, much of the Mac OS was written before
Job’s visit to PARC. When Jobs accused Bill Gates of Microsoft of stealing the GUI from Apple
and using it in Windows 1.0, Gates fired back: (GUI システムの初めについて)
3
*1984 X-Window System (MIT Project) (UNIX の標準 GUI システム,X Window システム)
1985 PostScript(高規格ページ記述言語の開発)
1987 GIF format (CompuServe), JPEG format (Joint Photographic Experts Group)(画像の規格)
1988 Solid Texturing introduced (Perlin Noise Functions) (Ref: K. Perlin. An image synthesizer. Computer Graphics, 19(3):287–296, 1985) (テクスチャの扱い)
1988 Internet Worm infects servers all over the world (インターネット・ワーム事件)
*1990 World Wide Web (CERN) (Web の初め)
*1992 OpenGL (SGI) released (OpenGL の公開)
1993 Mosaic browser (NCSA) (Web browser の初め,Netscape,Mozilla,FireFox と継続)
1995 Sun introduces Java (Java の初め)
1996 Windows 95 ships (Windows95)
1992 CG-ARTS 協会 (画像処理教育振興協会) CG 検定(他にマルチメディア検定,画像処理検定)
*1997 VRML97,ISO/IEC 14772 として国際規格に制定
3 CG の基礎理論 (2DCG の場合)
CG プログラミングをする際に使用される技術用語と技法について基本的なものを説明する.
3.1 作図,レンダリング (rendering)
グラフィックスによる画像を得る過程 (rendering) の情報の流れは次のようになっている.
グラフィックス・プリミティブ
出力機器
shapes(基本幾何図形
ディスプレイ
text(文字)
→
作図 (rendering) エンジン
→
プリンター
images(写真などの画像)
作図 (rendering) エンジンの役割には次のようなものがある.
• shape に対しては,図形の枠 (stroke) の色塗りまたは塗りつぶし (fill) で図を作成する.
• text に関しては font へ変換をして字の図を作成する.
• 表示位置決め (transformation):shape, text, image を併せて平行移動,回転をして表示位置を決める.
• クリッピング (clipping):図形を他の図形で切り取って表示する.
• 合成 (compositing):以上のものを合成したり,背景色との関係を決めたり,透かし図にしたりする.
• 描画する対象は,対象により描画の技法が異なる.どの対象に対してどのような技法を使用するか指示
することを“作図ヒント”(rendering hint) という.
3.2 詳細な説明
■Alpha process 作図という作業は与えられた画像情報に対して近似的な工程である.例えば,直線や円を描
くといっても数学の定義にあった図形が得られるわけではない.色,テキスト,イメージに関しても同じこと
4
がいえ,理想に最も近い情報でピクセルを制御しなければならない.そのための代表的な技法を説明する.こ
れらの言葉はレンダリングの説明によく使われる.
エイリアシングとアンチ・エイリアシング (aliasing, anti-aliasing) 表示図形を表示画素 (pixel) の作る格子面
に被せて,画素の中心に表示図形があれば,その画素の明るさを 1.0 にし,そうでないときは 0.0 にし
て表示するというアルゴリズムを用いて表示されたイメージを aliased という.このアルゴリズムでは,
画素のサイズが大きいと曲線部がギザギザのイメージができる.
各画素に重なる表示図形の面積に比例して出力画素の明るさを制御して中間色で表示して得られるイ
メージを anti-aliased という.これだと曲線部のギザギザが目立たないように表示される.
アルファ値 (alpha value) 各ピクセルは色を表す3つの値 RGB 値の他に4番目の値として“不透明度
(opacity)”を表す値を付加して表す。これを A(alpha, アルファ)value という。この値が 1.0 のときは
その色は不透明で透かして見ることができないことを表し,0.0 のときはその色が透明であることを表
している.アルファは 3DCG で物質感を表現するときに必要であるが,その他に,アンチ・エイリア
シングのときに各ピクセルの色の濃さの程度を表すのにも用いられる.
フォントのグリフ (glyph) とレンダリング・ヒント
文字の表示に関して次のような留意点がある.
• アルファベットや漢字など,一組の字種に統一的なデザインを割り付けられた字形の組を“フォン
ト”(字体) という.明朝体,ゴシック体,Times Roman,sans serif,などが,その例である.な
お,ローマン体 (立体),イタリック体 (斜体),ボールド体 (太字) はフォントの種類の違いでなく同
じフォントの中の基準線の傾きや文字の太さの違いを表す.
• 文字に対応する図を“グリフ”(glyph) とよぶ.一般には文字とグリフは一対一の対応があるが,
f と i を並べると i の点が省略された文字のように合字 (ligature) ができるので例外もある.文字
列は基準線 (base line) の上に各文字の基点を置いて並べられる.アルファベットの場合は基点が
abcd などの下にあり,gjy などは基点の下にはみ出た部分がある.漢字や仮名の基点は全て左下隅
にある.アルファベットと漢字などを混ぜるとなんとなく落ち着かない文字の配置になるのは,漢
字などの基準線とアルファベットの基準線が異なるためである.
• 文字を表した図がグリフであるが,文字の場合,大きなサイズのグリフと小さいサイズのグリフを
相似形にすると,不自然な図ができるために,文字の設計者はサイズ毎に違ったグリフが生成され
るようにヒントを付加している.処理系によってはこのヒントを活かしてレンダリングする仕組み
をもつものがあるので,比較してみると良い.
3.3 ディスプレイ座標空間
数学では,グラフを描くときに適当に原点を定めて横線とそれに直交する縦線を引き,それぞれ x-軸と y-軸
と考える.横軸は右,縦軸は上がそれぞれ増加の方向を意味し,単位の長さも適当に定める.これを右手系と
呼ぶ.しかし,ディスプレイやプリンターでは,描画の都合から左上隅を原点,横軸は右,縦軸は下の方向が
増加方向,画素を単位の長さにした方が自然である.即ち,左手系を取っている.旧 N88BASIC や OpenGL
では右手系 (左下隅が座標原点) で,単位の長さも自由に定義できるが,多くの API では左手系を取っている
ので,数学的な図形を表示するときに座標変換をしなければならない.
5
4 CG の基礎理論 (3DCG の場合)
3DCG の作成の標準的な過程は次のように 2D より複雑になる.
1. モデリング:制作対象物体の幾何学的モデルを考えて,光源の位置,視点など描画に必要な情報を考
える.
2. レンダリング:モデリングの情報に従って,画像を作成する.更に、立体感を表すための光線処理を
する。
3. プロジェクション:カメラでフィルムに撮像する原理で、制作対象物体の点をディスプレイに投影する。
数学的には座標変換をする。
4. テクスチャーマッピング、アニメーション、対話:立体表面の図の貼付け、アニメーション、イベント
処理
4.1 モデリング
モデリングは、立体の全体的な捉え方に関する幾何モデルとそれの数学的表現に関する内部表現の問題に分
かれる。
4.1.1 立体幾何モデル
ワイヤーフレームモデル (wire-frame model)
立体の骨組みや表面の特徴ある点を直線や曲線で表現したモデ
ル.立体の概略や構造を捉えるのに適しているが,面のレンダリング等立体図形としての処理はできな
い.ワイヤーフレームモデルは次のサーフェースモデルの骨組みになる.
サーフェースモデル (surface model)
立体の面データだけで表現したモデル.即ち,立体をその表面に貼り付
けた曲面で表現する方法である.隠線処理や面のレンダリングを施して立体視画像が制作できる.立体
の面の情報が重要な場合に適している.実際には曲面を使用すると各種の処理が大変なので多面体で近
似している.3次元空間中の多面体には表裏があり,構成する立体の表面が表側になるように多面体の
頂点を必ず表側から見て左回り (正の方向) に並べることになっている.
ソリッドモデル (solid model) 中身が詰まっている立体を想定した場合に使われるモデルで,立体内部の情報
をデータとして持っているので,処理に時間がかかる.レンダリングにも利用できるが,物体の物理的
な情報を処理する場合には必須のモデルである.
4.1.2 立体の内部表現 (構造表現,数学的表現)
プリミティブを基にして複雑な立体を構成する際の方法を説明する.1 つの方法であらゆる立体を表現でき
る方法はない.それぞれの特徴や目的に合わせた表現方法を考えて使用する.上記のモデリングとも密接に関
係する.
境界表現 (Boundary representation) 立体を2次元の多面体や曲面で,多面体や曲面は1次元の直線や曲線
で,直線や曲線は端点で構成できていると考えて,面,稜,頂点の情報とそれらの関係を表す“接続グ
ラフ”で立体を表現する方法.
6
CSG(Constructive Solid Geometry) 表現 立体をプリミティブの集合演算で表現する方法.ソリッドモデルを
用いる必要がある.
メタボール (metaball) 立体を、中心が高濃度、中心から遠ざかるにつれて低濃度の球の集合として表す方法.
全体の形状は濃度の同じ面 (等値面) 基準にして合成される.生物の表現などに適している. ボクセル (voxel) 表現
2次元のピクセルに対する3次元の立体画素をボクセル (voxel) といい,voxel の集合
で立体を表現する.ソリッドモデルの近似表現法であり,データ量が多くなる.
八分木 (オクトリー octree) 分割法
2次元の図形の場合,その図形を含む最小の正方形を考える.その正方
形を半分に分割 (四分割) して図形に含まれる正方形を決定する.図形に含まれない正方形に対しては
更に4分割して図形に含まれる正方形を決定する.この分割を図形がすべて含まれるようになるまで繰
り返す.これを3次元で行うもので,始めに立体を含む最小の立方体を考え,それを半分に分割 (八分
割) することを繰り返す.
スイープ (sweep) 表現
柱,ドーナツ (円環面) のようにある平面図形を一定の方向に動かしたり,回転させた
りしたときの軌跡として表現する方法.
4.2 レンダリング
レンダリングには次のような要素が考慮されなければならない.
4.2.1 座標系
CG では,幾つかの座標系を用いる.実際の立体図形がある空間の座標系はワールド座標系,カメラを中心
にした座標系をカメラ座標系,フィルム面 (投影面) 上の座標をフィルム座標系という.ワールド座標系は横軸
を x-軸,縦軸を y-軸,前後方向を z-軸と設定するのが,CG の標準設定であることに注意する.カメラ座標系
はレンズの中心を座標原点,横方向を x-軸,縦方向を y-軸,カメラの向いている方向を z-軸の負の方向とす
る.フィルム座標系はカメラ座標系の中で,z = −d (d > 0) と置いたものである.投影変換はワールド座標
系からカメラ座標系への変換,更に,カメラ座標系からフィルム座標系への変換が施されてフィルム面に像が
得られる.これらの座標系はすべて右手系ではあるが,カメラからの距離をパラメータにして計算をする場合
がある.この場合は,カメラ座標系が左手系になってしまうので注意が必要である.
4.2.2 投影のパラメータ
投影変換を計算するために次のパラメータを決定する必要がある.
注目点 (at point)
投影画像の中心になるワールド座標による (想定上の) 点をいう.通常はその点をワールド
座標原点とする.座標原点以外のところを中心にして物体が動き回るというような場合は,注目点をよ
く計算をしておかないと投影対象の立体がディスプレイ上に表示されないというようなことがおきる.
視点 (eye point)
カメラレンズの中心位置で,カメラ座標原点である.ワールド座標で表す.視点から注目点
の方向がカメラ座標 z-軸の負の方向になる.
上方ベクトル (upward vector) 投影面の上方向で,通常はフィルム面の縦軸の方向である.ワールド座標で
表す.
投影面
フィルム面でカメラ座標で z=-d (d¿0) とする.
投影点
空間の点をフィルムに投影した点である.
7
投影直線 (projector) 立体図形上の点と視点を結ぶ直線を言う.投影直線とフィルム面との交点が投影点で
ある.
投影ベクトル
投影直線の方向ベクトルをいう.投射ベクトルは投影面の反射光量の計算に使用される.ワー
ルド座標系で表す.
視領域 (view volume) またはクリッピング (clipping) 投影の対象領域のことで,投影法によりパラメータの
指定の仕方が異なる.例えば,平行投影の場合はフィルム面に収まる直方体の領域であり,カメラ座標
で定義する.前後方向にも切り取りのあることに注意.
4.2.3 投影の種類
■平行投影 (parallel projection) 投影直線がすべて平行な場合で,投影直線が z-軸に平行の場合を “直投影
(orthographic projection)”,平行でない場合を “斜め投影 (oblique projection)” という.通常の平行投影は
直投影であるが,レンズ面とフィルム面が平行でない場合は斜め投影になる.平行投影の計算は初めにワール
ド座標からカメラ座標への 1 次変換をする.直投影の場合は得られた座標の (x,y) 座標成分を投影点のフィル
ム座標とすればよい.フィルム面の位置は問題にならない.斜め投影の場合は更に,せん断変換をする必要が
ある.格子面を平行投影すると平行な格子面が得られる.カメラが無限に遠くにあるものを超望遠レンズで見
ている場合に相当する.
■透視投影 (perspective projection)
投影直線と投影面 (フィルム面) との交点を投影点とする投影.視点,注
目点,投影面の位置により投影される像が違ってくる。投影面は注目点と視点を結ぶ直線に垂直な面とする.
投影面は,注目点と視点との中間に想定する,即ち,カメラ座標で z = −d (d > 0) とする.視点に近いもの
の方が大きく投影されるので遠近感が得られる.ただし,視点を物体に近づけすぎたりすると不自然な図が得
られるので,視点,投影面は実際のものを見て調整する必要がある.格子面を透視投影すると平行部分が遠く
で収束するような図が得られる.
■その他の投影
魚眼投影
球面で一度を反射した直線を投影直線とする投影.魚眼レンズで写したような図が得られる.
パノラマ投影
透視投影の視野角を 180 度にしたものであるが,実際の図は横方向を縮める必要があるので,
円筒で一度反射した直線を投影直線としたもの.
4.3 光線処理
光線処理はレンダリングの作業に含まれるが,3DCG では重要な作業であるので別に説明する.光線の処理
は,隠線隠面処理,陰影処理,反射光処理などに分けられる.
4.3.1 隠線・隠面処理
陰線・陰面とも書く.投影で得られた図形のうちで視点の方向から見えない部分を消去する技法である.ワ
イヤーフレームで描いた場合は “隠線 (hidden line) 処理”,立体物の場合は “隠面 (hidden surface) 処理” と
いうが,両者は密接な関係があり,モデリング技法とも関連している.色々なアルゴリズムがあるが代表的な
ものを紹介する.
8
■法線法
凸多面体のサーフェースモデルにしか適用できないが,次の陰影処理とも関連するので説明する.
立体を凸多面体の張り合わせで作るとする.最小頂点数の多角形は3角形であるから多面体に2本の独立なベ
クトルが得られる.この2本のベクトルの外積を取るとこの面への法線ベクトルが得られる.サーフェースモ
デルの所で説明したように,表面の凸多面体の座標の順序が一定だから,どの面についてもこの方法で表向き
の法線ベクトルが得られるので,この法線ベクトルと透視ベクトルが 90 度以内なら視点から見えるとして描
画して,90 度以上なら視点から見えないとして消去すれば,見えない部分は描画されない.
■z–バッファ法 (z–buffer method)
コンピュータは描画領域と同じ画像バッファを持っていて,画素の色や
明るさの情報を保持している.この他に同じサイズのカメラ座標の z– 座標の値を記録する画像バッファを用
意しておく.これを “z-バッファ” という.サーフェースモデルで z–バッファの使い方を説明すると,立体図
形の表面の多面体の 1 つを描画し,z–座標を記録する.他の多面体を投影したときに,既存の z- 座標を比較
して,その値の大きい方を残す.結果として,z–ブッファに残っている点は見ている方の前方にあるものであ
るから見えない部分は消去されることになり立体視が得られる.この方法はソリッドモデル,ボクセルモデル
などでも時間がかかるが,適用することができる.
■レイ・トレーシング法 (ray tracing method)
光線追跡法または視線逆探査法ともいう.ディスプレイ面の
ピクセル毎に,投影直線を求め,視点に一番近い物体を探す方法である.光の影や反射だけでなく,途中に透
明な物質を想定しているとき,その物体で屈折される背景の描画をするなど複雑なこともできる.モデリング
や物体の形状に囚われることなく実施できる.アルゴリズムは単純であるが計算量が膨大になる.
■スキャン・ライン法 投影面の縦 (横) の線と視点で定まる平面を考え,投影する物体のこの面の切断面を考
え,視線上の視点に近い方を残す.レイ・トレーシング法の簡略法ともいえる.
4.3.2 陰影処理
立体描画をリアルにする重要な作業の 1 つが立体図形の陰影をつけることである.
■光源の形状 光源には,“点光源”,“線光源”,“面光源” などがあり,さらに,“平行光線”,“スポット光線”,
“多重光線”,“散乱光光線 (環境光線)”,光源の色など色々な要素を考慮する必要がある.
■陰影 1 つの立体で光源の陰になり暗くなる (光量が減る) 部分を “陰 (shade)” といい,立体が面など他の
物体の上においてあるとき,その面に映る立体の影は “shadow” と呼ばれる.立体が多面体の張合わせででき
ているサーフェースモデルのときは,表面の多面体の法線と光源との角度でその面の光量を決めればよい.こ
の方法を “コンスタントシェーディング” というが,多面体の継ぎ目で光量の段差ができてしまう.対策とし
て,補間法により光量の変化を滑らかにしたものを “スムースシェーディング” という.
点光源の場合でも,例えば,電球のように多少の広がりがある場合は,影の方は本影と半影ができるので,
リアリティを重視する場合はその処理をする必要がある.さらに,室内の画像のように多くの物体がある場合
は,それぞれの物体や壁からの反射光も計算しなければリアルな像が得られない.このような場合はレイ・ト
レーシングを丁寧に実行する必要がある.アルゴリズムは単純であるが時間がかかる.平行処理が有効で強力
な方法である.
9
4.3.3 素材表現・フォンモデル (phong model)
これまでは陰影をつけるのに物体の反射の特性を考えずに説明した.これだと立体感は得られるが全体が粘
土モデルの光景になり物質感が得られない.金属のボール,木のボール,布のボールの違いを表現するには,
光の反射の特性を考慮する必要がある.フォンモデルでは反射光の方向への光の (3 原色毎の) 広がり具合を指
定する.
• “拡散反射” では全方向に均一に散乱するものとし,結果はプラスチックの表面のように見える.
• “鏡面反射” では反射方向が狭いものとする.結果は金属の鏡面のようになり,正反射の方向ではまばゆ
いハイライトになる.
• 背景の中に適当に多数の光源を配置した場合は現実の光景に近くなるが,このような光源の設定を “環
境光” という.
• 反射光の計算の際に,入射光に関係なくある強さの光を反射させるようにすると情景の中の “放射光”
効果を得ることができる.この場合,他の物体はこの放射光の影響を受けないように計算されるので,
多重光源とは異なる効果になる.更に精密な描写をするにはアルファ値 (不透明度) を考慮に入れる必
要がある.
4.4 マッピング (mapping)
最後に立体の表面に模様を付けることにより,より現実感を増すことができる。この操作をまとめてマッピ
ング (mapping) と呼んでいる.幾つかの手法を説明する.
テクスチャーマッピング (texture mapping)
3 次元物体の表面に写真等の 2 次元の像を転写する (貼付ける)
こと.
ソリッドテクチャリング (solid texturing) 大理石や木材等の立体のカットモデル等で表面の模様と隣接する
中身の模様が連続するようにマッピングすること.
バンプマッピング (bump mapping) 凹凸の激しいタオルや人工芝の表面のような模様を付け,さらにシェー
ディングにより凹凸を強調させること.
環境マッピング
リフレクションマッピング reflection mapping) 金属製の磨かれた表面を持つ球,円柱等に周りの景色
が反射しているように見えるようにテクスチャを貼付けること
リフラクション refraction mapping) ガラスや透明プラスチックを通して屈折して周りの景色が見える
ようなマッピングがある.
ボリュームレンダリング (volume rendering) X 線 CT 写真のようにボクセルのデータから内部組織まで描画
する手法.X 線 CT のようなデータを内部まで込めて可視化するに適しているが,計算時間がかかる.
10
5 形状モデリングと曲線・曲面のモデリング
5.1 形状モデリングの定義と必要性
データベースや数値計算のプログラミングの場合に,第一に考慮する必要があることがデータ構造である.
CG プログラミングでは 2 次元・3 次元の物体が対象であり,それをどのようなデータ構造 (モデル) で表すか
という問題を形状モデリングの問題と呼ばれる.特に画像データベースを考えるときは形状モデリングは十分
に検討しておく必要がある.
形状モデリングの場合,直線・平面,二次曲線・二次曲面,らせん曲線・曲面,円環面など解析関数で表現さ
れる解析曲線・曲面の類と,それらでは表現できない所謂自由曲線・曲面を扱う場合に分けられる.以下,自
由曲線・曲面について説明する.自由曲線の描画は描画ツールなどの対話的な利用法でもよく利用されている.
5.2 形状モデリングの方法
形状モデリングの方法は,一般には,対象物体の曲線・曲面上の “参照点 (観測点,測定点)” を取っておい
て色々な近似法を用いて表す方法が用いられている.自由曲線・曲面では正確な数学的な表現法がないのに近
似というのは矛盾しているようであるが,その近似法が解析的な曲線・曲面を正確に再現できるか,予め描い
た自由曲線・曲面を参照点を増やしたときどれくらい再現できるかという点を判断基準にして評価している.
数学では,テーラー級数,フーリエ級数,ラプラス級数,エルミート級数,ベルンシュタイン級数など未知
の関数を既知の関数で近似する理論は “補間法・内挿法”(inter polation) として良く研究されている分野であ
り,CG でもその結果を利用している.
5.3 スプライン
CG 以前に,曲線を作図することは設計図などで重要な問題であった.そのために使われた道具にスプライ
ン (spline) というものがある.スプラインは定規の一種で,鋼などの弾性体でできていて自由に曲げること定
規である.使い方は,参照点にこの定規を当てて弾性を利用して一番適切と思われる曲線を引く方法である.
この方法で引かれた曲線をスプライン曲線と呼んでいる.スプライン曲線は鉄材などを加工して曲線や曲面を
作成する際に,曲げエネルギーが低い曲線である.しかし,理論通りに曲線を求めようとすると曲率の項が
入った非線形微分方程式を解くことになり,一般に不可能であるので,曲率が小さいと仮定して線形近似をし
て表している.
5.4 パラメトリック曲線・曲面
曲線・曲面の数学モデルとしては,y = f (x), z = f (x, y) 形の陽関数表示を最初に思いつくであろうが,関
数の定義から円のような曲線は陽関数表示できない.この反対が f (x, y) = 0, f (x, y, z) = 0 形の陰関数表示
であり表現力は最も強力であるが,陰関数表示からプロットする点を計算することは時間がかかりすぎ,CG
では非実用的である.最後に曲線に対する (x(t), y(t), z(t)),曲面に対する (x(s, t), y(s, t), z(s, t)) 形のパラ
メータ表示である.数学でも 1 パラメータの関数の組を曲線,2 パラメータの関数の組を曲面といい,組み合
わせの関数の性質から連続,滑らかなどの曲線・曲面の性質を定義している.CG ではこれらをパラメトリッ
ク曲線・パラメトリック曲面という.
11
5.5 3 次スプライン,補間曲線
パラメトリック曲線の場合でも全ての参照点を通るように一つの式で表すことは不可能であり,参照点間を
多項式曲線で表し,参照点で連続させて滑らかな曲線を作らなければならない.この方法で得られた曲線を “
多項式スプライン” というが,中でも良く利用され方法が 3 次スプラインで,参照点間を 3 次多項式で近似し
て全体に繋いでいく方法である.3 次スプラインを “自然なスプライン”(natural spline) と呼ぶ.多項式スプ
ラインの問題点は計算がやや大変なことと,測定データには誤差が含まれることは常識であるが,この誤差に
関して敏感なことで,高次の項の係数が参照点の僅かな違いで大きく変わることである.ただし,参照点を全
部通過するという特徴を重視して研究は続けられている.
5.6 ベジエ曲線・有理ベジエ曲線
これに対し,1961 年頃フランスの自動車メーカのルノーの技術者ベジエ (Bezier) の考案したベジエ曲線が
ある.この方法は曲線の特徴を表す凹凸の情報から曲線を近似しようという方法である.ベジエ曲線は 2 点の
中間点を表す式を折れ線近似の場合に拡張したデ・カステリョ (de Casteljau) のアルゴリズムという計算方
法があり,再帰的に組み合わせ法または図形上でベジエ曲線を求めることができる.このアルゴリズムを式で
表現すると,ベジエ曲線は “ベルンシュタインの多項式” (Bernstein polynomial) で表される.ベジエ曲線は
両端の点以外の参照点を通過しない曲線になるので,参照点は制御点と呼ばれる.ベジエ曲線はベルンシュタ
イン多項式により表現されるが,多項式では円や楕円などを表すことができない.その解決策として考えられ
たのが,有利ベジエ曲線である.制御点に重みという係数を付け加えてベルンシュタインの多項式の係数を変
えて有理関数にしたものを有理ベジエ曲線という.有理ベジエ曲線では重みの大きい制御点の方へ曲線が曲が
る.有理ベジエ曲線ではすべての円錐曲線を得ることができる.
5.7 B-スプライン,NURBS
ベジエ曲線は制御点の数が n + 1 個のとき n 次の多項式になるが,1 つの制御点を動かすと全体の形が変
わる,また,凹凸の激しい曲線を一度に高次元で近似すると滑らかになりすぎるという問題が生じる.そのた
めに 3 次程度で近似をして,部分的に近似を繰り返して,繋ぎ点を滑らかに変形するという方法が考えられ
た.これを B-スプライン (B-spline) という.B-スプラインでは制御点の他にノット点列 (knot vector) とい
う単調増加列を合わせて考えて,ノットに対応する点でベジエ曲線を繋いで行って曲線を得る.B-スプライン
を与える式は有理関数になる.ノット点列に内点がない場合はベジエ曲線になるので,B-スプラインはベジエ
曲線の拡張である.さらに,ノット点列とそのウェイトを工夫すると,より複雑な曲線が描ける.これを一般
に NURBS(non uniform rational B-spline) と呼ぶ.なお,陰関数表示された曲線はパラメトリック曲線では
正確に表せないのであるが,NURBS を用いて良い近似が得られる.
6 CG プログラム(API)の実際
6.1 API の機能階層
プリミティブの記述
点,直線,四角形 (矩形),ポリゴン(充填プリミティブ,単純ポリゴン,凸ポリゴン,非
単純ポリゴン),色付け,色塗り,テキスト,
(イメージ)などの定義用のライブラリ
12
描画のユーティリティ・ライブラリ
3D 用のパラメータ設定,ワイヤーフレーム(球,円柱,円盤)などの定
義用のライブラリ
描画用のツール
実際にウィンドウに画像を表示するツール,多面体,トーラス,その他の複雑なポリゴン用
のワイヤーフレームの定義,簡単なイベント処理のライブラリ
GUI 用のツール GUI を作成するためのパーツ,マウスイベントやキーイベントの処理ライブラリ
(1)と(2)は OS 独立に定義できるが,
(3)になるとハードウェア依存になるが,描画と簡単なイベント処
理は OS に依存せずに定義できる.
(4)は歴史的な理由で,完全に OS 依存になる.ただし,Java により OS
独立の処理ができるようになったが,Java 自身は重いプログラムである.プリミティブの部分でも,OpenGL
のように完全に 3D 対応になっているものは,扱いが簡単である.OS 独立とは,プログラムは OS を考えず
に作成できて,OS 依存のコンパイラー処理をすれば OS に依らない同じ表示と動作が得られることを云う.
6.2 具体的な API
■N88 互換 BASIC BASIC のオリジナルはグラフィックスを考えられていなかったが,BASIC が 8bit コ
ンピュータの標準言語になったときに取り入れられた.グラフィックスに関しては2Dプリミティブのレベル
で対応している.3D ライブラリは全部自分で作成する必要がある.色数は8色,色の処理,イメージ,テキ
ストは扱えない.言語自身が再帰やプログラムモジュール化機能が無いので,コッホ曲線などは描けない.ま
た,画像バッファについては不明なので,隠線処理が完全にできない.ユーティリティ・ライブラリはない.
メーカの開発していた N88BASIC では 2DCG のユーティリティ・ライブラリとダブルバッファが入ってい
た.(現在の互換 BASIC は個人のユーザが独力で開発してフリーで公開しているものである).描画用のツー
ルの部分は,BIOS 依存である.多少のイベントの処理はできるが,GUI 用のライブラリはない.言語の単純
性に依存して開発された Windows 専用の GUI 開発用のプログラムが Visual Basic である.インタープリ
ター言語なので処理速度が致命的に遅く実用には使えないが,描画部分の設定を考えなくてよいので,機能範
囲内でライブラリを自分で開発する楽しみがある.
■数式処理プログラムによるグラフィックス
数式処理プログラムは CG 開発用のプログラム(API)でない
が,数学関係の画像を作成には,ライブラリが充実していて(陰関数表示のグラフ,等高線表示,密度表示な
どもある),さらにインタープリーター言語なので扱いが易しい.描画部分の設定も考える必要が無く,処理
速度も実は意外に早い.ただし,プログラミングは Mathematica では BASIC より始末が悪い.Maple はグ
ラフィックスのインターフェース部分とプログラミングの点で優れている.
■OpenGL 本格的なグラフィックス API として GKS や PHIGS が使われてきたが,現在唯一の実用的な
完全なグラフィックス・ライブラリ (API) は OpenGL である.多くのアプリケーションが OpenGL を使っ
て開発されている.
(例えば, Mac OS X の GUI は OpenGL で開発されている)
.C の処理系と一緒に用い
られる.OpenGL 自体はユーティリティ・ライブラリの部分まで OS 独立に標準化されているので,UNIX,
Linux,Mac OS X,Windows などどの OS で開発してものでも,同じソースコードを他の OS でコンパイ
ルすると同じ結果を得ることができる.描画用のツールに関しては glut というライブラリが標準で用いられ
るが,Windows の場合は実装されていないので各自で入手する必要がある.
(glut.h,glut32.lib,glut32.dll
はフリーで配布されている).ただし,glut では GUI レベルでは完全に対応していないので,GUI の開発ま
で考えると更に OS に対応した拡張ライブラリを入手する必要がある.
13
■VRML Virtual Reality Modeling Language の略であり,Web ドキュメントの記述言語 HTML に対応す
るグラフィックス API である.3DCG が扱えて VRML viewer を利用した対話的な機能が充実した VRML
Ver.2 が 1997 年に ISO の国際規格になっている.(Virtual Reality Markup Language と呼ばれていたとき
もあったそうである).OpenGL と同じく SGI が最初に開発した API であるので,プリミティブの部分は
共通する部分があるが,こちらはモジュール (グループ) 化の機能と対話的な機能が充実している.プログラ
ム本体は 3D 物体の定義データの集まりで,ネットワークなど配信されることを想定している.描画機能は
VRML 自身にはなくて Web の browser に VRML の viewer を plug-in で描画して,viewer と通して対話
的な動作をする.plug-in はフリーで入手できる.
(Cosmo player や Cortona が代表的な plug-in である).
GUI 開発は目的としていない.ネットワークやコンピュータの速度がボトルネックになって本格的なアップ
リケーションは使い勝手が悪かったが,これらの性能が向上してきたので初めの予想通りの状況が実現される
可能性が生じてきた.今後は文書システムの XML,画像フォーマットの MPEG-4 と合流して,リアルタイ
ム 3D グラフィックシステムの API を目指す X3D(eXtensible 3D) の規格設定が進められている.ただし,
現在 X3D の viewer はない.
■SVG Scalable Vector Graphics の略で,ドキュメントシステム定義言語の XML(eXtensible Markup
Language) 内で画像を定義するのが主目的の言語である.原則的に 2D が対象で,基本図形やアニメーション
などは,他のグラフィカル API と同じであるが,記述法が XML ベースなので,XML の知識を必要とする.
描画は Adobe の SVG Viewer や Apache project の Squiggle browser などフリーのものを使う.
■Java Java は本来は組み込みプログラムを目的として開発されたオブジェクト指向のプログラム言語であ
るが,“Write once, run everywhere.” というキャッチフレーズの機能がネットワーク時代にマッチしたため
に,急速に時代の標準言語となってきた.Java ではソースプログラムをコンパイルすると,ネイティブのバイ
ナリコードに変換するのでなく,バイトコードという中間言語に変換し,各 OS がそのバイトコードを実行す
るヴァーチャルマシン (Java VM) を用意していて,そのヴァーチャルマシンが実際の計算をするという 2 段
構えの構造で,キャッチフレーズの機能を実現している.ただし,そのためにネイティブコードのプログラム
より動きが遅い.特に,起動が 2 段構えなので遅い.グラフィックス API は初めは AWT(Abstract Widget
Tool) という形で,抽象的なクラスとして提供されていて,実際の画面は Applet という形式にして HTML
browser または Applet viewer が必要であったが,最近 Java Swing という API が充実してきて,グラフィッ
クスも手軽にできるようになった.ただし,オブジェクト指向というプログラミング思想圏(パラダイム)に
属するために,C 言語などから移ると少々分かり難いところがある.2D グラフィックでは,OpenGL などと
図を作成する上で大きな考えの違いはないが(ただし,座標系がディスプレイ依存であるが,これには理由が
ある),3D グラフィックスはシーングラフィックスという考えで作図する.3D グラフィックスは OpenGL,
VRML,X3D を視野においており,描画は VRML を想定しているようである.
オブジェクト指向という考えは,Xerox が GUI という考えでウィンドウを使った Alto というコンピュー
タを開発したときに導入した考えで,そのために Small Talk という言語も開発した.Java もその思想圏にあ
る.したがって,AWT はウィンドウの設計を主な目的としていて,2D グラフィックスでは表示画面の座標
が左手系となっている.ウィンドウのパーツを作るにはこの方が良いが,一般の 2D グラフィックスでは座標
変換が1つ必要になる.
■図形学習用のソフトウェア
Cabri Geometry, Cinderella などは WYSIWYG 方式で,幾何学の学習に必
要な正確な作図ができるばかりでなく,その図に関する定理など幾何学的な内容も捜してくれるという機能が
14
あり,発見的な幾何学の学習を支援してくれる.
GNUplot は 2 変数の関数も含め,関数のグラフを描いてくれる.これに類するプログラムは最近増えてき
ている.
■その他 MS Windows だけをターゲットにした API が幾つかあり,Windows API,MFC,.NET,DirectX
などがあるが,この講義では省略する.また,実際に商品になる CG を作成するには,ここで説明する基本的
な機能の他に,WYSIWYG 形式で 3D の画像物体(モデル)を作成するツールが必要である.これらのソフ
トウェアも 3DCG ソフトウェアの名称で扱われているので,講義で説明するものとは区別する必要がある.
例えば,3D Studio Max などがゲームソフトウェアなどの中で最大のシェアを誇っている.
15