如何从手动矩阵运算推断平移,剪切等?

时间:2013-08-19 18:06:40

标签: c++ opengl matrix transformation

在阅读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这样的函数。

如何将上述手动矩阵变换与缩放,剪切,平移和旋转相关联?

2 个答案:

答案 0 :(得分:3)

正确猜测,第一个矩阵是一个统一的比例矩阵。第二个矩阵只是一个平移(沿x和y轴)。注意GL的(固定功能矩阵堆栈) 使用列主要内存布局,其中转换部分始终位于m[12]m[13]m[14](另请参阅answer 9.005 in the old GL FAQ)。组合变换不是透视投影(需要(m[3], m[7], m[11])不是空矢量),而是正交投影。

为了便于解释所有这些数字是如何进行几何解释的,您可能会发现this article很有用。

答案 1 :(得分:1)

最后一个是透视投影。见http://en.wikipedia.org/wiki/Transformation_matrix