业精于勤,荒于嬉
全部博文(763)
分类: 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文件的关键在于定义合理的数据结构和使用优秀的算法。首先,要把构成场景模型的所有点的坐标读入缓存区,由于文件中有多帧信息,所以缓存大小的定义有两种选择:一、大小为一个关键帧的点的数目,每