gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:24:18 25 4
gpt4 key购买 nike

在 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 吗?如果是这样,是否意味着我删除了动画 SLOT 并将其替换为 QTimerEvent?我是否将 animate() 中的代码放入 QTimerEvent 中?

最佳答案

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

通过使用时间(而不是帧数),您可以获得独立于帧速率的动画。请记住,Qt 的计时器并不精确。如果您将重复间隔设置为 30 毫秒,Qt 不保证该插槽每 30 毫秒被调用一次。有时可能是 30 毫秒,有时是 40 毫秒甚至 100 毫秒,具体取决于事件队列中的其他内容,或者阻塞 UI 线程的内容。如果出现这些问题,您肯定不希望动画放慢速度。

哦,不要将 int 用作圆半径。如果您想要流畅的动画,请始终使用 float 或 double。

关于c++ - 使用Qt的QTimer函数在OpenGl中制作动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16499563/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com