Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5544754
  • 博文数量: 763
  • 博客积分: 12108
  • 博客等级: 上将
  • 技术积分: 15717
  • 用 户 组: 普通用户
  • 注册时间: 2007-09-28 21:21
个人简介

业精于勤,荒于嬉

文章分类

全部博文(763)

文章存档

2018年(6)

2017年(15)

2016年(2)

2015年(31)

2014年(14)

2013年(87)

2012年(75)

2011年(94)

2010年(190)

2009年(38)

2008年(183)

2007年(28)

分类: C/C++

2012-06-14 11:11:16

摘要 本文介绍了运用OpenGL,通过读取MD2文件开发复杂三维动画的方法,从而实现OpenGL与其它软件相结合创建复杂场景的能力,为快速开发复杂三维动画程序提供了捷径,并给出了一个实例。

  关键词 开放图形库; 文件格式;三维建模

   1 前言

  OpenGL被严格定义为“一 
种到图形硬件的软件接口”。从本质上说,它是一个完全可移植并且速度很快的3D图形和建模库。它提高了二维和三维建模、变换处理、光照处理、动画和实时交互等能力,是绘制真实感图像、建立三维交互场景的高性能的3D图形开发API。使用OpenGL,可以创建视觉质量接近射线跟踪程序的精致漂亮的3D图形。使用OpenGL的最大好处是它比射线跟踪程序要快好几个数量级,它使用由Silicon Graphics(SGI)公司精心开发和优化的算法。

  尽管OpenGL具有这么多的好处,但作为开发者来说,如何用它显示复杂的三维动画是个不可避免的问题。我们知道,对简单的三维图形,可以自己构造,然后在编程时引用构造数据画图来实现,但对复杂物体如人体,要构造数据的话,就不是件容易的事。为此要与其它软件结合起来。

  MD2文件是QuakeП专用的文件格式,QuakeП中复杂的三维场景就是通过  
 
 
对它的读取产生的。从其它软件产生的文件中获得复杂的三维模型信息并显示出来,是三维建模常用的方法,这可以大大省却开发者的时间。在MD2文件中,还包含有多帧的三维物体信息,只要把它们都读取出来,就能显示连续的动画了。此外,文件中还有物体的纹理坐标,只要从别的图像文件中导入纹理数据,在显示时对物体贴上相应纹理,就能显示更具真实感的3D图形了。最后,由于MD2采用的压缩算法,使其文件体积并不臃肿。 

  2 MD2格式说明

   MD2文件建模的原理是用三角形来描述复杂的物体,即所有的物体都是三角形组成的。因此要从文件中读取各三角形的点的位置、纹理坐标来显示图形。

   MD2文件组成分为五部分:文件头、纹理坐标集合、三维对象组成点集合、组成三角形的点的索引集合、三角形的纹理坐标的索引集合。

  文件信息头部分包括17种数据,其具体定义如表1所示。

  表1 文件信息头的定义

  数据类型意义备注

  整型MD2文件的标志位固定为 "IDP2",用以标示为文件类型为MD2文件

  整型文件版本号

  整型纹理宽度

  整型纹理高度

  整型每一帧的字节数;

  整型纹理数

  整型每一帧点的个数,注意是每一帧的

  整型纹理坐标数

  整型三角形个数

  整型无用

  整型总帧数

  整型纹理到文件头的偏移

  整型纹理坐标到文件头的偏移

  整型三角形索引到文件头的偏移

  整型第一帧开始处到文件头的偏移;

  整型OpenGL命令类型

  整型到文件尾的字节数  

  利用以上这些信息,就可以编制相应算法,定位到需要的地方。

  编程原理是:三角形的每个点在点坐标的集合中有个索引值,通过索引可以得到每个三角形的组成点的位置。同理,三角形的纹理坐标在纹理坐标集合中也有索引,通过索引可以获得纹理坐标值。绘制三角形时,要先通过索引指向点集合中和纹理坐标集合中的相应位置,再取出数据绘制。所以要准备几个缓存:存放三角形组成点在点集合中索引的缓存、存放三角形纹理在纹理集合中索引的缓存、存放点集合的缓存、存放纹理坐标集合的缓存。有了以上几个缓存,就可以显示场景并对其进行渲染。其示意图如图1所示。

  图1 渲染示意图

  如要显示动画的话,就要求每隔一定时间就对画面进行刷新,所以在程序中先开个定时器,每隔一定时间刷新页面,刷新时做的工作就是读入下一帧的数据,进行显示,从而实现连续的动画效果。 

  3 读取MD2文件方法的实现

   读取MD2文件的关键在于定义合理的数据结构和使用优秀的算法。首先,要把构成场景模型的所有点的坐标读入缓存区,由于文件中有多帧信息,所以缓存大小的定义有两种选择:一、大小为一个关键帧的点的数目,每

阅读(2815) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~