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

How to infer translate, shear, etc from manual matrix operations?

本文关键字:运算      更新时间:2023-10-16

在阅读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之类的函数。

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

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

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

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