1

UCMerced の TriPath Toolkit からいくつかのコードを読んでいるときに、これらに出くわしました

float xmin, xmax, ymin, ymax; 
float mat[16] = { 1, 0, 0, 0,
    0, 1, 0, 0,
    0, 0, 1, 0,
    0, 0, 0, 1 };
TheLct->get_bounds ( xmin, xmax, ymin, ymax );
glMatrixMode ( GL_MODELVIEW );
glLoadIdentity ();

float width = xmax-xmin;
float height = ymax-ymin;
mat[0]=mat[5]=mat[10]= 1.8f * (1 / (width > height ? width : height));
glMultMatrixf ( mat );
mat[0]=mat[5]=mat[10]= 1;

mat[12]=-(xmin+w/2);
mat[13]=-(ymin+h/2);
glMultMatrixf ( mat );

最初の変換では1、行列の最初の 3 つの対角線が係数で乗算されます。恒等行列に関する私の限られた知識から、これは係数でスケーリングしているように見えます。

ただし、2 番目の変換については、よくわかりません。

mat[12]=-(xmin+w/2);
mat[13]=-(ymin+h/2);
glMultMatrixf ( mat );

まず第一に、インデックス1213そのようなマトリックスを変更することさえ何を意味するのかわかりません。変換に関するウィキペディアのページを読んで理解しようとしていますが、それを理解するのに十分な数学関連のドメイン知識がないと思います。

私が見つけることができる OpenGL リソースは、実際にはこの方法で行列を変更するようには見えませんが、glScaleF.

上記のような手動の行列変換をスケーリング、せん断、平行移動、回転に関連付けるにはどうすればよいですか?

4

2 に答える 2

3

最初の行列は、ご想像のとおり、均一なスケールの行列です。2 番目の行列は、(x 軸と y 軸に沿った) 単なる平行移動です。(の固定関数マトリックス スタック) GL は列優先メモリ レイアウトを使用することに注意してください。翻訳部分は常に , m[12],m[13]にあります (古い GL FAQ の回答 9.005m[14]も参照してください)。組み合わされた変換は透視投影ではなく ( null ベクトルではない必要があります)、直交変換です。(m[3], m[7], m[11])

これらすべての数値がどのように幾何学的に解釈されるかを簡単に説明するには、この記事が役立つかもしれません。

于 2013-08-19T19:43:41.150 に答える