OpenGL三角旋转

时间:2014-04-18 23:48:28

标签: c++ qt opengl

我画了一个三角形,我想连续在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 ();

}

还有其他更好的方法来实现连续旋转吗?

1 个答案:

答案 0 :(得分:0)

大多数图形API(如OpenGL和DirectX)会将所有更改写入到称为后缓冲区的内容中:仅在渲染完整场景后才显示操作。如果每个旋转步骤或glEnd()立即被渲染,您每次都会看到场景不断建立。结果将是闪烁的,很难看。

完成场景绘制后,您可以告诉OpenGL,以便可以立即显示所有内容。您可以使用glFlush进行此操作。

在第二个示例中,您进行了一个旋转,然后又旋转了一个……在最后,您一次显示了最后一个场景。您的三角形在旋转阶段之间没有很好的过渡。