首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenGl glm旋转

OpenGl glm旋转
EN

Stack Overflow用户
提问于 2020-07-12 16:07:06
回答 2查看 3K关注 0票数 0

我使用

代码语言:javascript
复制
glm::mat4 transform(1.0f);
transform = glm::rotate(transform, (float)glfwGetTime(), glm::vec3(0.0f, 0.0f, 1.0f));

随着时间的推移绕轴旋转。但是为什么旋转是均匀的,而不是随着计时器的增加(最初的1s,然后是43度,因此是43度)?毕竟,计时器没有重置,而是增长,但是图像旋转似乎是以相同的“速度”进行的。

EN

回答 2

Stack Overflow用户

发布于 2020-07-12 22:27:31

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

因为每次都要从“零”(标识)开始转换。

如果你想要旋转得更快,随着时间的推移,你需要累积角度:

代码语言:javascript
复制
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));
    ...
}

综合起来,比较这两种方法:

代码语言:javascript
复制
// 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
EN

Stack Overflow用户

发布于 2020-07-12 22:39:01

欢迎来到堆栈溢出!:)

我假设您应用您的transformation矩阵,就像一个应用模型矩阵一样。在这种情况下,在只呈现一次期间,您的旋转将应用于对象。由于时间呈线性增长,这导致了偶数或线性旋转。

结果就是rotations_per_second * static_cast<float>(glfwGetTime())

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

或者你可以减少开销,定义一个角加速度angular_velocity_per_second,然后乘以你的时间,,2次,得到旋转的角度。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62863408

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档