OpenGL的矩阵变换详解——有图有真相

来源:互联网 发布:文华期货趋势指标源码 编辑:程序博客网 时间:2024/06/06 02:24

OpenGL有个小小的难点,就是矩阵变换的顺序问题。一不小心就会用错,变换后的物体和自己想要的完全不一样。为了自己的理解,也为了帮助别人的理解,我下面对矩阵变换做一个解释。当然,大片大片的文字肯定会让大家看的云里雾里,所以我特意画了一些示意图供大家理解。
首先向大家明确一点,当你在程序中调用矩阵变换函数时,实际执行顺序调用顺序刚好相反,例如:

glm::mat4 trans;    trans = glm::translate(trans, glm::vec3(0.5f, -0.5f, 0.0f));    trans = glm::rotate(trans, glm::radians(90.0f), glm::vec3(0.0, 0.0, 1.0));

调用顺序是先平移,再旋转。但是代码执行的时候,是先旋转后平移。这是为什么呢?主要是由于矩阵乘法右乘的特性。
假如有一个顶点假设我们有一个顶点(x, y, z),我们希望将其缩放2倍,然后位移(1, 2, 3)个单位。那么进行的矩阵运算则如下图所示:
这里写图片描述
这里写图片描述
上面图中每个矩阵中间都有数字,用于标记这个矩阵,和描述矩阵。
1矩阵 * 2矩阵 = 3矩阵。3矩阵 * 4向量 = 最终变换结果
也就是:
1矩阵 * 2矩阵 * 4向量= 最终变换结果
根据矩阵和向量运算的性质,4向量先和2矩阵运算,再和1矩阵运算。所有,调用顺序刚好和执行顺序相反。
明白了执行顺序和调用顺序不同之后,咱们再来了解下。变化顺序不同会带来什么影响。
比如先向右平移2个单位,再顺时针旋转90度,和先顺时针旋转90度,再向右平移2个单位,有啥区别?
上图:

这里写图片描述

让其先平移两个单位,再顺时针旋转90度后的图片如下:

这里写图片描述

如果先顺时针旋转90度,再向右平移2个单位,则与上图效果完全不一样。如下:

这里写图片描述

造成这种现象的主要原因是:变换操作是相对于当前位置来进行的
其他的类似,请大家举一反三。

1 0