はじめに

こんにちは!

今日は、3DCGにかかせない座標系の話をするよ!


座標系の種類

では、オブジェクトから画面まで、どのような座標系があるか紹介します。
.

座標系一覧

呼び方が変わりますが、細かく分けると次のような流れになっています。
各々の変換とよばれている部分が行列を掛け算することに相当します。
座標はベクトルとし、このベクトルに座標を掛け算して、次の座標系へ移動していきます。
この手法は、アフィン変換と呼ばれています。
より具体的に話すと、3Dの座標のベクトルは[x, y, z, 1]の4点を持ち、ここに4×4行列を掛け算していく処理です。
なぜ3Dの座標なのに、4つの値をもっているかというと、移動のアフィン変換をするときに必要となるためです。
.
1. オブジェクト座標系・ローカル座標系・モデル座標系
. ↓(ワールドトランスフォーム・モデリング変換)
2. ワールド座標系・グローバル座標系
. ↓(ビュートランスフォーム・視野変換・ビューイング変換)
3. 視点座標系・カメラ座標系
. ↓(プロジェクショントランスフォーム・投影変換・射影トランスフォーム)
4. クリッピング座標系・クリップ座標系
. ↓(遠近除算)
5. 正規化デバイス座標系
. ↓(ビューポート変換)
6. ウインドウ座標系・スクリーン座標系
.

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つのベクトルは基底のため、線形独立しています。

この中で法線ベクトルは、
3DCGを少し勉強するとよく出てくるので知っているかもしれません。
物体の表面から垂直に伸びるベクトルのことです。
光の方向と、法線との向きから、照らされる光の量を計算したりよく利用されるベクトルです。

あとは、接ベクトルと従法線ベクトルですが、
これは、UV座標上でのU方向、V方向のベクトルとなります。
三角ポリゴン上の各頂点のUV座標と、位置座標の方程式を解くことで、
この接ベクトルと従法線ベクトルが求まります。

利用方法によっては、この3つのベクトルは線形独立として扱うのではなく、
3つが互いに垂直に交わっている、いわゆる直行させたベクトルに変換して扱う場合もあります。

接空間座標系の呼び方として、
表面における頂点ごとの座標系のため頂点座標系、
物体にUVマッピングと呼ばれるテクスチャを張り付ける手法における座標系からテクスチャ座標系
とも呼ばれるようです。

3DCGの勉強を進めていくと、バンプマッピングと呼ばれる手法を扱う際に接空間の話が出てきます。
そのときに、こんな空間もあったなーと思いだすといいかもしれません。

関連記事

  • DirectXとOpenGLのベクトル/行列演算の違いDirectXとOpenGLのベクトル/行列演算の違い はじめに こんにちー。 なたでです。 今日も引き続き勉強会です。 これまで、座標系とその変換を学んできました。 今回、実際にその計算を行うため、 具体的にはベクトルや行列演算について どのようにソースコード上で書けばいいか学んでいきましょう。 ということで・・・ DirectX、OpenGL、各シェーディング言語の型や計算の特徴をまとめるぞー!( […] Posted in アルゴリズム
  • DirectXとOpenGLのカリングの設定方法の違いDirectXとOpenGLのカリングの設定方法の違い はじめに こんにちはー! 今日は、3D描写するときのテストの話をします。 テストと聞いて何を思い浮かびますでしょうか。 試験とか、勉強とかそんなことをきっと思い浮かべるでしょう。 作成した3Dポリゴンの頂点を描写するときも、 本当に描写していいのか、無駄ではないのか試験をしています。 いくつかテスト方法を紹介しましょう。 ・背面カリング(裏面カ […] Posted in アルゴリズム
  • DirectXとOpenGLの回転行列、回転軸、回転方向DirectXとOpenGLの回転行列、回転軸、回転方向 はじめに こんにちは! ハンドスピナーを最近買ったなたでです! 今日も勉強会をしましょう。 本日は、DirectXとOpenGLの軸の違いに焦点をあてて 回転行列をおさらいしてみましょう。 掛ける順序 3D環境といえば、DirectX、OpenGLです。 今回、回転用の標準関数を調査して比較していきたいと思います。 比較する前に基本的な掛 […] Posted in アルゴリズム
  • DirectXとOpenGLのビューポート行列の違いDirectXとOpenGLのビューポート行列の違い はじめに こんにちは! 3DCGの再勉強中のなたでです! 今まで、次の変換行列の違いをみてきました。 ・DirectXとOpenGLのビュートランスフォーム行列の違い ・DirectXとOpenGLの射影トランスフォーム行列の違い 本日は変換の最後のビューポート行列の違いを調べてみましょう。 といっても、ここまでくると右手座標系・左手座標系という話はなくなっているので、 […] Posted in アルゴリズム
  • DirectXとOpenGLの射影トランスフォーム行列の違いDirectXとOpenGLの射影トランスフォーム行列の違い はじめに こんにちは! 引き続いて座標変換の話をします。 本日は射影トランスフォーム行列を覗いてみましょう。 前回の関連記事(予備知識として下から上に読んでおきましょう) ・DirectXとOpenGLのビュートランスフォーム行列の違い ・3DCGの座標系の紹介 ・DirectXとOpenGLの回転行列、回転軸、回転方向 数式の比較 . DirectXとOpenGL […] Posted in アルゴリズム
  • DirectXとOpenGLのビュートランスフォーム行列の違いDirectXとOpenGLのビュートランスフォーム行列の違い はじめに こんこん! 今回は、前回に引き続き座標変換の話をします。 特に、ビュートランスフォームの部分の計算式を見てみましょう。 気になっていたのは、DirectXとOpenGLとで違いがあるのかという点です。 おそらく違いはないはずですが、 前回の関連記事 ・3DCGの座標系の紹介 ・DirectXとOpenGLの回転行列、回転軸、回転方向 数式の比較 . Dir […] Posted in アルゴリズム