我画了一个三角形,我想连续在X轴上旋转它。下面的代码将它旋转几次。
//Paints the GL scene
void GLobj::paintGL(void)
{
static int angle;
for (angle = 1; angle<=360; angle += 1)
{
glClear (GL_COLOR_BUFFER_BIT);
glClear(GL_DEPTH_BUFFER_BIT);
glRotatef(angle, 1, 0 , 0);
glBegin(GL_TRIANGLES);
glColor3f (1.0, 0.0,1.0);
glVertex2f(-0.45,0.0);
glVertex2f(-0.65,0.5);
glVertex2f(-0.25,0.5);
glEnd();
usleep(1000);
glFlush ();
}
如果我更改上面的代码如下,输出正忙于执行而不显示任何内容。
//Paints the GL scene
void GLobj::paintGL(void)
{
static int angle;
for (angle = 1; angle<=360; angle += 1)
{
glClear (GL_COLOR_BUFFER_BIT);
glClear(GL_DEPTH_BUFFER_BIT);
glRotatef(angle, 1, 0 , 0);
glBegin(GL_TRIANGLES);
glColor3f (1.0, 0.0,1.0);
glVertex2f(-0.45,0.0);
glVertex2f(-0.65,0.5);
glVertex2f(-0.25,0.5);
glEnd();
usleep(1000);
if (angle == 360)
{angle = 1;}
}
glFlush ();
}
还有其他更好的方法来实现连续旋转吗?
答案 0 :(得分:0)
大多数图形API(如OpenGL和DirectX)会将所有更改写入到称为后缓冲区的内容中:仅在渲染完整场景后才显示操作。如果每个旋转步骤或glEnd()
立即被渲染,您每次都会看到场景不断建立。结果将是闪烁的,很难看。
完成场景绘制后,您可以告诉OpenGL,以便可以立即显示所有内容。您可以使用glFlush
进行此操作。
在第二个示例中,您进行了一个旋转,然后又旋转了一个……在最后,您一次显示了最后一个场景。您的三角形在旋转阶段之间没有很好的过渡。