C++ OpenGl glm旋转

C++ OpenGl glm旋转,c++,opengl,glfw,glm-math,C++,Opengl,Glfw,Glm Math,我用 以获得随时间围绕轴的旋转。但为什么旋转均匀地发生,而不是随着计时器的增加而增加(先是1秒,然后是43度,因此是43度?)毕竟,计时器没有重置,而是增加,但图像旋转好像以相同的“速度”进行 但是为什么旋转是均匀的,而不是随着计时器的增加而增加呢 因为每次都是从“零”(身份)开始转换 如果要随时间旋转得更快,则需要累积角度: glm::mat4 transform(1.0f); transform = glm::rotate(transform, (float)glfwGetTime(), g

我用

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

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

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

如果要随时间旋转得更快,则需要累积角度:

glm::mat4 transform(1.0f);
transform = glm::rotate(transform, (float)glfwGetTime(), glm::vec3(0.0f, 0.0f, 1.0f));
浮动角度=0.0f;
while(shouldDraw())
{
...
角度+=静态_转换(glfwGetTime());
glm::mat4变换(1.0f);
transform=glm::rotate(变换、角度、glm::vec3(0.0f、0.0f、1.0f));
...
}
总之,比较两种方法:

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`
#包括
#包括
#包括
void DrawTriangle()
{
glBegin(GL_三角形);
glColor3ub(255,0,0);
glVertex2f(0,1);
glColor3ub(0,255,0);
glVertex2f(-1,-1);
glColor3ub(0,0255);
glVertex2f(1,-1);
格伦德();
}
int main(int,char**)
{
glfwInit();
GLFWwindow*window=glfwCreateWindow(600600,“GLFW”,NULL,NULL);
glfwMakeContextCurrent(窗口);
浮动角度2=0.0f;
而(!glfwWindowShouldClose(窗口))
{
glfwPollEvents();
int w,h;
glfwGetFramebufferSize(窗口、&w、&h);
glViewport(0,0,w,h);
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
glMatrixMode(GL_投影);
glLoadIdentity();
格洛托(-5,5,-5,5,-1,1);
glMatrixMode(GLU模型视图);
glLoadIdentity();
常量float time=static_cast(glfwGetTime());
浮动角度1=时间;
角度2+=时间;
glPushMatrix();
{
glTranslatef(2.5f,2.5f,0.0f);
glm::mat4变换(1.0f);
transform=glm::rotate(transform,angle1,glm::vec3(0.0f,0.0f,1.0f));
glMultMatrixf(glm::value_ptr(transform));
DrawTriangle();
}
glPopMatrix();
glPushMatrix();
{
GLTRANSTEF(-2.5f,-2.5f,0.0f);
glm::mat4变换(1.0f);
变换=glm::旋转(变换,角度2,glm::向量3(0.0f,0.0f,1.0f));
glMultMatrixf(glm::value_ptr(transform));
DrawTriangle();
}
glPopMatrix();
glfwSwapBuffers(窗口);
}
glfwTerminate();
}

欢迎来到堆栈溢出!:)

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

因此结果就是
每秒旋转次数*静态(glfwGetTime())

如果你想增加物体的旋转量,你必须将两个旋转矩阵相乘


或者你可以减少开销,定义一个角加速度
角速度\u/秒
,然后将它乘以你的时间两次,得到旋转角度。

的角度参数必须以弧度设置。@rabbi76如果你加上glm::radians(),那么同样的事情也会发生,速度会变慢,但它并不随时间而增加。我不想说这是一个错误,我只是想知道为什么会发生这种行为是不可复制的。您的应用程序中有一个bug。也许你的帧速率太低了。@Rabbid76也许我解释得不好,但结果总是这样,我只是想,为什么举例来说,如果70秒过去了,那么旋转也过去了,而不是70度
// 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();
}