C++ glm-rotate在Opengl中的应用

C++ glm-rotate在Opengl中的应用,c++,opengl,glm-math,C++,Opengl,Glm Math,我正在渲染一个圆锥体,我想将其逆时针旋转90度,使尖头端朝西!我正在使用OpenGL3+ 以下是我目前在my 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

我正在渲染一个圆锥体,我想将其逆时针旋转90度,使尖头端朝西!我正在使用OpenGL3+

以下是我目前在my 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旋转”功能?

您需要将模型矩阵相乘。因为这就是模型位置、缩放和旋转的位置(这就是为什么它被称为模型矩阵)

您所需要做的就是(参见)

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

这将获取模型矩阵,并在已经存在的所有操作之上应用旋转。其他函数平移和缩放也执行相同的操作。这样就可以在一个矩阵中组合许多变换

注意:早期版本接受以度为单位的角度。这是不推荐的,因为


GLM有一个很好的旋转示例:


我注意到,如果没有正确指定角度,也可能会出现错误,即使使用
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"

有什么问题?你需要告诉我们问题出在哪里。不仅要我们告诉你解决方案,还要我们解决问题,这是不公平的。根据角度,角度是以度为单位的。因此,通过
3.14f
时会旋转少量(3度而不是180度)。此外,该函数是一个模板,因此当角度传递整数时会使参数类型不明确(这会产生编译时错误)。指定
180.0f
可能就是您的意思。GLM代码示例链接:您还需要将度数指定为半、浮点或双精度<代码>glm::弧度(90.0f)
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::mat4 rotationMatrix = glm::rotate(glm::mat4(1.0f), 3.14f, glm::vec3(1.0));
#include "glm/glm.hpp"
#include "glm/gtc/matrix_transform.hpp"