在阅读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 );
首先,我不知道在这样的矩阵中更改索引12
和13
甚至意味着什么。我试图通过阅读关于转换的维基百科页面来弄明白,但我想我没有足够的数学相关领域知识来理解它。
虽然我能找到的OpenGL资源似乎并没有真正以这种方式修改矩阵,而是使用像glScaleF
这样的函数。
如何将上述手动矩阵变换与缩放,剪切,平移和旋转相关联?
答案 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)