三维模型文件中的OBJ格式在OpenGL中的输入与处理

时间:2022-09-25 02:46:04

三维模型文件中的OBJ格式在OpenGL中的输入与处理

摘要:介绍了当今流行的三维作图工具Maya,阐述了Maya生成的OBJ三维格式,如何将OBJ格式文件在OpenGL(Open Graphic Library)中进行输入和处理。重点介绍了OBJ文件的文件格式及怎样利用程序代码来构建模型数据结构、绘制对象模型,然后运用OpenGL的强大功能实现三维显示和交互操作。

关键词:三维模型文件;OpenGL;OBJ文件;交互

中图分类号:TP391文献标识码:A文章编号:1009-3044(2011)10-2393-04

Obj Three-dimensional Model File Format in OpenGL, Input and Processing

WANG Jin-feng, YAO Guo-qing

(China University of Geosciences, Beijing 100083, China)

Abstract: Introduced the three-dimensional mapping tools of today's popular Maya, expounds the Maya 3d format OBJ generated, The file formats of 3D files OBJ is introduced and the way show to transfer 3D model files to OpenGL are discussed. The paper lays a strong emphasis on the file formats of OBJ file and how to use code to form the modeling data structure and how to paint the object models. Then the powerful function of OpenGL can be used to 3D display and interactive operation.

Key words: 3D model file; OpenGL; OBJ file; interact

1 概述

OpenGL即开放性图形库(Open Graphic Library),是一个三维的计算机图形和模型库。它的前身是SGI公司为其图形工作站开发的IRIS GL,为使其能适用于多种硬件,SGI开发了OpenGL,并于1992年7月了OpenGL1.0版本。

OpenGL适用于多种硬件平台及操作系统,用户用这个图形库不仅能方便的制作出有极高质量的静止三维彩色图像,还能创建出高质量的动画效果。由于OpenGL在三维真实感图形制作中具有优秀的性能,许多大公司(如Microsoft、IBM、DEC、SUN等)都将其作为自己的图形标准,从而使OpenGL成为了新一代的三维图形工业标准。它独立于窗口系统和操作系统,以它为基础开发的应用程序可以十分方便地在各种平台间移植;OpenGL可以与Visual C++紧密接口,可保证算法的正确性和可靠性;OpenGL使用简便,效率高。

OpenGL具有许多实用、高效的功能,如:建模、变换、颜色模式设置、光照与材质设置、纹理映射、位图显示以及双缓存动画等。而且借助Windows编程环境可以方便地对所构模型的人机交互进行控制。

2 Maya软件简介

Maya是位于加拿大的Aliaso/Wavafront公司开发的三维动画软件,已在全世界广泛用于影视、视频、游戏、商业产品、宽带、本地化娱乐、高端广播、多种图形运用、M TV、虚拟仿真等领域。Maya集成了Aliaso/Wavefront最先进的动画及数字效果技术。它不仅包括一般三维和视觉效果制作的功能,而且还与最先进的建模、数字化布料模拟、毛发渲染、运动匹配技术相结合。Maya可在Windows NT与SGIIR IX操作系统上运行。在目前市场上用来进行数字和三维制作的工具中,Maya是首选解决方案。Maya模型数据的输出方法中提供了多边形逼近法, 即用许多小多边形拼出模型的外观,文件中保存这些多边形的信息。由于OpenGL中提供了最基本的有多边形构造三维模型的方法,因此可以方便地从三维图形数据文件中读取模型数据并在OpenGL中绘制[1]。

3 OBJ文件格式简介

OBJ文件是Alias/Wavefront公司开发的三维动画软件Maya的一种数据输出类型,它定义了对象的几何和其它的一些特性。由于它的文件结构非常简单,所以适合在应用程序中读取或进行3D文件格式转换。

这里的OBJ[2]文件不是我们常见的程序编译生产的目标文件,而是一种定义物体几何模型的3D文件,最初是Wavefront的标准 3D模型文件,后来被广泛应用到各种应用软件中。OBJ文件可以是二进制文件,也可以是ASCII文件,其中二进制格式文件的扩展名是.mod,ASCII格式文件的扩展名是.obj。

3.1 OBJ文件格式

Maya的开放系统输出数据文件类型有MEL,DXF,Explore,Geo,OBJ, IGES, Aliaswire,Aiff,Image,RIB,MOV (Aaciimotion),VRML2。其中OBJ模型文件为文本类型,结构比较简单,它保存的是一些多边形的信息,诸如顶点点几何坐标、纹理坐标,点与点如何连线组成线、面等等。用一个一个的多边形面片拼合就可以构造出三维物体。下面简要的介绍一个obj文件格式[3]。

OBJ文件的基本结构[4]。OBJ文件不需要任何种文件头(File Header),尽管经常使用几行文件信息的注释作为文件的开头。OBJ文件由一行行文本组成,注释行以符号“#”为开头,空格和空行可以随意加到文件中以增加文件的可读性。有字的行都由一两个标记字母也就是关键字(Keyword)开头,关键字可以说明这一行是什么样的数据。多行可以逻辑地连接在一起表示一行,方法是在每一行最后添加一个连接符(\)。注意连接符(\)后面不能出现空格或Tab格,否则将导致文件出错。

下列关键字可以在OBJ文件使用。在这个列表中, 关键字根据数据类型排列,每个关键字有一段简短描述。

顶点数据(Vertex data):

v:几何体顶点(Geometric vertices)。表示本行指定一个顶点。此前缀后跟着3个单精度浮点数,分别表示该定点的X、Y、Z坐标值。

Vt:贴图坐标点(Texture vertices)。表示本行指定一个纹理坐标。此前缀后跟着两个单精度浮点数。分别表示此纹理坐标的U、V值。

Vn:顶点法线(Vertex normals)。表示本行指定一个法线向量。此前缀后跟着3个单精度浮点数,分别表示该法向量的X、Y、Z坐标值。

Vp:参数空格顶点 (Parameter space vertices)。

自由形态曲线(Free-form curve)/表面属性(surface attributes):

Deg:度(Degree)。

Bmat:基础矩阵(Basis matrix)。

Step:步尺寸(Step size)。

cstype 曲线或表面类型 (Curve or surface type):

元素(Elements):

P:点(Point)

L:线(Line)

F:面(Face)

Curv:曲线(Curve)

curv2 2D:曲线(2D curve)

surf:表面(Surface)

自由形态曲线(Free-form curve)/表面主体陈述(surface body statements):

Parm:参数值(Parameter values )

Trim:外部修剪循环(Outer trimming loop)

Hole:内部整修循环(Inner trimming loop)

Scrv:特殊曲线(Special curve)

sp:特殊的点(Special point)

end:结束陈述(End statement)

自由形态表面之间的连接(Connectivity between free-form surfaces):

Con:连接 (Connect)

成组(Grouping):

G:组名称(Group name)

S:光滑组(Smoothing group)

Mg:合并组(Merging group)

O: 对象名称(Object name)

显示(Display)/渲染属性(render attributes):

Bevel:导角插值(Bevel interpolation)

c_interp:颜色插值(Color interpolation)

d_interp:溶解插值(Dissolve interpolation)

lod:细节层次(Level of detail)

usemtl:材质名称(Material name)

mtllib:材质库(Material library)

shadow_obj:投射阴影(Shadow casting)

trace_obj:光线跟踪(Ray tracing)

ctech:曲线近似技术(Curve approximation technique)

stech:表面近似技术 (Surface approximation technique)

OBJ文件不包含面的颜色定义信息,不过可以引用材质库,材质库信息储存在一个后缀是".mtl"的独立文件中。关键字"mtllib"即材质库的意思[5]。

材质库中包含材质的漫射(diffuse),环境(ambient),光泽(specular)的RGB(红绿蓝)的定义值,以及反射(specularity),折射(refraction),透明度(transparency)等其它特征。"usemtl"指定了材质之后,以后的面都是使用这一材质,直到遇到下一个"usemtl"来指定新的材质。

3.2 OBJ格式示例

举例说明OBJ的文件格式。先看一个四边形的OBJ文件square.obj。

# square.obj

v 0.000000 2.000000 0.000000

v 0.000000 0.000000 0.000000

v 2.000000 0.000000 0.000000

v 2.000000 2.000000 0.000000

f 1 2 3 4

其中4个v表示四个顶点坐标,f表示多边形,最后一行表示一个有四个顶点的多边形。其顶点是顶点序号来表示的。#表示注释。

又如 # twosquare.obj

v 0.000000 2.000000 0.000000

v 0.000000 0.000000 0.000000

v 2.000000 0.000000 0.000000

v 2.000000 2.000000 0.000000

v 4.000000 0.000000 -1.255298

v 4.000000 2.000000 -1.255298

vn 0.000000 0.000000 1.000000

vn 0.000000 0.000000 1.000000

vn 0.276597 0.000000 0.960986

vn 0.276597 0.000000 0.960986

vn 0.531611 0.000000 0.846988

vn 0.531611 0.000000 0.846988

# 6 vertices

# 6 normals

g all

s 1

f 1//1 2//2 3//3 4//4

f 4//4 3//3 5//5 6//6

# 2 elements

对上面 twosqaure.obj的数据解释如下:vn表示顶点法向量,g表示group,all是group的名字。下面的两个face都属于这个group,直到下一个g命令或者文件结束为止。s表示平滑组,而1是group all的序号。在最后两行中 1//1中,第一个 1表示顶点序号,后一个 1表示顶点法向量序号,中间表示纹理向量序号,对应于由 vt 命令定义的各行。2//2,3//3,4//4,含义一样[6]。

3.3 OBJ文件的输入处理

了解了OBJ文件的结构后,为了在程序中读入模型,需要建立对应的模型数据结构。程序中首先定义了OBJ文件对应的结构体,如对象顶点的结构体、颜色列表结构体、材质描述结构体和总的模型描述结构体。主要代码如下:

// 通用节点

typedef struct _GLMnode {

GLuint index;

GLboolean averaged;

struct _GLMnode* next;

} GLMnode;

//

/* glmWeldVectors: eliminate (weld) vectors that are within an

* epsilon of each other.

*

* vectors - array of GLfloat[3]'s to be welded

* numvectors - number of GLfloat[3]'s in vectors

* epsilon - maximum difference between vectors

*

*/

GLfloat*

glmWeldVectors(GLfloat* vectors, GLuint* numvectors, GLfloat epsilon)

{

GLfloat* copies;

GLuint copied;

GLuint i, j;

copies = (GLfloat*)malloc(sizeof(GLfloat) * 3 * (*numvectors + 1));

memcpy(copies, vectors, (sizeof(GLfloat) * 3 * (*numvectors + 1)));

copied = 1;

for (i = 1; i

for (j = 1; j

if (glmEqual(&vectors[3 * i], &copies[3 * j], epsilon)) {

goto duplicate;

}

}

/* must not be any duplicates -- add to the copies array */

copies[3 * copied + 0] = vectors[3 * i + 0];

copies[3 * copied + 1] = vectors[3 * i + 1];

copies[3 * copied + 2] = vectors[3 * i + 2];

j = copied; /* pass this along for below */

copied++;

duplicate:

/* set the first component of this vector to point at the correct

index into the new copies array */

vectors[3 * i + 0] = (GLfloat)j;

}

*numvectors = copied-1;

return copies;

}

/* glmFindGroup: Find a group in the model */

GLMgroup*

glmFindGroup(GLMmodel* model, char* name)

{

GLMgroup* group;

assert(model);

group = model->groups;

while(group) {

if (!strcmp(name, group->name))

break;

group = group->next;

}

return group;

}

获取了全局变量后,就可以在视图类中绘制所得到的对象模型,然后对模型进行操作和交互式处理。

图1是读入一个OBJ文件的效果图,图2是实现了三维模型与计算机程序交换。

4 读入OBJ模型进行交互控制

首先需要在windows下安装OpenGL的glut库。GLUT不是OpenGL所必须的,但它会给我们的学习带来一定的方便,推荐安装。Windows环境下安装GLUT的步骤:1)将下载的压缩包解开,将得到5个文件。2)在“我的电脑”中搜索“gl.h”,并找到其所在文件夹(如果是VisualStudio2005,则应该是其安装目录下面的“VC\PlatformSDK\include\gl文件夹”)。把解压得到的glut.h放到这个文件夹。3)解压得到的glut.lib和glut32.lib放到静态函数库所在文件夹(如果是VisualStudio2005,则应该是其安装目录下面的“VC\lib”文件夹)。4)把解压得到的glut.dll和glut32.dll放到操作系统目录下面的system32文件夹内。(典型的位置为:C:\Windows\System32)。

为了验证前面定义的模型的可行性, 我们开发了一个演示程序,结果成功地读取了由Maya软件以OBJ文件模式导出的Maya[7] 模型数据,并很容易地实现了模型纹理读取与映射。

Maya模型数据进入OpenGL 中以后,利用OpenGL 提供的坐标变换、颜色处理、光照处理、效果处理、选择及反馈模式等功能可实现三维物体更加真实的显示,同时还可以实现三维物体的移动、旋转、等交互[8]。图2是移动的交互后的图像截图。

5 结束语

把Maya 模型应用于OpenGL中,降低了OpenGL复杂建模的难度,我们可以得到较真实的三维复杂物体模型。在实验系统中,我们在OpenGL 程序中,引入Maya 输出数据模型.OBJ得到较好的三维动画效果,同时可以进行交互处理, 成果可用行运动模拟公路勘察、城市规划和虚拟现实等领域中。当然,当读取的模型数据量很大时,如何比较快的显示模型,要利用有关图形加速显示技术, 如LOD显示技术等,同时如何在读入的模型中加入属性信息,难度比较大还有待于进一步研究。我们还可以编制3DMAX,AutoCAD 等多种图形接口程序,把这些软件中建立的物体模型引入OpenGL的应用程序中,将可应用于虚拟现实、商业广告、影视制作、游戏制作等领域。

参考文献:

[1] 白建军,朱亚平,梁辉,等. OpenGL三维图形设计与制作[M].北京:人民邮电出版社,1999.

[2] 尚游,陈研涛.OpenGL图形程序设计指南[M].北京:水利水电出版社,2001.

[3] Shreiner D.OpenGL编程指南[M].5版.北京:机械工业出版社,2006.

[4] 乔林,费广正.OpenGL程序设计[M].北京:清华大学出版社,2000.

[5] Angel E.OpenGL程序设计指南[M].2版.北京:清华大学出版社,2005.

[6] 王景波,陆玲.基于OpenGL的3D果实造型研究[J].开发研究与设计技术,2010,36(4):279-280.

[7] 黄迁.基于VisualC++和OpenGL的红外目标景象仿真研究[J].红外技术,2010,32(2):101-102.

[8] 李宏召.基于OpenGL的直升机“地面共振”三维动态仿真系统[J].电子测量技术,2010,33(1):1-2.

上一篇:一种新的哼唱音符音高划分方法 下一篇:基于FPGA的车载电子设备浪涌冲击试验装置