使用Qt的QTimer函数在OpenGl中制作动画

Using Qt's QTimer function to make animations in OpenGl

本文关键字:动画 OpenGl Qt QTimer 函数 使用      更新时间:2023-10-16

如何在OpenGl中使用QTimer来设置动画?

我想画一个简单的圆,每30毫秒改变一次半径,这样它看起来会平滑地增长和缩小。

这是我目前想到的:

头文件

#include <QGLWidget>
#include <QTimer>

class GLWidget : public QGLWidget
{
    Q_OBJECT
public:
    explicit GLWidget(QWidget *parent = 0);
protected:
    void initializeGL();
    void paintGL();
    void resizeGL(int width, int height);
    void timerEvent(QTimerEvent *event);
private:
    QBasicTimer timer;
private slots:
     void animate();
};

CPP文件
int circRad = 0;    
GLWidget::GLWidget(QWidget *parent) :
    QGLWidget(parent)
{
    QTimer *aTimer = new QTimer;
    connect(aTimer,SIGNAL(timeout(QPrivateSignal)),SLOT(animate()));
    aTimer->start(30);
}
void GLWidget::initializeGL()
{
    glClearColor(1,1,1,0);
}
void GLWidget::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(0,0,1);
    const float DEG2RAD = 3.14159/180;
       glBegin(GL_LINE_LOOP);
       for (int i=0; i <= 360; i++)
       {
          float degInRad = i*DEG2RAD;
          glVertex2f(cos(degInRad)*circRad,sin(degInRad)*circRad);
       }
       glEnd();
}
void GLWidget::resizeGL(int width, int height)
{
    glViewport(0,0,width, height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}
void GLWidget::animate()
{
    if(circRad < 6)
    {
    circRad = circRad + 1;
    }
    else
    {
        circRad = circRad - 1;
    }
    update();
}

这个(惊喜,惊喜)没有任何作用。我应该调用QTimerEvent吗?如果是这样,这是否意味着我删除动画槽并将其替换为QTimerEvent?我把代码从animate()到QTimerEvent?

通常你只会使用计时器来触发重绘,例如将帧率限制在60 FPS。在paint方法中,您将检查当前时间,并做您需要做的事情来制作动画。例如,存储圆开始生长时的时间t_start,然后用sin(t - t_start)偏移半径。

通过使用时间(而不是帧数),你可以得到独立于帧率的动画。请记住Qt的计时器是不精确的。如果将重复间隔设置为30毫秒,Qt就不能保证每30毫秒调用一次槽。有时可能是30毫秒,有时是40毫秒,甚至100毫秒,这取决于事件队列中还有什么,或者是什么阻塞了UI线程。如果出现这些小问题,你肯定不希望你的动画变慢。

哦,不要用int表示圆的半径。如果你想要流畅的动画,总是使用float或double

QPrivateSignal不应该是连接调用中信号签名的一部分:

connect(aTimer,SIGNAL(timeout()),SLOT(animate()));

QtCreator的完成并没有像它应该的那样忽略它(有一个关于这个的bug报告)。