球に関する陰線処理プログラム


 

球の3D描画図を陰線処理することを考えます。まずは、緯度線と経度線上にある

見える点と見えない点を区別する方法を検討しましょう。図1は、視点と球そして投

影する二次元平面を示しています。 視点から球面へ向かって接線を引きます。 こ

のときの接点を点Aとします。 視点の方向をY軸の+方向としているので、 この方

向の単位ベクトルは(0、1、0)となります。一方、接点Aの座標を(X,Y、Z)とする

と、接点方向を向く単位ベクトルは、

 

( X / R、Y / R、Z / R ) ここで、R=(X+Y+Z1/2

 

となります。上記の二つの単位ベクトルの内積を計算すると、

 

内積の値(K)=Y / (X+Y+Z1/2

 

となります。二つのベクトルを とすると、内積は

 

=| | | | COSψ

 

でも与えられます。 ここで、絶対値記号はベクトルの大きさを示しています。 また、

ψは二つのベクトルの挟む角です。したがって、内積の値は0度から180度の範囲

で単調に減少することが判ります。 以上より、上記で計算した単位ベクトル間の内

積の値が陰線処理の判断基準となります。

 

<球の中心が原点

KYUU-INSEN-SHORI-1.GIF - 5,590BYTES

(図1、Functionviewで作成)

 

緯度線と経度線上にある点の方向を向く単位ベクトルと視点方向を向く単位ベクト

ルの内積の値をSPとすると、

 

(1)SPがK以上ならば、陰線処理をしない

(2)SPがK未満ならば、陰線処理をする

 

という結論になります。 それでは、 この点を考慮した陰線処理のプログラム(外部

副プログラム)を作ってみます。その為には、Kの値を計算しなければなりません。

図2は、図1のY−Z平面の様子を示したものです。 球の半径がRで、 視点の座標

が(0、Y、0)であるので、  二つの直角三角形ABOCAO)の相似比から、

 

AB:BO:OA=CA:AO:OC

→ (Y−R1/2:Y:R=CA:R:OC

 

が得られます。ゆえに、CAとOCの長さは、

 

CA=( R / Y)(Y−R1/2

OC=R/ Y

 

となり、この関係から接点方向の単位ベクトルは、

 

(0、R / Y、(1/ Y)(Y−R1/2

 

となります。よって、Kの値は以下のように求まります。

 

K=R / Y

 

<光の直進性から、視点側からは接点を超えた領域は見えない>

KYUU-INSEN-SHORI-2.GIF - 3,939BYTES

(図2、Functionviewで作成)

 

以下の図は、上記のKの値を使って陰線処理した球の3D描画図です(図3参照)。

 

<θ=45度、φ=45度の方向から見た場合>

KYUU-INSEN-SHORI-3.GIF - 7,755BYTES

(図3、十進BASICによる3Dグラフィックス)

 

より近い位置から見た場合の図も示して置きます(図4参照)。

 

<θ=45度、φ=45度の方向から見た場合>

KYUU-INSEN-SHORI-4.GIF - 8,701BYTES

(図4、十進BASICによる3Dグラフィックス)

 

課題(その1)

 

ドーナツ形状の陰線処理の方法を考えてください。 また、 そこで得た陰線処理の

方法を一般化してください(もし可能ならば)。

 

ドーナツ形状に関する陰線処理プログラム

楕円体に関する陰線処理プログラム

開曲面に関する陰線処理プログラム

 

最後に、球に関する陰線処理のプログラムコードの主要部分を示します。

 

PROGRAM-3D-KYUU-BYOUGA-INSEN-SHORI-1.GIF - 10,708BYTES

PROGRAM-3D-KYUU-BYOUGA-INSEN-SHORI-2.GIF - 10,951BYTES

PROGRAM-3D-KYUU-BYOUGA-INSEN-SHORI-3.GIF - 4,623BYTES

 

図形に関する座標値の計算・回転変換の外部副プログラムは省略します。

 

PROGRAM-3D-KYUU-BYOUGA-INSEN-SHORI-4.GIF - 7,169BYTES

 

図形に関する投影および座標軸に関する回転変換・投影・描画の外部副プログラ

ムも省略します。

 

PROGRAM-3D-KYUU-BYOUGA-INSEN-SHORI-5.GIF - 11,150BYTES

PROGRAM-3D-KYUU-BYOUGA-INSEN-SHORI-6.GIF - 1,657BYTES

 

 

 


 

Topへ