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中,矩阵中的前三个对角线乘以一个因子。根据我对单位矩阵的有限知识,这似乎是按比例缩放的。

然而,第二个转换,我不太明白:

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

首先,我什至不知道更改索引1213在这样的矩阵中意味着什么。我试图通过阅读关于转换的维基百科页面来弄清楚它,但我想我没有足够的数学相关领域知识来理解它。

而我能找到的 OpenGL 资源似乎并没有真正以这种方式修改矩阵,而是使用glScaleF.

如何将上述手动矩阵变换与缩放、剪切、平移和旋转联系起来?

4

2 回答 2

3

正如您正确猜测的那样,第一个矩阵是一个统一比例矩阵。第二个矩阵只是一个平移(沿 x 和 y 轴)。请注意,GL 的(固定函数矩阵堆栈)使用列主内存布局,其中翻译部分始终位于m[12],m[13]m[14](另请参阅旧 GL 常见问题解答中的回答 9.005)。组合变换不是透视投影(这将要求它(m[3], m[7], m[11])不是零向量),而是正交投影。

为了简单地解释所有这些数字如何被几何解释,您可能会发现这篇文章很有用。

于 2013-08-19T19:43:41.150 回答
1

最后是透视投影。请参阅http://en.wikipedia.org/wiki/Transformation_matrix

于 2013-08-19T18:14:01.480 回答