发布旋转矩阵(openGL/glm)

issues rotating a matrix (openGL/glm)

本文关键字:openGL glm 旋转 布旋转      更新时间:2023-10-16

我最近一直在创建一个基本的gui,我正试图让用户能够旋转shape/image/ssprite。然而,当我使用glm::rotate试图更改模型矩阵时,我得到了一些意想不到的结果。变换后的形状会改变尺寸,旋转得太远,还会围绕一个看似随机的点旋转。

着色器代码:

#version 330 core
layout(location = 0) in vec2 pos;
uniform mat4 model;
uniform mat4 projection;
uniform mat4 view;
void main()
{
gl_Position = projection * view * model * vec4(pos.x, pos.y, 1.0f, 1.0f);
}

旋转代码:

m_modelMatrix = glm::mat4(1.0f);
m_modelMatrix = glm::rotate(m_modelMatrix, 45.f, glm::vec3(0, 0, 1);

视图和投影设置

glm::mat4 proj = glm::mat4(1.0f);
glm::mat4 view = glm::mat4(1.0f);
proj = glm::perspective(glm::radians(53.f), 1.f, 0.1f, 100.f);
view = glm::translate(view, glm::vec3(0.0f, 0.0f, -3.0f));  

一切都在2d中。

欢迎使用堆栈溢出!:(

我假设你已经有了一个投影和视图矩阵的设置,就像你在评论中指出的那样。它应该是这样的,

#version 330 core
layout(location = 0) in vec2 pos;
uniform mat4 projection;
uniform mat4 view;
uniform mat4 model;
void main()
{
gl_Position = projection * view * model * vec4(pos.x, pos.y, 1.0f, 1.0f);
}

投影矩阵应该是用创建的

glm::ortho( ... );

glm::perspective( ... );

视图矩阵应该是用创建的

glm::lookAt( ... );

如中所述https://glm.g-truc.net/0.9.2/api/a00245.html.如果需要进一步解释,我建议您查看https://learnopengl.com/Getting-started/Coordinate-Systems作为参考。

我还假设问题源于以前的转换,以及如何使用这种旋转来修改现有的模型矩阵。例如,只有当您指定了除单位矩阵之外的模型矩阵时,才会出现问题。

当你创建模型矩阵时,你必须确保你使用了正确的乘法顺序:

glm::mat4 translation = ... ;
glm::mat4 rotation = ... ;
glm::mat4 scale = ... ;
glm::mat4 model = translation * rotation * scale;

由于你将把右手边的向量乘以模型矩阵,这个顺序可以保证不会发生失真。矢量将首先缩放,然后旋转,最后平移。

当您尝试使用旋转模型矩阵时

glm::rotate(model, angle, axis);

你基本上从右手边乘以旋转矩阵,打破了模型矩阵的乘法顺序。

model * rotation_from_user_input
= translation * rotation * scale * rotation_from_user_input

你必须像这个一样改变模型矩阵的旋转

rotation *= rotation_from_user_input;

然后更新模型矩阵本身以修复失真。

model = translation * rotation * scale;