透視変換とは, 任意の視点から3次元空間を眺めて遠近感を出す変換である. DCLにおいては, 3次元正規座標系から2次元透視座標系への変換を指す.
一般に, この変換では3次元空間上の平行線は投影された2次元平面上では 平行にならない. 視点を無限遠に持っていけば, 平行線は平行線に投影されるが, そのように投影された図形はかえって不自然に感じられる.
透視変換を行なうには, 「視点」 と「焦点中心」を設定 しなければならない. 視点とは読んで字の通り3次元空間を眺める位置であり, カメラのレンズの位置であると思えば良い. これに対して, 焦点中心はカメラのフィルム上の焦点ではなく, 注目している点, すなわち視点から「見つめる点」である. この視点と焦点中心を結ぶ線が「視線」 である.
透視変換によって 3次元図形の各点は, その点と視点を結ぶ線が 「投影面」と交わる点に投影される. 地球流体電脳ライブラリでは, 投影面は焦点中心を通り, 視線に垂直な面である.
2次元座標系の場合, 2次元の正規座標系を3次元の正規座標系の1平面に割り付ける ことで, 透視変換が可能になる. この際に割り付けることができる平面は, 3次元 X, Y, Z 座標軸のいずれかに 垂直な平面であり, 斜めの面に割り付けることはできない. (斜めに見るには視点を動かせば良い)
( XEYE3, YEYE3, ZEYE3 )
3次元空間上での視点.
この位置にカメラを構えていると思えば良い.
( XOBJ3, YOBJ3, ZOBJ3 )
3次元空間内で視線を向ける目標点.
カメラを向ける被写体の位置と思えば良い.
なお, 焦点中心を通り, 視線(視点と焦点中心を結ぶ線)に垂直な面が
投影面となる.
すなわち, 3次元空間上の点(X,Y,Z) は, その点と視点を通る線が
投影面と交わる点に投影される.
( ANGLE3 )
視点からこの角度で見える投影面上の長さが,
正規直角座標系の単位長さとなる.
( TILT3 )
Z 軸の傾き. カメラの光軸回りの傾きに相当する.
この角度が0 の時, 3次元空間のZ軸は正規直角座標のY軸に並行にな
る.
視線がZ 軸と平行な場合には, Y 軸が基準になる.
( XOFF3, YOFF3 )
正規直角座標系に投影された焦点中心の位置を,
中心からの位置で指定する.
通常この値は (0,0) で良い.
( IXC3, IYC3, SEC3 )
2次元平面を3次元空間のどこに位置付けるか指定する.
IXC3, IYC3 はそれぞれ2次元平面のX座標, Y座標に対応する
3次元座標を (1,2,3) の数字で指定するもので,
数字はそれぞれ X座標, Y座標, Z座標に対応する.
これらの数値に負の値を指定すると, 正負を逆に割り当てる.
SEC3 は残りの座標の座標値である.
透視変換のパラメタも DclNewFrame を呼んだ後でかつ描画をはじめる前に 変換関数を決めるパラメータを指定しておく. これらのパラメタの値は, 変換関数を確定するルーチン DclSet3DProjection を呼ぶことで有効になる. 透視変換のパラメタは, 2次元およおよび3次元正規変換と独立である.
主要なパラメタはすべて DclGetParm/DclSetParmによって管理されているが, まとめてパラメタを設定するルーチンが用意されており, 普通はそちらを使ってパラメタの設定を行なう.
具体的に変換パラメタを設定するにはDclNewFrame のあとで次のように コーディングする.
call DclSet3DEyePoint(xeye3, yeye3, zeye3) call DclSet3DObjectPoint(xobj3, yobj3, zobj3) call DclSet3DProjection
そのほかのパラメタは必要に応じて DclSetParmで指定する.
なお, 2次元平面を3次元平面に割り付けるには, DclSet3DProjection の前に,
call DclSet2DPlane(ixc3, iyc3, sec3)
を呼ぶ. これにより, 2次元平面上の描画ルーチンを 3次元空間内の平面上で使うことができるようになる.