2012-01-13 282 views
8

我渲染一个圆锥体,并且我想旋转它,逆时针旋转90度,以使尖端朝向西方!我正在使用OpenGL 3+。glm在Opengl中的旋转用法

这是我在我的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旋转”功能?

+11

问题是什么?你需要告诉我们问题是什么。这不公平,不仅希望我们告诉你*解决方案*,而且还希望我们找出问题*。 – 2012-01-13 01:16:39

回答

30

您需要乘以模型矩阵。因为那是模型位置,缩放和旋转应该在哪里(这就是为什么它被称为模型矩阵)。

所有你需要做的是:

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) 

这需要模型矩阵,以及所有那些已经在那里经营的顶部适用旋转。其他功能翻译和规模也是这样做的。这样就可以将许多变换结合到一个矩阵中。

8

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)); 
+0

GLM代码示例链接:[https://glm.g-truc.net/0.9.1/api/a00006.html](https://glm.g-truc.net/0.9.1/api/a00006。 HTML) – befzz 2017-10-27 12:41:04

5

我注意到,你还可以得到错误,如果你没有正确指定角度,使用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" 
+0

使90 90f可能已经做到了。 – RobC 2017-03-02 22:53:31

+0

根据[文档](http://glm.g-truc.net/0.9.4/api/a00206.html#ga3eed13fc5bcaff2f2204b12013bb83bf),它需要的角度是度。所以通过'3.14f'旋转少量(3度而不是180度)。此外,该函数是一个模板,因此传递整数的角度使参数类型不明确(这会产生编译时错误)。指定'180.0f'可能就是你的意思。 – 2017-07-18 08:20:58