65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Visual C++ 6.0 和 OpenGL (GLUT) 编写的星球大战滚动字幕演示

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.56/5 (9投票s)

2010 年 5 月 28 日

CPOL

3分钟阅读

viewsIcon

44210

downloadIcon

1212

一个从底部平滑滚动到顶部的《星球大战》滚动字幕演示,使用OpenGL(GLUT)。

星球大战滚动字幕结束制作人员名单演示
作者:TopCoder23 和 Marcus the Snowman Bergquist

我一直是《星球大战》电影系列的忠实粉丝,也一直着迷于电影结尾从底部向上滚动的制作人员名单,一直想在应用程序中复制同样的效果。
在电影和电视中,片尾字幕或结束字幕会在最后添加,以列出参与制作的演员和工作人员。
它们通常以一列小字体的名字出现,从底部平滑地滚动到顶部。

这个简单的应用程序演示了如何使用 Visual C++ 6.0 的 Win32 控制台中的 OpenGL (GLUT) API,创建一个从底部平滑滚动到顶部的简单星球大战滚动字幕。
由于我们使用的是 OpenGL (GLUT) API,因此必须在我们的 .cpp 文件中包含头文件 glut.h
如果您尚未在系统上安装 GLUT,请访问 http://www.xmission.com/~nate/glut.html 下载最新的 GLUT 二进制文件。

如何安装 Glut

  • 解压归档文件 glut-3.7.6-bin.zip 的内容。
  • glut.lib 复制到 \Microsoft Visual Studio\VCxx\Lib 目录
  • glut.h 复制到 \Microsoft Visual Studio\VCxx\Include\GL 目录
  • glut32.dll 复制到 \WINDOWS\system32 目录

开始吧

我们将使用 ifstream 从文本文件中加载一组著名的达斯·维达语录到一个名为 char quote[200][80]char 缓冲区变量中,然后使用 OpenGL API 中内置的字体通过函数 glutStrokeCharacter() 在屏幕上渲染这些语录。
我们使用我们创建的函数 loadFile() 将著名的达斯·维达语录从文本文件加载到 char 缓冲区中。

GLUT 回调函数

在 GLUT 中,事情是通过“您”创建函数,然后由 GLUT 调用这些函数来实现的。
例如,用于显示对象的函数语法如下:

glutDisplayFunc( myDisplayFunction );

我们将创建三个函数并将它们放入 GLUT 回调函数中,以便 GLUT 处理它们。我们将使用的 GLUT 回调函数是:

  • glutDisplayFunc();
  • glutReshapeFunc();
  • glutIdleFunc();

glutDisplayFunc 是星球大战滚动字幕窗口的显示回调函数。类似地,glutReshapeFunc 是星球大战滚动字幕窗口的重塑回调函数。当窗口被重塑时,重塑回调函数将被触发。glutIdleFunc 将全局空闲回调设置为 func,这样 GLUT 程序可以在未接收到窗口系统事件时执行后台处理任务或连续动画。

如果启用,在未接收到事件时,空闲回调会不断被调用。glutMainLoop 进入 GLUT 事件处理循环。这个例程最多应该在 GLUT 程序中调用一次。一旦调用,这个例程将永远不会返回。它将根据需要调用任何已注册的回调。因此,这个回调函数应该放在最后。

我们的三个函数是:

  • RenderToDisplay()
  • myDisplayFunction()
  • timeTick()

RenderToDisplay() 函数

RenderToDisplay() 回调函数以选定的字体渲染我们星球大战滚动字幕中语录的每个字符。

void RenderToDisplay()
{
	int l,lenghOfQuote, i;

	glTranslatef(0.0, -100, UpwardsScrollVelocity);
	glRotatef(-20, 1.0, 0.0, 0.0);
	glScalef(0.1, 0.1, 0.1);

	for(  l=0; l < numberOfQuotes;l++)
	{
		lenghOfQuote = (int)strlen(quote[l]);
		glPushMatrix();
		glTranslatef(-(lenghOfQuote*37), -(l*200), 0.0);
		for (i = 0; i < lenghOfQuote; i++)
		{
			glColor3f((UpwardsScrollVelocity/10)+300+(l*10),
				(UpwardsScrollVelocity/10)+300+(l*10),0.0);
			glutStrokeCharacter(GLUT_STROKE_ROMAN, quote[l][i]);
		}
		glPopMatrix();
	}
}

myDisplayFunction()

myDisplayFunction(void) 回调函数在需要时被调用,以创建一个由视点、指示场景中心的参考点和 UP 向量派生的观察矩阵,以便我们的星球大战滚动字幕看起来像电影中的那样。

void myDisplayFunction(void)
{
  glClear(GL_COLOR_BUFFER_BIT);
  glLoadIdentity();
  gluLookAt(0.0, 30.0, 100.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
  RenderToDisplay();
  glutSwapBuffers();
}  

reshape() 函数

当窗口被重塑时,会调用 reshape() 回调函数。

void reshape(int w, int h)
{
  glViewport(0, 0, w, h);
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  gluPerspective(60, 1.0, 1.0, 3200);
  glMatrixMode(GL_MODELVIEW);
}    

timeTick(void) 函数

调用 timeTick(void) 函数来处理连续动画,在我们的例子中是让星球大战滚动字幕中的语录从底部缓慢滚动到顶部。

void timeTick(void)
{
   if (UpwardsScrollVelocity< -400) view-=0.000001;
   if(view < 0) 
   {
      view=20; 
      UpwardsScrollVelocity = -10.0;
    }
    UpwardsScrollVelocity -= 0.015;
    glutPostRedisplay();
}  

主函数

最后,main 函数是所有内容汇集的地方。我们将一组著名的达斯·维达语录从文本文件加载到 char 缓冲区中,初始化 GLUT 显示模式,初始化窗口大小,然后创建窗口并为其命名,接着我们将函数回调到我们创建的函数,并让 GLUT 循环播放我们的星球大战滚动字幕。

int main()
{
    loadFile("captions.txt");
	  glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
	  glutInitWindowSize(800, 400);
	  glutCreateWindow("StarWars scroller");
	  glClearColor(0.0, 0.0, 0.0, 1.0);
	  glLineWidth(3);

	  glutDisplayFunc(myDisplayFunction);
	  glutReshapeFunc(reshape);
	  glutIdleFunc(timeTick);
	  glutMainLoop();
	return 0;
}

这就是在 Win32 控制台中使用 GLUT 创建星球大战滚动字幕的简便方法。

感谢阅读。

© . All rights reserved.