`
yezhiqiu-love
  • 浏览: 169265 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多

摘 要:本文从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的消息处理
{
case WM_CREATE:
{
hDC = GetDC(hWnd); //得到窗口的句柄。
SetDCPixelFormat(hDC);//设置像素格式。
………
SetTimer(hWnd,101,33,NULL);//该函数创建一个有指定超时值的计时器。}
break;
case WM_DESTROY:
{
KillTimer(hWnd,101);//删除计时器。
………}
break;
case WM_TIMER:
{………
InvalidateRect(hWnd,NULL,FALSE);}
break;
/* 处理计时器事件时,设置一个情况语句用来处理WM_TIMER消息,在该消息处理语句中,我们可以实现OpenGL中所要求的渲染,贴图等,也可以产生连 续更新的图像,这也是我们所要求的动画。当然,我们在该消息处理语句中,也可以不加入上述代码,只是简单的加入使应用程序 窗口无效的语句,而具体的渲染或动画产生代码则可以加入WM_PAINT消息处理程序中。*/
case WM_PAINT:
{ ………
RenderScene();//该函数产生动画。
SwapBuffers(hDC);// 缓冲区交换。
………
ValidateRect(hWnd,NULL);//使窗口生效。
}
break;
default: // Passes it on if unproccessed
return (DefWindowProc(hWnd, message, wParam, lParam));//确保每一个消息都得到处理。
}

return (0L);
}
………
void RenderScene()
{
//加入相应的动画实现代码
}
………

 具体实现结果如图2所示

/*在上述代码中,我们可以看见在WM_PAINT消息处理程序中有ValidateRect语句,该语句使窗口生效。如果我们省略该函数,那么Windows操作系统 认为窗口总处于刷新的状态,并且会时刻将WM_PAINT消息流发送给应用程序。这样我们可以看见动画的帧速率增加了很多。*/

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


图2. Windows编程环境下滚动的小方块

  5.小结

  综上所述,我们详细介绍了OpenGL动画的生成原理,以及如何在两种编程环境下实现动画的具体代码。在C语言编程机制下,我们主要使用GLUT库函数来实现动画,具体的相关函数的应用我们可以参考OpenGL库函数。

   在Windows编程机制下,读者应该具有Windows入门级编程的基本知识,而且你也应该对Windows API 函数库有相当的了解,这样你才会熟练掌握该方法。正如以前所说,在该机制下我们有多种实现动画的方法,比如:事件插入循环,使用渲染线程等等。这里我们就 不做一一介绍,具体的实现框架与上述方法类似。
双缓冲技术对于在任何一种机制下实现动画都是必要而且有效的。

分享到:
评论

相关推荐

    MFC构架下的OpenGL动画技术

    5. **优化性能**:为了提高OpenGL动画的流畅度,还需要考虑一些性能优化措施,如使用顶点数组、顶点缓冲对象(VBOs)来减少CPU与GPU之间的数据传输开销,以及利用OpenGL的混合功能来提高透明物体的渲染效率等。...

    基于OpenGL技术的三维游戏引擎设计

    本文探讨的是一个基于OpenGL技术的三维游戏引擎的设计与实现。 #### 二、计算机图形学基础 游戏引擎的成功构建离不开计算机图形学的支持。计算机图形学是研究如何在计算机中生成和处理图像的一门学科。其中,三维...

    基于OpenGL的三维动画的虚拟场景实现-动态实体的运动控制和特效毕业设计论文

    1. 基于 OpenGL的软件开发环境,实现了一个飞机飞行及其导弹飞行实时动 画,实时显示飞行器的运动轨迹和飞行场面,较好的反映了仿真的效果。 2. 设计了基于粒子系统的特殊效果,把粒子系统的行为模型和几何模型统 一...

    基于 c++ openGL 屏保设计

    总的来说,这个项目涵盖了C++的基础知识,如类的设计和对象的使用,以及OpenGL图形编程,包括几何形状的绘制、动画的实现和着色器的应用。它是学习3D图形编程和屏幕保护程序设计的一个很好的实践案例。通过深入研究...

    基于OpenGL的工业机器人运动仿真软件的设计与实现

    ### 基于OpenGL的工业机器人运动仿真软件的设计与实现 #### 一、引言 随着现代制造业的快速发展,工业机器人在生产线上的应用越来越广泛。为了更好地理解和优化机器人的运动性能,开发高效的仿真软件变得至关重要...

    类似iBooks的3D仿真翻页效果: 1.基于OpenGL 2.0 2.纯Java实现(JNI正在开发中) 3.基于.zip

    在这个项目中,开发者选择了基于OpenGL 2.0来实现这一功能。OpenGL是一个跨语言、跨平台的编程接口,专门用于渲染2D、3D矢量图形。OpenGL 2.0版本引入了更多高级特性,比如顶点着色器和片段着色器,可以更灵活地处理...

    基于OpenGL的三维人体运动模型实现

    ### 基于OpenGL的三维人体运动模型实现 #### 概述 随着计算机图形学的发展,虚拟现实技术已经成为一个热门的研究领域。其中,创建逼真的人体动画模型是一大难点。OpenGL作为一种广泛应用的三维图形编程接口,被...

    基于OpenGL的工业机器人三维仿真设计与实现.docx

    《基于OpenGL的工业机器人三维仿真设计与实现》 本文探讨了在工业机器人仿真领域中OpenGL的应用及其实现策略。OpenGL作为一种强大的图形渲染工具,能够有效地构建出具有较强真实感的三维仿真环境。文章重点介绍了...

    基于VC++的OpenGL编程讲座 刘涛

    7. **动画处理**:OpenGL支持双缓冲机制,可以实现平滑的动画效果。 8. **特殊效果**:除了上述功能之外,OpenGL还可以实现深度提示、运动模糊等特殊视觉效果,提升用户的沉浸感。 #### 四、学习OpenGL的意义 随着...

    基于OpenGL的玻璃包装容器CAD软件研究.pdf

    本文研究了基于OpenGL技术开发的玻璃包装容器CAD软件,旨在填补市场对专业玻璃包装容器设计软件的空白。文中详细阐述了软件的框架结构、主要类的层次关系和建模方法,并对软件的未来发展做出了展望。 关键词“玻璃...

    一种基于 OpenGL 的三维人体运动模型实现

    ### 一种基于OpenGL的三维人体运动模型实现 #### 摘要 随着计算机图形学的快速发展,虚拟现实技术成为了一个非常热门的研究领域。其中,虚拟人物的造型设计及人体骨骼动画技术是虚拟现实技术中的一大难点。OpenGL...

    基于OpenGL视景体的三维CAD模型交互显示研究.pdf

    它被广泛应用于计算机图形领域,用于实现CAD(计算机辅助设计)、动画、虚拟现实等复杂三维图形的生成和处理。 在三维CAD模型交互显示方面,OpenGL为开发者提供了一系列的工具和功能,包括但不限于模型变换、光照...

    基于OpenGL的3ds数据可视化

    在这个"基于OpenGL的3ds数据可视化"项目中,我们主要关注如何利用OpenGL读取并渲染3DS(Autodesk 3D Studio)文件格式的数据。3DS文件是3D建模软件3D Studio Max保存模型和场景的标准格式,包含几何信息、材质、纹理...

    基于OpenGL的三维飞行器程序的设计与仿真毕业论文.doc

    总结,本论文详细介绍了基于OpenGL的三维飞行器仿真程序的设计与实现过程,该程序能有效降低训练成本,提高操作员的技能水平。未来的研究方向可能包括增加更多的环境元素、优化交互界面以及引入更高级的物理模拟技术...

    基于3DS MAX和OpenGL的飞行仿真的实现

    ### 基于3DS MAX和OpenGL的飞行仿真的实现 #### 一、引言 随着计算机技术的发展,三维图形仿真技术已经广泛应用于各种领域,包括教育、娱乐、科研及军事等多个方面。对于航空领域来说,能够真实地模拟飞行状态不仅...

Global site tag (gtag.js) - Google Analytics