关于C#:OpenGL总初学者和2D动画项目?

OpenGL total beginner and 2D animation project?

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

对于项目(天文学-时间尺度),我必须在窗口的中心创建一个对象,并使其他5个对象(圆、点…)围绕中心对象围绕一些方程旋转(我可以实现它们并求解)。方程用于计算这5个对象的坐标,所有方程都有参数t(作为时间)。为了创建动画,我将通过一些步骤改变参数t从0到2pi,并在不同的时刻获得坐标。如果任务是打印新的对象坐标,对我来说很容易,但问题是如何制作图形动画。我可以使用OpenGL的一些函数进行旋转/转换吗?如何使一个物体以方程确定的坐标移动到所需的位置?或者我可以每毫秒重新绘制一个新的坐标?我想的第一件事就是画出所有的物体,计算出新的坐标,清除屏幕,在新的坐标中画出所有的物体,然后无限地重复这个过程。(这将是原始的,但会起作用吗?)

以下是这些对象的屏幕截图-http://i.snag.gy/ht7tg.jpg。我的问题是如何通过计算每个步骤中对象的新坐标并将其移动到新位置来制作动画。我能用OpenGL中的基础知识和良好的C和几何知识做到这一点吗?从什么开始有什么想法?谢谢


Or i can redraw object in new coordinates every millisecond? First
thing i thought was to draw all objects, calculate new coordinates,
clear screen and draw all objects in new coordinates and repeat that
infinitely..

这的确是一条路。我进一步建议您不要像OpenGL 3/4方式那样费心使用明暗器和顶点缓冲区。最简单的是所谓的"即时模式",OpenGL3/4不推荐使用,但在1/2/3中可用。这很容易:

1
2
3
4
5
6
7
8
9
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(应使设置窗口和基本控件和绘图非常容易)。

设置它(显示一个旋转三角形)可能要比找出如何使用它花费更长的时间。实际上,这里有一些代码可以帮助您开始。您的第一个挑战可能是设置沿Z轴投影的二维正交投影矩阵,以便使用二维函数(glVertex2)。


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

基本上,你加载身份信息,执行转换/旋转/缩放(你首先需要的是哪一个——这本书也解释了),绘制模型,就好像它是在正常比例的原点上一样,它将被放置在新的位置上。然后您可以加载标识并继续下一个标识。动画的每一帧,都需要glclear()并重新计算/重绘所有内容。(听起来很贵,但在抽签之间通常没有多少缓存空间)。


First thing i thought was to draw all objects, calculate new coordinates, clear screen and draw all objects in new coordinates and repeat that infinitely..(it would be primitive but will work?)

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

可能想跟踪帧之间的时间,这样你就可以平滑地对事物进行动画处理,但我相信你能理解这一部分。

OpenGL实际上只是一个绘图库。它不做动画,这由你来实现。但是,清除/绘制/冲洗是常用的方法。

注:对于"flush",我的意思是glFlush(),尽管在多缓冲模式下的过剩需要glutSwapBuffers()