PG喫茶

4. クリッピング

概要

通常、キャンバスより大きい図形を描画しても、図形がキャンバスからはみ出ることはありません。これはキャンバス内部で自動的に、はみ出た部分を切り取ってくれるからです。これをクリッピングと言います。しかし、3次元グラフィックスで遠近法を用いる場合は、奥行きで除算するため、奥行きが0またはマイナスの場合、0除算や描画が乱れるコトが想像できます。3次元グラフィックスの場合は、3次元のクリッピング処理が必要となります。

視野領域

遠近法を用いる場合、視野領域はピラミッド型になります。極端に遠くのものは、とても小さくなるため、後面より奥は、描画対象から外します。

6つのクリッピング面

視野領域は、前面、後面、右面、左面、上面、下面で構成されます。それぞれの面でクリッピングを施します。

面ごとのクリッピング

形状の面の頂点を1回り調べて、クリッピング面の外側にある頂点は除いていきます。同時に、頂点が外にはみ出る時、内側に入り込む時は、クリッピング面との交点を追加していきます。

面の情報と面との距離

面の情報は、向きベクトルと原点からの距離からなります。原点からの距離は、面の任意の点と面の向きの内積で求めるコトができます。厳密には、向きベクトルの長さが1の時ですが、クリッピングの計算では、長さは考慮しなくても良いです。面と頂点の距離は、面の向きと頂点の内積から、面の原点からの距離を引いたものになります。内積とは、ある向きの成分を抽出するようなモノです。

面と線分の交点

頂点を結ぶ線分とクリッピング面が交わる条件は、頂点が、面の表側と裏側に1つずつある時です。つまり、面との距離が、プラスとマイナスの時です。交点は次式で求まります。

ビューア3クラス

ビューア2クラスから派生させて、ビューア3クラスを作成します。メニュー「パラメータ」に「アニメーション」を追加し、「アニメーション」ダイアログが表示されるようにします。「アニメーション」ダイアログでは、アニメーションの周期と位置を設定できるようにします。アニメーションの位置は0.0から1.0の間とします。メニュー「設定」に「アニメーション」を追加し、アニメーションの再生と停止を切り替えられるようにします。

ビューポートクラスにクリッピング処理を追加

ビューポートの面の描画(render_face)内のget_polygonメソッドにクリッピング処理を追加します。

ソースコード

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

実行結果

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