You are here: Home / TinBlog / OpenGLのMATRIX

OpenGLのMATRIX

Posted by h2 at Oct 27, 2010 03:20 AM |
Filed under: ,
cheetah3Dをいじくり回す傍ら、少ない時間でOpenGLに勤しむ今日この頃。久しぶりにプログラムで悩みまくった。

OpenGLでperspecvive処理が上手く行かずに悩んでいたのだ。

3DでOpenGLをいじくり回すこと自体、ものすんごく久しぶり。ついでに言うと、もともと3D周りはDirectXが中心で、あまりOpenGLはいじっていなかったので、それほど素養があるわけでもないのだ。

 

それでも、3Dそのものはいじっているし、行列式は、遙か昔、量子化演算でウン万行列なんてものをいじっていたこともある手前、それなりにわかっているつもりでいた。

 

が。いざ表示させようとしたら、画面が真っ黒け。視線処理をすっ飛ばせば、〜-1.0fまでのポリは表示されるから、Drawやらshaderやらの問題ではなさそう。というわけで、perspecviveが怪しいと見たわけだが。

 

これの解決に、えらいこと時間がかかった。なにせ、単純なorthoに変更しても、表示がメタメタ。ネットをうろついても、これといった原因にたどり着けない。仕方ないので、行列計算式の組み立てからチマチマやり直してみたものの、やっぱりダメ。特定のパターンでは表示されたのだが、結局原因がわからず終い。

・・・なんてことで、さんざん悩んだ挙げ句。こういうときは、初心に返って一から、ということで、思いっきり初期のリファレンスからさらい直していたところ、トンでもない誤解を発見。

 

OpenGLの行列配列が、そもそも転置しているという事実が。・・・って、なんじゃそりゃ。

普通行列は、こんな風に書く。

行列式

これをプログラムで扱う場合、大抵は構造体が用意されているが、無い場合(昔やっていたウン万行列など)は、配列で代用する。

float mat[4][4];

など。サイズによっては、スタックオーバーフローを起こしたりするので、mallocやnewを使うが、基本的にはこれ。この場合、はじめの'4'が行を、次の'4'が列をあらわす。普通は。

ところが、OpenGLでは、単純な一次配列をmatrixとしている。

float mat[16];

で。ここからが本題。この配列を、思いっきり勘違いしていたのだ。てっきり配列の行列は、

float mat[] = { a00, a01, a02, ..., a32, a33 };

だとばかり思い込んで使っていた。・・・っていうか、普通はこういう風に使うでしょ。だが、OpenGLでは、正しくは

float mat[] = { a00, a10, a20, ...., a23, a33 };

となっているのだった。

 

そりゃあ、計算結果がメタメタになるわな。

おかげで、積算や回転の計算式も全て組み直すハメに。

とほほほほ、無駄な時間を使いまくってしまった。まったくも〜。

 

 

Filed under: ,
« August 2019 »
August
SuMoTuWeThFrSa
123
45678910
11121314151617
18192021222324
25262728293031