はじめに
こんにちは!
今日は、3DCGにかかせない座標系の話をするよ!
座標系の種類
では、オブジェクトから画面まで、どのような座標系があるか紹介します。
座標系一覧
呼び方が変わりますが、細かく分けると次のような流れになっています。
1. オブジェクト座標系・ローカル座標系・モデル座標系
↓(ワールドトランスフォーム・モデリング変換)
2. ワールド座標系・グローバル座標系
↓(ビュートランスフォーム・視野変換・ビューイング変換)
3. 視点座標系・カメラ座標系
↓(プロジェクショントランスフォーム・投影変換・射影トランスフォーム)
4. クリッピング座標系・クリップ座標系
↓(遠近除算)
5. 正規化デバイス座標系
↓(ビューポート変換)
6. ウインドウ座標系・スクリーン座標系
各々の変換とよばれている部分が行列を掛け算することに相当します。座標はベクトルとし、このベクトルに座標を掛け算して、次の座標系へ移動していきます。この手法は、アフィン変換と呼ばれています。より具体的に話すと、3Dの座標のベクトルは[x, y, z, 1]の4点を持ち、ここに4×4行列を掛け算していく処理です。なぜ3Dの座標なのに、4つの値をもっているかというと、移動のアフィン変換をするときに必要となるためです。
1. ローカル座標系
描写したいオブジェクト自身が開始点[0, 0, 0]となる座標系です。ボーンとか持つ場合はさらに細かい座標系があります。絵を見せれば一発なのですが、そこはググってください。
2. ワールド座標系
世界の座標です。この世界の中にいろいろなモデルが設置されます。表示させたいオブジェクト座標の全てのオブジェクトを一度この世界に配置させます。ワールド座標への変換をワールドトランスフォームと呼びます。この変換に必要な行列は、オブジェクトの座標と回転情報から作成します。
- DirectXでは、D3DXMatrixScaling, D3DXMatrixRotation, D3DXMatrixTranslation
- OpenGLでは、glMatrixMode(GL_MODELVIEW)にてglScale、glRotate、glTranslate
3. カメラ座標系
カメラの前に世界が広がっている仮定した座標系です。カメラの視点の座標を[0,0,0]とする変換です。カメラ座標系への変換をビュートランスフォームと呼びます。この変換に必要な行列は、カメラの座標とカメラが注視している座標から作成します。
- DirectXでは、D3DXMatrixLookAtLH
- OpenGLでは、gluLookAt
4. クリッピング座標系
近くのものは大きく、遠くのものは小さくなる空間です。実際には、近くのものは大きく、遠くのものは小さくする透視変換、近くのものも、遠くのものも同じ大きさにする正射影変換の2種類があります。透視変換では、目の前にある木の本数は少なく、遠くの山のほうたくさんの木が見えることとなります。この近くが小さく、遠くのほうが大きい台形の形が見える体積=視体積を、視錐台(しすいだい)と呼びます。この変換を、プロジェクショントランスフォームと呼びます。
- DirectXでは、D3DXMatrixPerspective
- OpenGLでは、glMatrixMode(GL_PROJECTION)にてgluPerspective
5. 正規化デバイス座標系
プロジェクショントランスフォームは、行列を掛けただけですが、この行列を掛けた後の座標ベクトル(x, y, z, w)にたいして、(x/w, y/w, z/w)とwで割った後の座標系です。この計算は行列の掛け算(アフィン変換)で計算できないため、プロジェクショントランスフォームの中でwに遠くのものを小さくするといった情報をつめこみ、wで割るというのを単独で処理をさせます。なお、wで割ることで歪むのですが、逆にwで掛け算すれば元の値にもどること示します。
すこし脱線しますが、テクスチャマッピングする際は、このwの値を保持して計算を行わないと、昔の3Dゲームの壁や床のテクスチャのような歪み方をします。これを補正するためパースペクティブコレクトという手法があります。
6. スクリーン座標系
実際にウィンドウなどに表示させるための変換です。表示させる画面の横サイズ、縦サイズから計算させます。
- DirectXでは、SetViewport
- OpenGLでは、glViewport
さいごに
今回は、様々な座標系があることを説明しました。ローカル座標系から、ワールド座標系、カメラ座標系へは直感的でわかりやすいのですが、クリッピング座標系、正規化デバイス座標系、スクリーン座標系については、なんとなく理解しているだけで、実際の内部の変換はどのようになっているか、あんまり知らない方も多いかと思います。
次回は、その変換の話にふみこんで解説していきたいです。なお、「その70 完全ホワイトボックスなパースペクティブ射影変換行列」が、とても参考になりますので、気になる方はみると良いです!
ではまた!
おまけ
まだまだある座標系
オブジェクトから画面までの座標系は上で解説しました。実は、オブジェクトより下にも座標系があります。
0. 接空間座標系・テクスチャ座標系
↑
1. オブジェクト座標系・ローカル座標系・モデル座標系
↓(ワールドトランスフォーム・モデリング変換)
2. ワールド座標系・グローバル座標系
↓(ビュートランスフォーム・視野変換・ビューイング変換)
3. 視点座標系・カメラ座標系
↓(プロジェクショントランスフォーム・投影変換・射影トランスフォーム)
4. クリッピング座標系・クリップ座標系
↓(遠近除算)
5. 正規化デバイス座標系
↓(ビューポート変換)
6. ウインドウ座標系・スクリーン座標系
接空間座標系とは?
Wikipediaを見ると詳しく乗っています。接空間/接ベクトル空間における座標系です。
接空間座標系では、以下の3つが基底になります。
- 法線ベクトル(Normal Vector)
- 接ベクトル(Tangent Vector)
- 従法線ベクトル(Binormal Vector)
※上記の3つのベクトルは基底のため、線形独立しています。
法線ベクトルは、物体の表面から垂直に伸びるベクトルです。光の方向と、法線との向きから、照らされる光の量を計算したりよく利用されるベクトルです。接ベクトルと従法線ベクトルですが、UV座標上でのU方向、V方向のベクトルとなります。三角ポリゴン上の各頂点のUV座標と、位置座標の方程式を解くことで、この接ベクトルと従法線ベクトルが求まります。
接空間座標系の呼び方として、表面における頂点ごとの座標系のため頂点座標系、物体にテクスチャを張り付けるUVマッピング方による座標系からテクスチャ座標系とも呼ばれるようです。
利用方法によっては、この3つのベクトルは線形独立として扱うのではなく、3つが互いに垂直に交わっている、いわゆる直行させたベクトルに変換して扱う場合もあります。
3DCGの勉強を進めていくと、バンプマッピングと呼ばれる手法を扱う際に接空間の話が出てきます。そのときに、こんな空間もあったなーと思いだすといいかもしれません。
コメント