使用Qt的QTimer函数在OpenGl中制作动画
Using Qt's QTimer function to make animations in OpenGl
如何在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报告)。
相关文章:
- 如何减慢从 BVH 文件读取的 opengl 动画?
- 在动画OpenGL场景中绘制
- OPENGL慢速动画在2 Icosaedres上
- 无法在openGL和GLUT中为我想要的确切对象设置动画
- 如何为我的GIF图块表(OpenGL,DevIL,C++)制作动画
- 如何在OpenGL中进行逐步显示动画
- OPENGL c++ 动画粒子
- 在不重绘整个背景图的情况下为模型设置动画--OPENGL
- OpenGl 显示动画并绘制文本
- 使用OpenGL的2D精灵动画技术
- 这是使用Visual Studio在Opengl 1中创建纹理动画的最佳方法
- OpenGL - "ultra smooth"简单水平移动物体的动画
- 如何在OpenGL中处理包含多个对象的动画
- 使用Qt的QTimer函数在OpenGl中制作动画
- C++/SDL/OpenGL中的平滑动画问题
- OpenGL 2D代理动画和场景刷新
- 如何在 OpenGL 中高效地制作 2D 精灵动画
- OpenGL - 动画是由着色器完成的
- 在opengl中创建立方体模型的动画
- 程序特定的OpenGL运行时错误:多个输入缓冲区蒙皮动画