0

我已经安装了 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 和几何的良好知识来做到这一点吗?从什么开始的任何想法?谢谢

4

3 回答 3

0

我想到的第一件事是绘制所有对象,计算新坐标,清除屏幕并在新坐标中绘制所有对象并无限重复......(这将是原始的,但会工作吗?)

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

可能想要跟踪帧之间的时间,以便您可以流畅地制作动画,但我相信您可以弄清楚这部分。

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

注意:我的意思是“flush” glFlush(),尽管多缓冲区模式下的 GLUT 需要glutSwapBuffers()

于 2013-01-23T00:47:40.400 回答
0

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

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

于 2013-01-23T00:49:10.660 回答
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(应该很容易设置窗口和基本控件和绘图)。

设置它(显示一个旋转的三角形)可能比弄清楚如何使用它需要更长的时间。事实上,这里有一些代码可以帮助您入门。您的第一个挑战可能是设置沿 Z 轴投影的 2D 正交投影矩阵,因此您可以使用 2D 函数 ( glVertex2)。

于 2013-01-23T01:45:14.050 回答