3Dグラフィックス
3Dグラフィックスは、 二次元平面上に三次元の物体(立体図形)を投影して描写
する方法です。 まず、この方法を検討してみましょう。図1は、視点と物体そしてそ
れを投影する二次元平面です。赤のラインは、直進する光のラインを示しています
。この図の実際の視点は、図に書かれている視点の位置ではありません。 誤解し
易いので、念のため指摘して置きます。
<視点の位置から見た投影図>
(図1、Functionviewで作成)
図1の場合は、 視点から物体(正六面体)の前面に垂線を下ろしたとき、その交点
がその中心に来るようになっています。したがって、視点から見たとき、前面の各点
は二次元平面上で黒の実線で結ばれた位置に投影されます。 一方、 後面の各点
は黒の点線で結ばれた位置(実線の内側)に投影されます。つまり、後ろの各点は
前面に隠れてまったく見えないことになります。また、物体の前面、後面そして二次
元平面の三面が互いに平行であり、 上記の垂線が各面の中心を通るので、 次の
関係(相似関係)が成り立ちます。
物体の前面(後面)の線長:黒の実線(点線)の線長=
前面(後面)までの距離:二次元平面までの距離 (視点から)
さて、上の図において物体を回転させた後の投影図を求めるために、XYZ軸の方
向を決めます。図1における二次元平面の中心を原点とします。上向きをZ軸の+
方向、左向きをX軸の+方向、 手前方向をY軸の+方向とします。 次に、図1にお
ける各点の座標値を以下のようにします。
視点の座標値→(0、YV、0)
物体の座標値→(XO、YO、ZO)
二次元平面における投影点を計算する上で、空間における直線の式は重要です。
まず、この式を得ることから考えましょう。直線が二点A(X1、Y1、Z1)とB(X2、Y
2、Z2)を通るとすると、 直線上の任意の点C(X、Y、Z)との関係(AC //AB)か
ら、Kを定数として
K(X2−X1、Y2−Y1、Z2−Z1)=(XーX1、Y−Y1、Z−Z1)
が得られます。各成分をKについて解いて等しいと置くと、
(X−X1)/(X2−X1)=(Y−Y1)/(Y2−Y1)=(Z−Z1)/(Z2−Z1)
となり、直線の一般式が得られます。それでは、物体を物体の中心(0、YC、0)に
関して回転させたときの投影図を求めてみます。図2に、物体の中心を原点とする
XRYRZR座標系を示しました。XYZ座標系との関係は、
X=XR Y=YR+YC Z=ZR
です。
<回転する前の物体>
(図2、Functionviewで作成)
物体をZR軸に関して、反時計方向に45度回転させてみます。座標変換の式は、
以下のようになります。回転前の座標値を(X3、Y3、Z3)とし、回転後の座標値を
(X4、Y4、Z4)としています(XYZ座標系が基準)。
X4=X3COSθ−(Y3−YC)SINθ
Y4=X3SINθ+(Y3−YC)COSθ+YC
Z4=Z3
視点や物体の点の座標値を具体的に設定して、 回転後の座標値を計算し図3に
示します。視点および物体の各座標値は、
視点→(0、24、0)
物体(前面)→(2、10、2)、(−2、10、2)、(2、10、−2)、(−2、10、−2)
物体(後面)→(2、6、2)、(−2、6、2)、(2、6、−2)、(−2、6、−2)
物体(中心)→(0、8、0)
です。
<回転した後の物体>
(図3、Functionviewで作成)
さらに、 物体をXR軸に関して反時計方向に45度回転させることを考えます。 回
転後の座標値を(X5、Y5、Z5)とすると、変換式は、
X5=X4
Y5=(Y4−YC)COSθ−Z4SINθ+YC
Z5=(Y4−YC)SINθ+Z4COSθ
となります(XYZ座標系が基準)。したがって、回転した後の図は、図4のようになり
ます。
<さらに回転した後の物体>
(図4、Functionviewで作成)
では、この状態での二次元平面への投影図を求めてみます。直線の式に戻って考
えてみます。 二次元平面では、Y=0となるので、視点、物体の各点そして投影点
(XS、0、ZS)の座標値間の関係は、
XS / XO=−YV / (YO−YV)=ZS / ZO (相似関係)
となります。図5は、図4に投影図を付け加えたものです。図中の視点、物体そして
二次元平面の位置関係は変わっていませんが、これらの図を作成するときの実際
の視点の位置は変わっています( Functionview上での視点は、 図4と図5では
異なる)。物体と投影図の線が重ならないようにしています。
<図4に物体の投影図を付加>
(図5、Functionviewで作成)
Functionview に限りませんが、 ソフトの使用条件によってはソフトが使用中に
暴走またはフリーズする場合があります。ファイルの修正作業をしている場合は、
こまめにファイル内容を保存するようにしてください。 信頼性が比較的に低いフリ
ーソフトの場合は、特に注意が必要です。
ここまでの議論から、3Dグラフィックスのポイントを簡単にまとめると、
(1)視点と投影図を作る二次元平面の位置を決める
(2)物体を見たい方向に回転させる
(3)視点と物体の座標値から、投影点の座標値を計算する
(4)(3)で求めた座標値を繋いで作図する(陰線処理などを含む)
ということになります。3Dグラフィックスの初歩的なプログラムを作る準備はできた
ので、具体的に例を挙げてプログラミングしてみましょう。
一番目の例として、球面を描くプログラムを考えてみます。 まず最初に、半径が異
なる複数の円周線を描くことで球を表現してみます。その前に、球座標を復習しま
しょう。 中学校や高校で学ぶ直交するXYZ座標よりも、 球座標を使った方が球に
関する問題では計算し易くなります(図6参照)。XYZ座標と球座標の関係が、
X=R COSθSINφ
Y=R SINθSINφ
Z=R COSφ
となることは発展編の’体積を求める’でも説明しました。
<球座標とXYZ座標の関係>
(図6、Functionviewで作成)
上図において、 点Bは空間にある点AからX-Y平面に垂線を下ろしたときにできる
交点です。 また、点Eは点AからZ軸に垂線を下ろしたときにできる交点であり、 点
Cと点Dはそれぞれ点BからX軸とY軸に垂線を下ろしたときにできる交点です。 し
たがって、 線分OAの長さが球座標のRであり、∠BOCがθで∠AOEがφとなり
ます。ここで、以下のベクトルが、
(COSθSINφ、SINθSINφ、COSφ)
θとφで決定される方向を向く単位ベクトルであることに注意してください。この方
向から物体を投影するためには(視点はY軸の+方向にある)、物体を回転させて
このベクトルをY軸の+方向に合わせる必要が出てきます。つまり、次の二度の回
転変換を連続して行わなければなりません。
(1)Z軸に関して、反時計方向にπ/ 2−θだけ回転させる
(2)X軸に関して、時計方向にπ/ 2−φだけ回転させる
以上の点に留意しつつ、回転後の球を描くことにします。まずは、回転前の球を図
7に示します。
<回転前の球>
(図7、Functionviewで作成)
上図において、緯度を示す線は赤(実線および点線)で、経度を示す線は青(実線
)で示しています。ここで、緯度の間隔はπ/ 8で、経度の間隔はπ/ 6です。
球をθとφで決まる方向から見たときの投影図を、自由に描画できるプログラムを
使って作図した結果を図8(回転前を模擬)と図9(回転後)に示します。
<θ=45度、φ=45度の方向から見た場合>
(図8、十進BASICによる3Dグラフィックス)
多くのソフトでは、 物体と二次元平面や視点との位置関係が曖昧になっています
が、このプログラムではそれを数値的に指定できるようにしました。意欲がある方
は、自分専用の3Dグラフィックス・ソフトを作ってみてください。
<θ=80度、φ=20度の方向から見た場合>
(図9、十進BASICによる3Dグラフィックス)
課題(その1)
上図では、球の反対側にある本来は見えない線も描画されています。 この部分を
描画しないようにする陰線処理のアルゴリズムを考えてください。 ヒント->視点
方向を向く単位ベクトルと視点から球面に引いた接線の接点の方向を向く単位ベ
クトルとの内積の値を計算してみてください。 この値を陰線処理する点を選ぶ判
断基準として使います。
課題(その2)
ドーナツ形状の立体図形を3D描画するプログラムを作成してください。視点の方
向は球の問題と同様にθとφで指定してください(図10参照)。
<θ=45度、φ=45度の方向から見た場合>
(図10、十進BASICによる3Dグラフィックス)
次に、三次元空間で物体が回転するアニメーションを作ってみましょう。 回転する
物体は正八面体とします(図11参照)。 まずは、正八面体の空間座標を決定しま
す(点A〜F)。回転軸は任意の方向を向く線分GHです。
<正八面体とその回転軸>
(図11、Functionviewで作成)
アニメーションを動作させるプロセスは以下のようになります。点Gの方向が、θと
φで決まる方向であると仮定します。
(1)Z軸とX軸に関して連続して回転変換を行い、回転軸をY軸の+方向に合
わせる
(2)Y軸に関して、時計方向か反時計方向に回転させる(時間間隔をおいて)
(3)(1)の逆変換を行い、物体(正八面体)を繰り返し描画する
アニメーションの一場面を以下に示します(図12参照)。 物体の回転軸はθ=80
度、φ=10度の方向を向いています。視点はY軸の+方向です。
(図12、十進BASICによる3Dアニメーション)
課題(その3)
上のプログラムでは、視点の位置をY軸の+方向に固定しています。 回転軸と同
様に視点の位置も自由に設定できるようにプログラムを修正してみてください。
さて、ここまでの議論で物理的に仮定しているのは、光の直進性だけです。あとは
数学的なテクニック(幾何学)をいろいろと使いました。この直進性に、光の反射や
屈折の法則を加えてどのような議論ができるかをもう少し検討してみましょう。
応用テクニック(その1)
物体(立体図形)に光が当たったときにできる影を作ってみましょう。 太陽光の場
合は、太陽が地球から十分に遠い距離にあるため、 平行光として扱っても問題は
ありません。一方、家庭で使うLED電球などでは、光の点源から放射状に広がる
光となります。ただし、光の直進する性質はどちらの場合でも変わりません。
光の点源を視点の位置だとして、そのときにできる影の形状が二次元平面にでき
る投影図の輪郭と同じものであることは、 光の直進性から容易に想像できると思
ます。平行光は、視点の位置が物体から無限遠にある場合に相当します。
(図13、Functionviewで作成)
図13は二次元平面上に球をおいた場合です。 光の点源の位置によって、球の影
の形状がどのように変化するかを考えてみます。 この図では、点源は球の真上に
あります。したがって、影の形状が平面上で円になることは容易に理解できると思
います。それでは、その円の半径を計算してみます(図14参照)。
(図14、Functionviewで作成)
上図において球の半径をRとし、光の点源の座標値を(0、0、ZL)とします。 直角
三角形(BAOとPAD)は互いに相似なので、次の関係が成り立ちます。
AO:BO=AD:PD → ZL−R:R=(X2+ZL2)1/2:X
ここで、XはPDの長さ(影の円の半径)です。これを解いてXを求めると、
X=R{ ZL/ ( ZL−2R ) }1/2
が得られます。 それでは、光の点源が球の真上からずれた場合にどうなるかを調
べてみます。光の点源から球に接線を引いたときにできる接点を結ぶと円になりま
す。この円の二次元平面への投影図が影の輪郭となります。 図15は光の点源が
位置を変えたときに、球の影の輪郭がどのように変化するかを図にしたものです。
<Z軸の+方向にある光の点源を少しずつY軸の−方向にずらした場合>
(図15、十進BASICによる2Dグラフィックス)
課題(その4)
光の点源の位置が球の真上からずれた場合にできる、 球の影の輪郭の長さを計
算してみてください。 また、 この輪郭で囲まれる領域はどのような形状をしていま
すか。