繁体   English   中英

OpenGL变换矩阵顺序是向后的

[英]OpenGL transform matrix order is backwards

如果我想围绕z轴旋转对象,然后翻译它我必须这样做

glm::mat4 transform;
GLfloat angle = 90f;
transform = glm::rotate(transform, angle, glm::vec3(0.0f, 0.0f, 1.0f));
transform = glm::translate(transform, glm::vec3(0.5f, -0.5f, 0.0f));

但它向后工作,它先旋转然后翻译,所以我需要把它写成

glm::mat4 transform;
GLfloat angle = 90f;
transform = glm::translate(transform, glm::vec3(0.5f, -0.5f, 0.0f));
transform = glm::rotate(transform, angle, glm::vec3(0.0f, 0.0f, 1.0f));

这项工作背后的数学如何? 为什么我必须反过来组合矩阵以达到预期的效果?

从直观的角度来看,你是绝对正确的:转换必须采用与人们相反的方式来应用。 原因很简单:

在glm / OpenGL中,假设所有向量都是列向量,因此将矩阵形式的变换( M )应用于向量t可以写成如下:

t' = M * t

现在假设我们首先想要翻译( T )然后旋转( R )。 我们现在可以单独完成每个步骤

t' = T * t       //Translate
t'' = R * t'     //Rotate result Translation

当我们想要结合两个转换时,我们在第二行中替换t'并得到:

t'' = R * (T * t) = (R * T) * t

如您所见,首先应用的操作最后写入(或者更接近向量)。 同样的原理可以应用于人们想要的多个矩阵。

注意,如果向量被视为行向量,则整个矩阵顺序将改变。

 t' = t * M        //General case

让我们看看上面的相同示例,但这次使用行向量:

 t' = t * T
 t'' = t' * R

 t'' = (t * T) * R = t * (T * R)

结论:无论何时考虑转换和向量,请记住首先应用的操作必须更接近向量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM