我从各种在线资源中学习OpenGL 3+,最近对转换(模型)矩阵感到困惑。据我所知,正确的乘法顺序是translationMatrix * rotationMatrix * scaleMatrix
。如果我理解正确的乘法是向后的,那么首先应用比例,然后是旋转,最后是变换。
我有一个Transform
类,它将位置,比例和原点存储为2d向量,将旋转存储为浮点数。计算变换矩阵的方法如下:
glm::mat4 Transform::getTransformationMatrix() const
{
glm::mat4 result = glm::mat4(1.0f);
result = glm::translate(result, glm::vec3(position, 0.0f));
result = glm::translate(result, glm::vec3(origin, 0.0f));
result = glm::rotate(result, rotation, glm::vec3(0, 0, 1));
result = glm::translate(result, glm::vec3(-origin, 0.0f));
result = glm::scale(result, glm::vec3(scale, 0.0f));
return result;
}
这里是顶点着色器代码:
#version 330 core
layout(location = 0) in vec2 position;
uniform mat4 modelMatrix;
uniform mat4 projectionMatrix;
void main()
{
gl_Position = projectionMatrix * modelMatrix * vec4(position, 0.0, 1.0);
}
正如你所看到的,我首先翻译然后旋转和缩放,这与我学到的相反。 起初我有正确的方式(缩放,旋转和平移),但它绕着初始位置旋转,半径很大,而不是翻译的位置,这不是我想要的(我正在用精灵制作2D游戏)< / strong>即可。我不明白为什么它会这样工作,有人可以解释,我是否必须为变换矩阵计算保留单独的方法?它在3d空间中的工作方式是否相同?