DirectXとOpenGLのビュートランスフォーム行列の違い

投稿日: 更新日:

はじめに

こんこん!

今回は、前回に引き続き座標変換の話をします。
特に、ビュートランスフォームの部分の計算式を見てみましょう。
気になっていたのは、DirectXとOpenGLとで違いがあるのかという点です。
おそらく違いはないはずですが、

前回の関連記事
3DCGの座標系の紹介
DirectXとOpenGLの回転行列、回転軸、回転方向


数式の比較

.

DirextX

ビュートランスフォームを作るために
DirectXでは次のヘルパー関数が用意されています。
matrix *D3DXMatrixLookAtLH( matrix *pOut, vector *pEye, vector *pAt, vector *pUp);
左手座標系ビュー行列を作成する
matrix *D3DXMatrixLookAtRH( matrix *pOut, vector *pEye, vector *pAt, vector *pUp);
右手座標系ビュー行列を作成する

DirectXは左手座標系といわれていますが、
右手座標系と左手座標系の両方の行列が用意されています。

上記のサイトに書いてある式をまとめてみましょう。

なお引数のベクトルは、次の3つです。

・カメラの座標の位置ベクトル e
・カメラの注視点の位置ベクトル a
・カメラの上への方向ベクトル u

D3DXMatrixLookAtLH と D3DXMatrixLookAtRH の違いは、
最初のベクトルzを反転しているかしていないかとなっております。

ここで、最初に出てくる主要なベクトルをまとめてみましょう。

・ベクトル z
カメラ座標から注視点座標への単位方向ベクトル
から への方向ベクトルを求めるには、「 ― 」となります。
normalze(正規化)により距離を1にして単位方向ベクトルにしています。
これが、ワールド座標系にて、カメラ座標系で使用したいz軸方向になります。
ここでは、奥行きベクトル と呼ぶことにしましょう。

・ベクトル x
カメラの上向きのベクトル と、奥行きベクトル クロス積です。
クロス積は、ベクトルXとベクトルYに直行する単位方向ベクトルを計算することができます。
左手座標系で、uzのクロス積の結果は、右側への方向ベクトルになります。
なお、右手座標系で、uzのクロス積の結果は、左側への方向ベクトルになりますが、
zを計算した時点で、右手座標系では値を反転させているため、この結果も右側への方向ベクトルになります。
ここでは、右ベクトルxと呼ぶことにしましょう。
(座標系の違いの話は、DirectXとOpenGLの回転行列、回転軸、回転方向を参照)

・ベクトル y
奥行きベクトルzと、右ベクトルxのクロス積です。
左手座標系で、zxのクロス積の結果は、上側への方向ベクトルになります。
これもまた、右手座標系で、zxのクロス積の結果は、上側への方向ベクトルになりますが、
zを計算した時点で、右手座標系では値を反転させているため、この結果も上側への方向ベクトルになります。
ここでは、上ベクトルyと呼ぶことにしましょう。

最後の行列で、左上の3×3がベクトル x, y, zとなっております。
ここはカメラが向く回転情報となり、回転行列となります。
つまり、上のクロス積などの計算はこの回転行列を求めていたこととなります。

そして、行列の下のeがある部分が移動行列となります。
カメラの座標に、 x, y, zドット積をしているのですが、各方向成分を抜き出すことに相当します。
通常、カメラの位置まで移動させてから回転の場合は、カメラの座標まで引き算すればいいのですが、
今回は、回転させてからカメラの位置まで移動させるということをしているため、ドット積になっています。
.

OpenGL

OpenGLでは、次のヘルパー関数が用意されています。
matrix gluLookAt( vector &eye, vector &center, vector &up )
ビュー行列を作成する

OpenGLは、右手座標系です。
したがって、上記のサイトに書いてあるものは、DirectXのD3DXMatrixLookAtRHと同等のはずです。

ですが、式がすこしちがうように見えます。一度、書いてある式をまとめてみましょう。

ここで、OpenGLの行列は、
DirectXと比べると転置行列となっているため、
DirectXに合わせるようにしましょう。

ここで、ベクトル を反転させてみましょう。
反転させたあとに、xyの値は以前のままとしたいため、クロス積の計算順序を反転させます。

……ここで、D3DXMatrixLookAtRHと同じ式になりました。


おわりに

DirectXとOpenGLの違いシリーズの第2弾。
今回は、ビュートランスフォームの違いを見てみました。

サイトを一見すると、別の式に見えますが、
OpenGLのgluLookAtは、DirectXのD3DXMatrixLookAtRHと同じようですね。

こんどは、プロジェクショントランスフォーム、
ビューポート変換などにちがいがないか、調べていきたいです。

以上、ありがとうございました!

広告

コメントをどうぞ(承認された後に公開されます。メールアドレスの記入は自由ですが、記入した場合でも一般公開されることはありません)

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中