glm在Opengl中旋转使用

Tes*_*est 13 c++ opengl glm-math

我正在渲染一个圆锥体,我想将它旋转,逆时针旋转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 );
Run Code Online (Sandbox Code Playgroud)

并非所有代码都显示出来.

有人可以指导我完成轮换吗?我必须将View矩阵相乘吗?用"glm旋转"功能?

the*_*ine 37

您需要乘以模型矩阵.因为那是模型位置,缩放和旋转的位置(这就是它被称为模型矩阵的原因).

你需要做的就是(见这里)

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)
Run Code Online (Sandbox Code Playgroud)

请注意,要将度数转换为弧度,请使用 glm::radians(degrees)

这需要Model矩阵并在已经存在的所有操作之上应用旋转.翻译和缩放的其他功能也是如此.这样就可以在单个矩阵中组合许多变换.

注意:早期版本接受以度为单位的角度.这是从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)
Run Code Online (Sandbox Code Playgroud)

  • 您还需要将度数指定为half、float 或double。`glm::radians(90.0f)` (3认同)

Ano*_*ous 9

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));
Run Code Online (Sandbox Code Playgroud)


小智 6

我注意到,如果你没有正确指定角度,你也会得到错误,即使使用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));
Run Code Online (Sandbox Code Playgroud)

如果要继续使用度数,可以添加glm :: radians().并添加包括:

#include "glm/glm.hpp"
#include "glm/gtc/matrix_transform.hpp"
Run Code Online (Sandbox Code Playgroud)

  • 将90改为90.0f可能已经做到了. (2认同)
  • 根据[文档](http://glm.g-truc.net/0.9.4/api/a00206.html#ga3eed13fc5bcaff2f2204b12013bb83bf),它所用的角度以度为单位。因此,通过`3.14f` 会旋转少量(3 度而不是 180 度)。此外,该函数是一个模板,因此将整数作为角度传递会使参数类型不明确(这会产生编译时错误)。指定 `180.0f` 可能就是你的意思。 (2认同)