OpenGL三角形旋转

Posted

技术标签:

【中文标题】OpenGL三角形旋转【英文标题】:OpenGL Triangle rotation 【发布时间】:2014-04-18 23:48:27 【问题描述】:

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


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

【问题讨论】:

它没有显示任何内容,因为您在任何时候都没有刷新命令队列。这些天你真的不应该使用单缓冲渲染,它通常不适用于大多数使用合成窗口管理器或混合集成/离散 GPU 切换的系统。 en.wikibooks.org/wiki/OpenGL_Programming/… 【参考方案1】:

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

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

在您的第二个示例中,您进行了一次旋转,然后进行了一次旋转,然后又进行了一次旋转……最后,您显示了最终场景一次。不会呈现三角形通过旋转阶段的良好过渡。

【讨论】:

以上是关于OpenGL三角形旋转的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL 对象不转换为旋转轴

opengl绘图,画一个旋转的四边形和一个旋转的三角形,平滑着色和单一着色

使用 glut 的 OpenGL 三角形旋转 - 需要一个简单的修正

如何在openGL中旋转图像?

使用 OpenGL 4 的旋转矩阵

OpenGL - 旋转问题 - Qt