はじめに

こんこん!

今回は、前回に引き続き座標変換の話をします。
特に、ビュートランスフォームの部分の計算式を見てみましょう。
気になっていたのは、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と同じようですね。

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

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

関連記事

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