【发布时间】:2015-08-21 00:03:14
【问题描述】:
我在网上阅读了十几篇关于 OpenGL 中正确的旋转、平移和缩放矩阵乘法顺序的文章。然而,现在我开始自己实现它,我到了我真的很困惑的地步。
假设在我的代码中我正在计算转换矩阵,并将它作为一个结果矩阵传递给着色器:
shader.SetUniform("u_Matrix", scale * rotation * translation);
在顶点着色器中,我将顶点乘以这个矩阵:
gl_Position = u_Matrix * vec4(a_Position, 0.0, 1.0);
现在,按照这个顺序(缩放 * 旋转 * 平移)我得到了我想要的: 我旋转对象,然后将其移动到特定点,然后缩放它。 有人可以解释一下为什么这是正确的顺序吗?
我一直认为所有的转换都是“从矢量端”应用的。
例如,如果我们“扩展”乘法:
gl_Position = scale * rotation * translation * vec4(a_Position, 0.0, 1.0);
那么首先应该应用平移,然后是旋转和缩放。如果不是因为平移和旋转的顺序,一切对我来说似乎都很好。如果我们不想绕某个点旋转,我们应该先旋转然后平移,这里不是这样。
为什么这种转换会按预期进行?
【问题讨论】:
-
当你说你已经阅读了几十篇文章时,有没有一篇文章涉及行矩阵和列矩阵以及前后乘法?您寻求的解释与这两件事有关,并且正确尝试解释为什么 OpenGL 的行为方式(列主要后乘法)应该包括它们。