2017.11.10

ポリゴンモデル

多数の平面ポリゴン(polygon;多角形)を組み合わせれば, 任意の立体形状を表現できる. (曲面形状については,多数の微小ポリゴンから成る多面体によって近似する.)

現在のリアルタイム 3D アプリケーション(例:ビデオゲーム)では, 表示されている物体は,ほとんどすべてがポリゴンモデルである. たとえ視覚的に曲面体であるかのように表示されていたとしても, 実は,形状的には多面体であり, シェーディング方法の工夫(陰影のスムーズ化など)によって 曲面的に見せかけているだけだ.

今回は,リアルタイム CG のポリゴンモデルをC言語で作成してみよう.

リアルタイム CG のプログラミングには, OpenGL や DirectX 等のライブラリを利用するのが一般的である. しかし,これらの利用法をゼロから学ぶのは結構大変... そこで今回は,とりあえずポリゴンモデルをお手軽に設計するため, 本授業のためだけに開発されたライブラリ libpolygon を利用する.

サンプルプログラム

とりあえず,サンプルプログラムを実行してみよう.


Fig.1. 実行例(不完全な四面体)

実行結果は,Fig.1 の通り. 図形を [カーソル],[Space],[B] キーで回転・移動できる. また,[R] キーで初期状態に戻せる. 終了は [Q] キー.


練習問題:ポリゴンモデルの作成

まずは,サンプルプログラムを改造し,完全な四面体を作ってみよう. その後,今回はとりあえず何か, 単純なオリジナル 3D 図形のポリゴンモデルを作成してみよう. (凸多面体は簡単すぎるので,多少凹部がある形状に挑戦しては? 各自のイニシャルのアルファベットなどがお手頃.)

サンプルソース sample.cmain( ) 関数内のデータ定義部分を書き換えるだけで OK. shader( ) 関数などについては,後日.

ポリゴンモデルの作成方法は次の通りである. 例えば,Fig.1 の図形は,Fig.2 の設計図に基づいて, Table 1 および Table 2 のデータによって定義されている. サンプルのソースコードと比較せよ. (本プログラムでは,各面に色のデータも追加されている.)


Fig.2. ポリゴンモデルの設計図

Table 1. 頂点テーブル
頂点の
番号
頂点の座標
x y z
0 -1.0 -1.0 1.0
1 1.0 -1.0 -1.0
2 1.0 1.0 1.0
3 -1.0 1.0 -1.0
  Table 2. 面テーブル
面の
番号
頂点の番号
a b c d
0 0 1 2 -
1 2 3 0 -
2 ? ? ? -
3 ? ? ? -

なお,libpolygon では,面のポリゴン形状は, 三角形と四角形だけに限定されている. (混合利用も可能.)

例えば,五角形ポリゴンを使いたい場合には, 四角形と三角形の2枚のポリゴンを組み合わせればよい. もちろん,三角形3枚でもよい.

三角形ポリゴンを作成するには, ソースファイル 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 度回転し,そのポリゴンを表側から見直して, 頂点順序を考え直そう.

なお,今回のサンプルプログラムでは, 面の裏側は暗く表示されるようになっている.

なお,作成したデータについては, 後日再利用するかもしれないので, 設計図も残しておくとよい. 後日,「隠面処理」の課題がある.

作図には tgif や oodraw が利用可能.

さらに,余裕のある人は, OpenSCAD や POV-Ray で利用されているような プリミティブ形状を作成してみよう. 例:円錐,円柱,球,...

データを手動入力するのではなく, ループを利用して自動計算させるとよい.

(c) 2017, KY