4. クリッピング
概要
通常、キャンバスより大きい図形を描画しても、図形がキャンバスからはみ出ることはありません。これはキャンバス内部で自動的に、はみ出た部分を切り取ってくれるからです。これをクリッピングと言います。しかし、3次元グラフィックスで遠近法を用いる場合は、奥行きで除算するため、奥行きが0またはマイナスの場合、0除算や描画が乱れるコトが想像できます。3次元グラフィックスの場合は、3次元のクリッピング処理が必要となります。
視野領域
遠近法を用いる場合、視野領域はピラミッド型になります。極端に遠くのものは、とても小さくなるため、後面より奥は、描画対象から外します。
6つのクリッピング面
視野領域は、前面、後面、右面、左面、上面、下面で構成されます。それぞれの面でクリッピングを施します。
面ごとのクリッピング
形状の面の頂点を1回り調べて、クリッピング面の外側にある頂点は除いていきます。同時に、頂点が外にはみ出る時、内側に入り込む時は、クリッピング面との交点を追加していきます。
面の情報と面との距離
面の情報は、向きベクトルと原点からの距離からなります。原点からの距離は、面の任意の点と面の向きの内積で求めるコトができます。厳密には、向きベクトルの長さが1の時ですが、クリッピングの計算では、長さは考慮しなくても良いです。面と頂点の距離は、面の向きと頂点の内積から、面の原点からの距離を引いたものになります。内積とは、ある向きの成分を抽出するようなモノです。
面と線分の交点
頂点を結ぶ線分とクリッピング面が交わる条件は、頂点が、面の表側と裏側に1つずつある時です。つまり、面との距離が、プラスとマイナスの時です。交点は次式で求まります。
ビューア3クラス
ビューア2クラスから派生させて、ビューア3クラスを作成します。メニュー「パラメータ」に「アニメーション」を追加し、「アニメーション」ダイアログが表示されるようにします。「アニメーション」ダイアログでは、アニメーションの周期と位置を設定できるようにします。アニメーションの位置は0.0から1.0の間とします。メニュー「設定」に「アニメーション」を追加し、アニメーションの再生と停止を切り替えられるようにします。
ビューポートクラスにクリッピング処理を追加
ビューポートの面の描画(render_face)内のget_polygonメソッドにクリッピング処理を追加します。