OpenGL总初学者和2D动画项目?

时间:2013-01-23 00:35:21

标签: c opengl animation 2d

我已经安装了GLUT和Visual Studio 2010,并找到了一些关于OpenGL基础知识(www.opengl-tutorial.org)和2D图形编程的教程。我拥有C语言方面的高级知识,但没有图形编程方面的经验......

对于项目(天文学 - 时间尺度),我必须在窗口中心创建一个对象,并使其他5个对象(圆,点......)围绕中心对象相对于某些方程旋转(我可以实现它们和解决)。方程用于计算该5个对象的坐标,并且所有方程具有参数t (作为时间)。为了创建动画,我将将参数t从0变为2pi并使用一些步骤并在不同时刻获取坐标。如果任务是打印对象的新坐标,那对我来说很容易,但问题是如何制作图形动画。我可以使用OpenGL的某些功能进行旋转/翻译吗? 如何使对象移动到具有由等式确定的坐标的所需位置?或者我可以每毫秒重新绘制新坐标中的对象?我首先想到的是绘制所有对象,计算新坐标,清除屏幕并在新坐标中绘制所有对象并无限重复...(它会是原始的但是会起作用吗?)

以下是该对象的屏幕截图 - http://i.snag.gy/ht7tG.jpg。我的问题是如何通过计算每个步骤的对象的新坐标并将它们移动到新位置来制作动画。我可以用OpenGL的基础知识和C和几何的丰富知识吗?从什么开始的任何想法?谢谢

3 个答案:

答案 0 :(得分:0)

  

我首先想到的是绘制所有对象,计算新坐标,清除屏幕并在新坐标中绘制所有对象并无限重复...(它会是原始的但是会起作用吗?)

这正是它的工作原理。使用GLUT,您可以设置一个显示功能,当GLUT认为是时候绘制新帧时会调用该功能。在此功能中,清除屏幕,绘制对象并将其刷新到屏幕。然后只是指示GLUT绘制另一帧,你就是动画!

可能想要跟踪帧之间的时间,这样你就可以顺利地制作动画,但我相信你可以把它弄清楚。

OpenGL实际上只是一个绘图库。它不会做动画,这取决于你实现。但是,清除/绘制/刷新是它常用的方法。

注意:'flush'是指glFlush(),尽管多缓冲模式下的GLUT需要glutSwapBuffers()

答案 1 :(得分:0)

红皮书解释了绘制可以首先翻译,旋转,缩放等模型的正确方法:http://www.glprogramming.com/red/chapter03.html

基本上,你加载身份,执行变换/旋转/缩放(你想要的首先是重要的 - 本书再解释它),绘制模型,好像它是在正常规模的原点,它将被放置处于新的位置。然后你可以加载身份并继续下一个。动画的每一帧,你glClear()并重新计算/重绘一切。 (这听起来很昂贵,但通常不会在抽奖之间缓存。)

答案 2 :(得分:0)

  

或者我可以每毫秒重新绘制新坐标中的对象?第一   我认为是绘制所有对象,计算新坐标,   清除屏幕并以新坐标绘制所有对象并重复该操作   无限..

这确实是要走的路。我会进一步建议您不要像使用OpenGL 3/4方式那样使用着色器和顶点缓冲区。什么是最简单的称为“立即模式”,由OpenGL 3/4弃用,但在1/2/3中可用。这很简单:

glPushMatrix(); //save modelview matrix
  glTranslatef(obj->x, obj->y, obj->z); //move origin to object center
  glBegin(GL_TRIANGLES); //start drawing triangles
    glColor3f(1.0f, 0.0f, 0.0f); //a nice red one
    glVertex3f(0.0, +0.6f, 0.0f);
    glVertex3f(-0.4f, 0.0f, 0.0f);
    glVertex3f(+0.4f, 0.0f, 0.0f); //almost equilateral
  glEnd();
glPopMatrix(); //restore modelview matrix/origin

请查看辅助库glu(对于设置摄像机/投影矩阵非常有用)和glut(应该可以非常轻松地设置窗口和基本控件和绘图)。 / p>

设置它(显示一个旋转三角形)可能需要更长的时间,而不是弄清楚如何使用它。事实上,这是some code to help you get started。您的第一个挑战可能是设置沿Z轴投影的2D正交投影矩阵,以便您可以使用2D函数(glVertex2)。