3Dグラフィックス(透視図法)

ここでは3Dグラフィックスの基本的な表現方法、3Dを描画する際に必要となる透視図法等の基礎について解説する。これはアプリケーションやムービー製作において、自らコードを組んで3Dを描画するには不可欠な知識で、あらゆる3D表現の基礎となるものである。ここでは一般的な事柄のみを解説する。具体的な実装方法については関連項目を参照のこと。

関連項目:Flash ActionScriptによる3D描画(ワイヤーフレームモデル)

関連項目:Flash ActionScriptによる3D描画(サーフェイスモデル)

透視図法

我々が暮らしている現実の空間は言わずと知れた3次元空間であり、そこにある物体を紙やPCディスプレイなどの2次元上で表現するには、3次元空間上の点を2次元画面上の一点に対応させる何らかの「座標変換」を行って次元を減らす操作が必要となる。座標変換というと非常に難しい印象があるが、3次元を2次元で表現している例は身近なところに数多くあり、3次元の地球から2次元の世界地図を作る色々な図法や、いわゆる「影絵」などもこれら座標変換の一種である。

コンピュータグラフィックスの分野で通常、次元を減らす方法として用いられているのは、ここで扱う「透視図法」、とりわけ1点透視図法である。1点透視図法では無限遠点(消点)を1点定め、視点(観測点)から遠くにあるものほど消点に向かって小さくなり消えていくように表現する。1点透視図法で箱を描くと下のようになる。

1点透視図法による箱の描画

このほか、広がりや高さをより強調するために2点,3点の透視図法が用いられることもあるが、その用途は限定的である。以下では特に断りのない限り1点透視図法について解説する。

透視図法による座標変換

次に、1点透視図法で実際にグラフィックスを描く場合の具体的な座標の計算について、その方法を見てみよう。上で述べた通り、これは3次元座標で存在しているデータを、2次元画面(スクリーン)上のどの位置に描くかを決定する座標変換を行うということになるが、1点透視図法においてこれは非常に簡単である。必要となるルールはただ一つで、「視点からみて同じ方向にあるものは全て画面上の同じ点に描く」という、この概念だけである。

このアイデアはごく自然な表現である。例えば上の箱の絵で、実は青い箱の後ろに緑の箱が置いてあるとしよう。しかし、その箱は見えない。なぜなら同じ方向にある場合は重なってしまい一番手前にあるものしか見えないからである。同じ方向にあるものは、画面上の同じ点に描かれるというのは、通常の我々が行っている視覚による認識の当然の表現なのである。青い箱を取り除けば、ほぼ同じ位置に緑の箱が(小さめに)描かれるだろう。

1点透視図法の数式表現

同じ方向にあるというのを数式で表現してみよう。座標軸を下図左のように導入し、今視点は原点にあって+Z方向を見ているとする。各箱の座標をR,B,Gの添え字をつけたX,Y,Zで表すことにすると、青箱(点B)と緑箱(点G)は同じ方向にあるので、相似の関係から次のようになる。

XB/ZB = XG/ZG
YB/ZB = YG/ZG

同じ方向にあるものを同じ点に描くということから、今の点Bと点GのようにX/Z,Y/Zの値がそれぞれ等しい点については、すべて画面上の同一点に表示することとなる。実際には上図右のように、視点に近いところ(距離h)にスクリーンを置き、そこに写ったものを画面に表示する方法が採られ、3次元空間内の点(X,Y,Z)は、視点からその点に向かう直線とスクリーンの交点(hX/Z, hY/Z)に対応させられることになる。

(X,Y,Z)→(hX/Z,hY/Z)

これは確かに同一方向にあるものをすべて同一点に描くという1点透視図法による座標変換の表式となっている。すなわち、1点透視図法で3次元を2次元上で描くには、3次元空間内の点を、視点から消点に向かう方向の距離Zで割って適当な比例係数(スクリーン視点間距離)を掛けた位置に変換・表示すれば良いこととなる。

この例では視点が原点に固定されているとしたが、原点にない場合は必要に応じて点のデータを平行移動し、また視点方向がZ軸と異なる場合は同様にデータに回転行列を作用させ適宜回転させた後に上記の透視図法の変換をおこない表示することで任意の3D空間を描くことが出来る。

補足事項

クリッピング

今、この例では全ての点は視点の前にある(Z>0が常に成り立つ)としたが、Z=0またはZ<0となる点がある場合は、はみ出す部分をカットするクリッピングの処理が必要となる。また、視点から非常に近い位置に点がある(Z<<1)場合は、除算を行うとオーバーフローする場合があり、その場合は視錐からはみ出す部分をカットする横方向のクリッピングも必要となる。

視野角

スクリーンと視点の距離hを変えると視野角(目を動かさずに見ることのできる範囲である視錐の広がり角度)を変更することができる。人間の視野角はおよそ60度程度と言われているが、あまり広い範囲を描くと周辺部では相当のゆがみが生じる。このあたりは実際に描いてみて値を変えて調整するのが良いだろう。