基于3DS文件读取的虚拟场景实现
2012-07-13马建仓
陈 晓,马建仓
(西北工业大学 电子信息学院,陕西 西安 710129)
随着计算机图形学的发展,计算机动画、科学计算可视化和虚拟现实逐渐成为计算机图形学领域中3大重要技术,其中三维现与广泛应用于建筑学、医学、模拟仿真、虚拟现实等诸多领域[1]对大多数人来说,计算机真实感图形已不再是一个陌生的名词,它正日益广泛的深入到人们日常的工作、学习和生活中,在影视特技、广告动画中,人们已经领略到计算机真实感图形的神奇魅力。真实感图形是一种计算机生成技术,它首先在计算机中构造出所需场景的几何模型,然后根据假定的光照条件,计算画面上可见的各个景物表面的光亮度,从而产生逼真的视觉效果。
文中主要针对Autodesk公司的3DMAX软件建立几何模型,从而对生成的3DS文件进行编程,实现3DS文件的读取、重绘及控制。传统的基于过程的设计方法,由于相关函数多而且散杂同时数据又与函数分离,导致不便于程序的移植,为了克服这些缺点,本文采用了面向对象的程序设计方法,将3DS文件的形体数据读入到类中,然后利用光线追踪技术[2]实现对三维模型的渲染,使得生成的场景更加逼真,具有真实感。
1 3DS文件和OpenGL的绘制流程简介
1.1 3DS文件简介
3DS文件是基于块(chunk)结构存储的。一个块开始是2个字节的ID,4个字节的块长度信息,然后是块的主要数据。将3DS文件以16进制方式打开如图1所示,数据按照低位在前,高位在后的方式存储。例如,2个16进制字节FFAF组成的整型数,表明AF是高字节,FF是低字节;对于长整型数,如。938E 0600,表明8E93是低位字,0006是高位字。
图1 3DS文件的16进制数据构成Fig.1 3 DS file hexadecimal data form
3DS文件中 有一个基本块,其ID是4D4D,每个3DS文件的开头都是这样的一个块。基本块中的子块是3D编辑块和关键帧块,前者的ID是3D3D,后者的ID是B000.图2说明了3DS的块结构以及各个块之间的嵌套关系。下面对主要的几个块进行简单介绍。
1)主编辑块(0X3D3D)
描述场景数据的主编辑块存储了当前编辑场景的状况和当前窗口的配置数据,这些数据是用于显示三维图形的重要几何信息,也是基于OPENGL装载3DS文件的重点烟酒部分。
2)材质块(0XAFFF)
材质块定义了使用与物体上的材质属性,包括材质的名称,颜色以及贴图等。如果读入的材质包含贴图,则贴图所对应的文件名、透明度信息、位置和缠绕方法也都存储在材质块的响应子块中。
图2 3DS文件块结构Fig.2 3 DS file chunk structure
3)物体块(0X4000)
物体块下有物体网格块 (0X4100)和物体材质块(0X4130)。物体网格块存储的是模型的顶点、顶点的纹理坐标、面信息以及边信息等。物体材质块中存储的是当前物体上所赋予的材质,该块与材质块的区别是,材质块存储的是3DS文件中材质库中的信息,而物体材质块中存储的是当前物体上的材质信息。
4)其他块
当遇到块信息未知或对模型显示不起作用的块时(如关键帧块),可不进行处理直接读入下一个块。
1.2 OpenGL的绘制流程
OpenGL全称为“开放式图形库”,是由SGI公司开发的三维图形API,目前在图形开发领域已经成为工业标准。OpenGL是一种强大的三维图形开发工具,是图形硬件的软件接口[3],OpenGL主要工作是将三维的物体投影到一个二维平面上,之后处理得到的像素,进行显示。首先将物体转化为可以描述物体几何性质的顶点与描述图像的像素,在执行其他操作后,最终将这些数据转化为像素数据。
1)针对每个顶点的操作和几何要素装配
每个顶点的空间坐标需要经过模型取景矩阵变换、法向矢量矩阵变换,若允许纹理自动生成,则由变换后的顶点坐标所生成的新纹理坐标替代原有的纹理坐标,再经过当前纹理矩阵变换。然后根据几何要素类型决定采取不同的几何要素装配方式。
2)像素操作
由主机读入的像素首先解压缩成适当的组分数目,然后进行数据放大、偏置,并经过像素映射处理,根据数据类型的限制在适当的取值范围内。像素最后写入纹理内存,使用纹理映射或光栅化生成像素段。
3)像素段操作
当使用纹理映射时,每个像素段将产生纹素,再进行雾效果计算、反走样处理,接着进行剪裁处理、一致性检验、模板检验、深度缓冲区检验和抖动处理。
2 3DS文件的读取与控制
3DS文件中采用的是块结构,并且块与块之间存在嵌套的关系,所以对3DS文件中三维模型数据的读取采用递归的方法。返回上一级的条件是当前已经读入的块字节数是否等于块的长度,从父块跳转到子块可用switch语句实现,通过子块的ID判断进入那个子块分支。当遇到没有必要读入的块时,可通过ID判断,若不需要此块信息,则可将文件指针向前移动(块长度—6)个字节[5]然后break跳过该块,处理下一块。当遇到需要读入的块时,例如材质块,通过判断当ID为0XAFFF(EDIT-MATERIAL)时,首先自加记录材质数目的变量,然后为当前材质块分配一块空白的结构,接着递归读出相关信息。当主块读完后,整个读入程序结束。读入程序的主要流程图如图3所示。
图3 3DS文件处理流程图Fig.3 3DS document processing flow chart
通过面向对象的编程,实现了3DS文件数据信息的读取,对象的绘制就是根据类中保存的信息进行绘制,场景控制主要是基于D3D InputSystem实现键盘和鼠标的控制操作。用OpenGL绘图命令绘制出来,主要代码如下。
3 光线追踪技术
光线追踪时一种真实地显示物体的方法。光线追踪算法是生成真实感图形的主要算法之一。它通过跟踪每一条从视点出发的光线,计算光线与景物交点的光强,可以精确地在三维实体上产生阴影、反射、折射及表面纹理等真实感很强的光学效果。标准的光线追踪算法需要计算每一条与景物空间相交的光线,并且要根据景物的性质进行光的反射、折射等计算,计算量非常庞大,因此很难满足真实感图形显示的实时性要求,为了提高显示的实时性,一般通过提高光线追踪算法的效率及并行处理技术来实现。
在本文中采用二叉空间剖分[6](BSP)加速技术,来提高光线追踪的效率。它由Schumacker于1969年首先提出,90年代初期由John Carmack和John Romero最早在第一人称视角游戏Doom中引入。自那以后,几乎所有的第一人称射击类游戏都采用BSP技术。BSP树能应用在深度排序、碰撞检测、绘制、节点裁剪和潜在可见集的计算,极大地加速了三维场景的漫游。它基于这样一个事实:空间中的任何平面都将整个空间分割成两个半空间,位于该平面某一侧的所有点构成了一个半空间,位于另一侧的点则定义了另一个半空间,该平面则是将两个半空间剖分开来的分割面。根据这种空间剖分的方法,可以建立起对整个几何场景和场景中各种物体几何的描述。BSP树的根节点就是整个场景,每个节点所代表的区域被平面分成两部分,一部分是平面前面(左侧)区域的子节点,另一部分是平面后面(右侧)区域的子节点。对子节点剖分,一直向下递归直到空间内部没有多边形或者剖分的深度达到指定的数值时才停止。BSP树具有内存开销小,剖分产生的无效区域少,树结构比较平衡及树的深度较浅等优点。
4 实验仿真
基于上述方法,本文设计实现了三维场景模型的读取、绘制和操作,在此基础上实现了基于BSP的光线追踪算法,并且在场景中实现了简单的粒子系统。仿真场景图如图4所示。此图(b)中的亮光区域即为手枪子弹的爆炸(粒子系统)演示。
图4 基于3DS文件实现的虚拟场景Fig.4 Based on the 3 DS file virtual scene
5 结 论
3DS是一种通用的保存三维模型的数据格式,因此研究该格式的读取和绘制很有重要的实际意义。本文基于面向对象的编程方法对3DS文件进行读取,利用OpenGL进行重绘,大大降低OpenGL建立复杂模型的难度,可以较容易的得到真实的三维复杂物体模型。在此基础上运用光线追踪技术,对三维模型场景进行实时渲染,使得生成的场景更加逼真,具有真实感。
[1]于莹莹.在VC中利用OpenGL实现动态效果图像的技巧[J].微型电脑应用,2002,18(6):50-52.
YU Ying-ying.In the VC using OpenGL realize dynamic image skills[J].Microcompute Applications,2002,18(6):50-52.
[2]彭群生,鲍虎军,金小刚.计算机真实感图形的算法基础[M].北京:科学出版社,1999.
[3]Wright R S,Lipchak B.OpenGL超级宝典[M].徐波,译.3版.北京:人民邮电出版社,2005.
[4]郭景,雷鸣.3DSMAX模型在OpenGL中的读取与重现[J].自动化与仪表,2002,17(5):46-49.
GUO Jing,LEI Ming.3DSMAX model in the OpenGL reading and reappear[J].Automation and Instrumentation,2002,17(5):46-49.
[5]殷素峰,高雪强,杨胜强.在OpenGL环境下开发3DS文件浏览器[J].工程图学学报,2005(6):22-25.
YAN Su-feng,GAO Xue-qiang,YANG Sheng-qiang.Development 3DS file browser based on OpenGL[J].Journal of Engineering Graphics,2005(6):22-25.
[6]Kaplan M.Space-tracing:a constant time ray-tracer[C]//SIGGRAPH’85 State of the Art Image Syn Sem Notes,1985:149-158.