多数の平面ポリゴン(polygon;多角形)を組み合わせれば, 任意の立体形状を表現できる. (曲面形状については,多数の微小ポリゴンから成る多面体によって近似する.)
今回は,リアルタイム CG のポリゴンモデルをC言語で作成してみよう.
とりあえず,サンプルプログラムを実行してみよう.
$ エディタ ~/.bashrc # 設定ファイルを編集 ... export LD_LIBRARY_PATH=. # この行を追加 # ファイル末尾に空行が必要 $ source ~/.bashrc # 設定の有効化
$ tar zxvf polygon.tgz $ cd polygon/ $ make
$ ./sample &
実行結果は,Fig.1 の通り. 図形を [カーソル],[Space],[B] キーで回転・移動できる. また,[R] キーで初期状態に戻せる. 終了は [Q] キー.
ポリゴンモデルの作成方法は次の通りである. 例えば,Fig.1 の図形は,Fig.2 の設計図に基づいて, Table 1 および Table 2 のデータによって定義されている. サンプルのソースコードと比較せよ. (本プログラムでは,各面に色のデータも追加されている.)
Table 1. 頂点テーブル
|
Table 2. 面テーブル
|
なお,libpolygon では,面のポリゴン形状は, 三角形と四角形だけに限定されている. (混合利用も可能.)
三角形ポリゴンを作成するには, ソースファイル sample.c のように, 関数 SetPolygon3() を使用すればよい. また,四角形ポリゴンには, 関数 SetPolygon4() を使用しよう. (関数の引数については,ヘッダファイル polygon.h を調べよう.)
面データを定義する際, 法線の方向(法線ベクトルの正/負=面の表/裏)に注意せよ. 法線の方向は,各三角形ポリゴンの頂点の指定順序によって決まる. 各ポリゴンの表側から見て 反時計回り(CCW; counter clockwise)の順序とすること.
ありがちな間違い: CCW とするのは,視点側から見てではない. 例えば,Fig.2 の三角錐の頂点 P0,P1,P3 から成る三角形ポリゴン(裏側の面)の場合, 面データは,視点から見て CCW の (0, 1, 3) ではなく, この面の表側から見て CCW の (0, 3, 1) とすべきである. 元の視点(この面の裏側)から見ると CW であることに注意しよう.
また,Table 2 の面 0 は,頂点 0 → 頂点 1 → 頂点 2 の順序であるが, 逆回転に,頂点 2 → 頂点 1 → 頂点 0 としてしまうと, ポリゴンの形状は変わらないが,裏表が逆になってしまう.
現在の視点において,あるポリゴンを裏側から見ている場合, 物体全体を 180 度回転し,そのポリゴンを表側から見直して, 頂点順序を考え直そう.
なお,今回のサンプルプログラムでは, 面の裏側は暗く表示されるようになっている.
なお,作成したデータについては, 後日再利用するかもしれないので, 設計図も残しておくとよい. 後日,「隠面処理」の課題がある.
さらに,余裕のある人は, OpenSCAD や POV-Ray で利用されているような プリミティブ形状を作成してみよう. 例:円錐,円柱,球,...