PG喫茶

2. 隠面処理

概要

この章では、立方体を面単位で塗りつぶします。面には表と裏がありますが、立方体などは、外に向かっている表の面だけを描画すればよいでしょう。立方体の内側に入らない限り、裏の面は見えないからです。

面の向き

面の頂点データから、面の向きを求めることができます。ある頂点から、異なる2点に伸びるベクトルが解れば、数学の外積を用いて求めることができます。

右手系・左手系

面の頂点データを左回りに記録し、最初の頂点から2番目の頂点へ、最初の頂点から3番目の頂点へと伸びる、2つのベクトルの外積を取得し、面の向きとします。これは、ここで扱うサンプルプログラムの座標系が左手系の為です。Z軸に向かってネジを回すと想像して、X軸からY軸へが、右回りなら右手系、左回りなら左手系と呼びます。

可視面か判定

観測者の視線と面の向きが向かい合っていれば、可視面ということになります。向かい合いの判定には、数学の内積を用います。視線は、面の任意の頂点の座標となります。向かい合っていれば、内積はマイナスに、直交している場合はゼロ、同じ方向ならプラスになります。

3つのクラスを追加

これから、サンプルプログラムを記述していく際、処理が重複して、冗長になるコードが出てきます。そこで、ウィンドウ、メニュー、水平・垂直スライダなどをビューアクラス、形状を形状クラス、形状の描画をビューポートクラスに任せることにします。上記のサンプルプログラムは下記のように短く記述できます。

ビューアクラス

これからのサンプルプログラムは、このクラスを親にして作っていきます。アプリケーション実行時にこのクラスから呼び出される、メニュー作成(init_menu)、情景作成(init_scene)、描画(render)をオーバーライドすることで、実現します。メニューとキャンバス、水平・垂直スライダの部品から構成されます。

形状クラス

頂点データと面データを記録します。立方体、球、円柱、円錐の4つを基本形状として、簡単に作成できるようにします。のちの章では、法線データ(頂点ごとの向き)や質感、テクスチャも扱います。

ビューポートクラス

形状をキャンバスに出力する部分を担当します。座標の計算や、光源の計算を行います。

ソースコード

ビューア ビューポート 数学 形状

実行結果

Copyright© 2016-2025 pg-kissa.net All Rights Reserved.