在 Opengl 中使用 glm 旋转
Posted
技术标签:
【中文标题】在 Opengl 中使用 glm 旋转【英文标题】:glm rotate usage in Opengl 【发布时间】:2012-01-13 01:00:47 【问题描述】:我正在渲染一个圆锥体,我想将它逆时针旋转 90 度,使尖端朝西!我正在使用 OpenGL 3+。
到目前为止,这是我在 Cone.cpp 中的代码:
//PROJECTION
glm::mat4 Projection = glm::perspective(45.0f, 1.0f, 0.1f, 100.0f);
//VIEW
glm::mat4 View = glm::mat4(1.);
View = glm::translate(View, glm::vec3(2.0f,4.0f, -25.0f));
//MODEL
glm::mat4 Model = glm::mat4(1.0);
//Scale by factor 0.5
Model = glm::scale(glm::mat4(1.0f),glm::vec3(0.5f));
glm::mat4 MVP = Projection * View * Model;
glUniformMatrix4fv(glGetUniformLocation(shaderprogram_spaceship, "MVP_matrix"), 1, GL_FALSE, glm::value_ptr(MVP));
glClearColor(0.0, 0.0, 0.0, 1.0);
glDrawArrays(GL_LINE_STRIP, start_cone, end_cone );
并未显示所有代码。
有人可以指导我完成轮换吗?我必须乘以视图矩阵吗?带有“glm 旋转”功能?
【问题讨论】:
有什么问题?你需要告诉我们问题是什么。不仅要我们告诉您解决方案,而且要我们找出问题也是不公平的。 【参考方案1】:您需要将模型矩阵相乘。因为那是模型位置、缩放和旋转应该在的地方(这就是为什么它被称为模型矩阵)。
您需要做的就是(见here)
Model = glm::rotate(Model, angle_in_radians, glm::vec3(x, y, z)); // where x, y, z is axis of rotation (e.g. 0 1 0)
注意要将度数转换为弧度,使用
glm::radians(degrees)
这需要模型矩阵并在所有已经存在的操作之上应用旋转。其他功能 translate 和 scale 做同样的事情。这样就可以在一个矩阵中组合许多转换。
注意: 早期版本接受以度为单位的角度。自 0.9.6
起已弃用Model = glm::rotate(Model, angle_in_degrees, glm::vec3(x, y, z)); // where x, y, z is axis of rotation (e.g. 0 1 0)
【讨论】:
您还需要将度数指定为一半、浮动或双倍。glm::radians(90.0f)
【参考方案2】:
GLM 有很好的旋转示例:http://glm.g-truc.net/code.html
glm::mat4 Projection = glm::perspective(45.0f, 4.0f / 3.0f, 0.1f, 100.f);
glm::mat4 ViewTranslate = glm::translate(
glm::mat4(1.0f),
glm::vec3(0.0f, 0.0f, -Translate)
);
glm::mat4 ViewRotateX = glm::rotate(
ViewTranslate,
Rotate.y,
glm::vec3(-1.0f, 0.0f, 0.0f)
);
glm::mat4 View = glm::rotate(
ViewRotateX,
Rotate.x,
glm::vec3(0.0f, 1.0f, 0.0f)
);
glm::mat4 Model = glm::scale(
glm::mat4(1.0f),
glm::vec3(0.5f)
);
glm::mat4 MVP = Projection * View * Model;
glUniformMatrix4fv(LocationMVP, 1, GL_FALSE, glm::value_ptr(MVP));
【讨论】:
GLM 代码示例链接:https://glm.g-truc.net/0.9.1/api/a00006.html【参考方案3】:我注意到,如果您没有正确指定角度,也可能会出现错误,即使使用glm::rotate(Model, angle_in_degrees, glm::vec3(x, y, z))
,您仍然可能会遇到问题。我为此找到的解决方法是将类型指定为 glm::rotate(Model, (glm::mediump_float)90, glm::vec3(x, y, z))
而不是仅仅说 glm::rotate(Model, 90, glm::vec3(x, y, z))
或者只写第二个参数,以弧度为单位的角度(以前以度为单位),作为不需要强制转换的浮点数,例如:
glm::mat4 rotationMatrix = glm::rotate(glm::mat4(1.0f), 3.14f, glm::vec3(1.0));
如果您想继续使用度数,可以添加 glm::radians()。并添加包含:
#include "glm/glm.hpp"
#include "glm/gtc/matrix_transform.hpp"
【讨论】:
根据documentation,它采用的角度以度为单位。所以通过3.14f
会旋转少量(3 度而不是 180 度)。此外,该函数是一个模板,因此将整数作为角度传递会使参数类型不明确(这会产生编译时错误)。指定 180.0f
可能就是您的意思。
顺便说一句:“GLM 0.9.5 不推荐使用度数,因此在 GLM 0.9.6 中将删除这些度数。从 GLM 0.9.5.1 开始,每个使用度实例都会提示警告。这是设计的帮助转换用户代码。定义 GLM_FORCE_RADIANS 将使这些消息静音。来自g-truc.net/post-0623.html以上是关于在 Opengl 中使用 glm 旋转的主要内容,如果未能解决你的问题,请参考以下文章