2. 隠面処理
概要
この章では、立方体を面単位で塗りつぶします。面には表と裏がありますが、立方体などは、外に向かっている表の面だけを描画すればよいでしょう。立方体の内側に入らない限り、裏の面は見えないからです。
面の向き
面の頂点データから、面の向きを求めることができます。ある頂点から、異なる2点に伸びるベクトルが解れば、数学の外積を用いて求めることができます。
右手系・左手系
面の頂点データを左回りに記録し、最初の頂点から2番目の頂点へ、最初の頂点から3番目の頂点へと伸びる、2つのベクトルの外積を取得し、面の向きとします。これは、ここで扱うサンプルプログラムの座標系が左手系の為です。Z軸に向かってネジを回すと想像して、X軸からY軸へが、右回りなら右手系、左回りなら左手系と呼びます。
可視面か判定
観測者の視線と面の向きが向かい合っていれば、可視面ということになります。向かい合いの判定には、数学の内積を用います。視線は、面の任意の頂点の座標となります。向かい合っていれば、内積はマイナスに、直交している場合はゼロ、同じ方向ならプラスになります。
3つのクラスを追加
これから、サンプルプログラムを記述していく際、処理が重複して、冗長になるコードが出てきます。そこで、ウィンドウ、メニュー、水平・垂直スライダなどをビューアクラス、形状を形状クラス、形状の描画をビューポートクラスに任せることにします。上記のサンプルプログラムは下記のように短く記述できます。
ビューアクラス
これからのサンプルプログラムは、このクラスを親にして作っていきます。アプリケーション実行時にこのクラスから呼び出される、メニュー作成(init_menu)、情景作成(init_scene)、描画(render)をオーバーライドすることで、実現します。メニューとキャンバス、水平・垂直スライダの部品から構成されます。
形状クラス
頂点データと面データを記録します。立方体、球、円柱、円錐の4つを基本形状として、簡単に作成できるようにします。のちの章では、法線データ(頂点ごとの向き)や質感、テクスチャも扱います。
ビューポートクラス
形状をキャンバスに出力する部分を担当します。座標の計算や、光源の計算を行います。