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

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个单位,则与上图效果完全不一样。如下:

这里写图片描述

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

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值