基于OpenGL动画设计研究与实现

时间:2010-05-07 12:20:47  来源:第二电脑网  作者:第二电脑网

  第二电脑网导读:,它的前身是由SGI公司为其图形工作站开发的IRIS GL,是一个工业标准的三维计算机图形软件接口。  OpenGL不是一种编程语言,而是一种API(Application Programming Interface,应用程序编程接口)。作为一种API,OpenGL库遵循C调用约定,这意味着我们在C语言环境下可以很方便的调用 OpenGL库中的API函数。  Microsoft开始把 OpenGL集成到Windows NT中,后来又把它集成到...
  正文:

  摘 要:本文从Windows及C语言编程基础出发,重点介绍了如何使用OpenGL来实现动画的原理与方法,并通过相关实例进行了验证。

  关 键 词:OpenGL,API, 双缓冲技术,渲染,计时器

  1.引 言

  OpenGL是一种相对新的工业标准,它的前身是由SGI公司为其图形工作站开发的IRIS GL,是一个工业标准的三维计算机图形软件接口。

  OpenGL不是一种编程语言,而是一种API(Application Programming Interface,应用程序编程接口)。作为一种API,OpenGL库遵循C调用约定,这意味着我们在C语言环境下可以很方便的调用 OpenGL库中的API函数。

  Microsoft开始把 OpenGL集成到Windows NT中,后来又把它集成到新版本的Windows 95 OEM Service Release 2中,用户既可以在 Windows 95、Windows NT环境下开发OpenGL应用程序,又可以很方便的把已有的工作站上的程序移植过来。

  2.双缓冲技术

  这项技术能使你执行绘图代码时能够在一个屏幕之外的缓冲区内进行渲染,然后用交换命令把图形放到屏幕上。双缓冲技术有两种用途,第一个是有些复杂的图形可能要花很长的时间绘制,而你又不希望图像绘制的所有步骤都被看见,使用双缓冲技术就可以合成一幅图像并在完成后才显示出来。用户永远不会看到不完整的图像,只有整幅图像准备就绪之后才会把它在瞬间置于屏幕之上。双缓冲技术的第二个用处是制作动画。每一帧都在画面外的缓冲区绘制,完成之后再交换到屏幕上。

  OpenGL支持双缓冲,但是并不是真正用来交换前台缓冲区和后台缓冲区的。

  实际上,每个OpenGL支持的窗口系统都可以通过一个函数调用来实现前后缓冲区之间的交换。

  ★ 在Windows编程环境下调用下面函数:

SwapBuffers(dc);

  ★ 在C语言编程环境下调用下面函数:

glutSwapBuffers();

  3.在C语言编程环境下如何实现动画
 
  在C语言编程机制下实现OpenGL动画,主要是通过调用OpenGL API函数库来实现,以下便是具体的实现代码框架。

………
………//#include调用,及变量声明,相关函数声明和函数定义。
// 主函数入口
void main(void)
{
 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
 //指定一个双缓冲窗口,这使得所有绘图代码都在画面外缓冲区进行渲染。
 glutCreateWindow("NAME");
 glutDisplayFunc(RenderScene);//调用RenderScene函数绘制当前窗口
 …………
 glutTimerFunc(33, TimerFunction, 1);//登记一个回调函数,经过设定的时间值后由GLUT调用该函数。
 …………
 glutMainLoop();//这个函数开始主GLUT事件处理循环。
}
//主函数中所调用的函数定义
………
void RenderScene(void)
{
 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 //清除颜和深度缓冲区。
 glColor3ub(255,0,0);//设置当前颜色为红色。
 glPushMatrix();//将当前矩阵压入堆栈
 glRotatef(dIst, 1.0f, 1.0f, 3.0f);
 //所画物体绕经过(0,0,0),(1,1,3)的矢量逆时针旋转dIst的角度。
 glTranslatef(10.0f,0.0f, 0.0f);//将所化物体沿X轴平移10个单位。
 glutSolidSphere(8.0f, 15, 15);//画一个实心圆。
 glPopMatrix();//弹出先前所压矩阵
 dIst += 10.0f;
 if(dIst > 360.0f)
  dIst = 0.0f;
  glutSwapBuffers();//在双缓冲模式下进行一次缓冲区交换。
}

………
void TimerFunction (int value)
{
 glutPostRedisplay();//刷新当前窗口
 glutTimerFunc(33, TimerFunc, 1);
}

  上述相关代码主要完成了在屏幕上绘制一个绕经过(0,0,0),(1,1,3)的矢量逆时针旋转的小球。每隔33毫秒刷新一次。

  具体运行结果如图1所示:


图1. C语言环境下滚动的小球

  4.在Windows编程环境下如何实现动画

  在Windows编程模型中,实现动画的方法有很多种,这里我们只介绍一种很常用的方法。

  ★ 计时器实现动画的方法

  在Windows编程模型中,用计时器方法来实现动画是很方便的。在编程环境下创建一个计时器,该计时器通知Windows想让WM_TIMER消息隔多长时间给你的窗口发送信息。Windows通过响应这个消息,就能够以一定的时间间隔完成你所要完成的任务。

LRESULT CALLBACK WndProc( HWND hWnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{ ………
………//声明变量
switch (message)// Windows的消息处理
{
"基于OpenGL动画设计研究与实现"由第二电脑网原创提供,转载请注明:http://www.002pc.com/master/College/Language/VC/2010-05-07/13907.html


关键字:

关于《基于OpenGL动画设计研究与实现》文章的评论

站内搜索: 高级搜索

热门搜索: Windows style 系统 tr IP QQ CPU 安装 function 注册 if td