发布旋转矩阵(openGL/glm)
issues rotating a matrix (openGL/glm)
我最近一直在创建一个基本的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;
相关文章:
- 了解 GLM- openGL 中的相机转换
- OpenGl glm rotate
- OpenGL 和 GLM 矩阵无法正确扩展,总是按比例缩小
- 发布旋转矩阵(openGL/glm)
- OpenGL 转换无法使用 GLM 矩阵
- OpenGL GLM 矩阵/向量未正确初始化
- 在OpenGL(GLM/C++)中使用四元数旋转时出现问题
- GlM(OpenGl Mathematics)库阻止M_PI和其他定义的常量工作
- OpenGL/GLFW/GLM-键盘输入无反应
- 通过glUniform 将 GLM 的向量类型传递给 OpenGL
- 如何为数据类型 vector<glm::vec3> (opengl 数据类型) 编写 std::minmax 函数的自定义比较器
- 绘制一个向量<glm::vec3> opengl c++
- 如何从GLM到JOML(OpenGL数学库)
- OpenGL/GLM-切换坐标系方向
- OpenGL/GLM-计算截头体问题
- OpenGL - GLM和GLSL,它们有何不同
- OpenGL - glm的翻译和比例组成
- OpenGL, GLM四元数旋转
- Opengl GLM看着奇怪的行为
- OpenGL GLM 矩阵计算不起作用