OpenGL glm旋转

Posted

技术标签:

【中文标题】OpenGL glm旋转【英文标题】:OpenGl glm rotate 【发布时间】:2020-07-12 16:07:06 【问题描述】:

我用

glm::mat4 transform(1.0f);
transform = glm::rotate(transform, (float)glfwGetTime(), glm::vec3(0.0f, 0.0f, 1.0f));

随着时间的推移绕轴旋转。但是为什么旋转发生均匀并且不随计时器增加(首先是 1 秒,然后是 43 秒,因此是 43 度?)毕竟,计时器没有重置,而是增长,但图像旋转好像以相同的“速度” "

【问题讨论】:

glm::rotate 的角度参数必须以弧度为单位。 @Rabbid76 如果你添加 glm :: radians() 那么同样的事情也会发生,只是速度变慢了,但不会随着时间的推移而增加。我不想说这是一个错误,我只是想知道为什么会这样 行为不可重现。您的应用程序中存在错误。可能你的帧速率太低了。 @Rabbid76 也许我没有解释清楚,但结果总是这样ravesli.com/wp-content/uploads/2020/04/39.gif 我只是想,为什么如果,例如,70 秒过去了,那么旋转也是如此,而不是 70 度 【参考方案1】:

但是为什么旋转是均匀发生的,而不是随着计时器增加

因为您每次都从“零”(身份)开始转换。

如果你想随着时间越来越快地旋转,你需要累积角度:

float angle = 0.0f;
while( shouldDraw() )

    ...
    angle += static_cast< float >( glfwGetTime() );
    glm::mat4 transform(1.0f);
    transform = glm::rotate(transform, angle, glm::vec3(0.0f, 0.0f, 1.0f));
    ...

总而言之,比较两种方法:

// g++ main.cpp `pkg-config --cflags --libs glfw3 gl`
#include <GLFW/glfw3.h>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>

void DrawTriangle()

    glBegin( GL_TRIANGLES );
    glColor3ub( 255, 0, 0 );
    glVertex2f(  0,  1 );
    glColor3ub( 0, 255, 0 );
    glVertex2f( -1, -1 );
    glColor3ub( 0, 0, 255 );
    glVertex2f(  1, -1 );
    glEnd();


int main( int, char** )

    glfwInit();
    GLFWwindow* window = glfwCreateWindow( 600, 600, "GLFW", NULL, NULL );
    glfwMakeContextCurrent( window );

    float angle2 = 0.0f;
    while( !glfwWindowShouldClose( window ) )
    
        glfwPollEvents();
        int w, h;
        glfwGetFramebufferSize( window, &w, &h );
        glViewport( 0, 0, w, h );

        glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

        glMatrixMode( GL_PROJECTION );
        glLoadIdentity();
        glOrtho( -5, 5, -5, 5, -1, 1 );
        
        glMatrixMode( GL_MODELVIEW );
        glLoadIdentity();
        
        const float time = static_cast< float >( glfwGetTime() );
        
        float angle1 = time;
        angle2 += time;

        glPushMatrix();
        
            glTranslatef( 2.5f, 2.5f, 0.0f );
            
            glm::mat4 transform(1.0f);
            transform = glm::rotate(transform, angle1, glm::vec3(0.0f, 0.0f, 1.0f));
            glMultMatrixf( glm::value_ptr( transform ) );
            DrawTriangle();
        
        glPopMatrix();

        glPushMatrix();
        
            glTranslatef( -2.5f, -2.5f, 0.0f );
            
            glm::mat4 transform(1.0f);
            transform = glm::rotate(transform, angle2, glm::vec3(0.0f, 0.0f, 1.0f));
            glMultMatrixf( glm::value_ptr( transform ) );
            DrawTriangle();
        
        glPopMatrix();
        

        glfwSwapBuffers( window );
    

    glfwTerminate();

【讨论】:

【参考方案2】:

欢迎来到堆栈溢出! :)

我假设您应用 transformation 矩阵就像应用模型矩阵一样。在这种情况下,您的旋转只会在渲染期间应用于对象一次。这会导致均匀或线性旋转,因为 时间 线性增加。

所以结果就是rotations_per_second * static_cast&lt;float&gt;(glfwGetTime())

如果您想将对象的旋转增加上述数量,则必须将两个旋转矩阵相乘。

或者您可以减少开销并定义一个角加速度angular_velocity_per_second 并将其乘以您的时间两次以获得旋转角度。

【讨论】:

以上是关于OpenGL glm旋转的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL - 使用 glm 围绕 2 个轴旋转

OpenGL glm 局部旋转

OpenGL glm旋转

opengl 使用 glm 单独旋转对象

OpenGL/GLSL/GLM - Skybox 像第三人称一样旋转

使用 GLM(旋转)为 OpenGL 创建变换矩阵