ISSN 1009-3044
第 7 卷第 10 期 (2011 年 4 月)
Computer Knowledge and Technology 电脑知识与技术
Vol.7, No.10, April 2011,pp.2393-2396,2399
E-mail: eduf@cccc.net.cn
Computer Knowledge and Technology 电脑知识与技术
http://www.dnzs.net.cn
Tel:+86-551-5690963 5690964
三维模型文件中的 OBJ 格式在 OpenGL 中的输入与处理
王金峰,姚国清
中国地质大学
北京
北京
(
),
100083)
(
摘要 :介绍了当今流行的三维作图工具 Maya,阐述了 Maya 生成的 OBJ 三维格式 ,如 何 将 OBJ 格 式 文 件 在 OpenGL(Open Graphic
Library)中进行输入和处理。 重点介绍了 OBJ 文件的文件格式及怎样利用程序代码来构建模型数据结构 、绘制对象模型,然后运用
OpenGL 的强大功能实现三维显示和交互操作。
关键词:三维模型文件;OpenGL;OBJ 文件;交互
中图分类号:TP391
文章编号:1009-3044(2011)10-2393-04
文献标识码:A
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
IRIS GL,
OpenGL
为使其能适用于多种硬件
,SGI
适用于多种硬件平台及操作系统
,
(Open Graphic Library),
。
出高质量的动画效果
作为自己的图形标准
程序可以十分方便地在各种平台间移植
效率高
由于
从而使
OpenGL
OpenGL
,
。
开发了
OpenGL,
1992
7
并于
年
月发布了
用户用这个图形库不仅能方便的制作出有极高质量的静止三维彩色图像
在三维真实感图形制作中具有优秀的性能
许多大公司
如
成为了新一代的三维图形工业标准
它独立于窗口系统和操作系统
;OpenGL
可以与
Visual C++
紧密接口
可保证算法的正确性和可靠性
。
,
,
(
Microsoft、IBM、DEC、SUN
还能创建
,
等
都将其
以它为基础开发的应用
使用简便
)
;OpenGL
,
,
。
它的前身是
版本
OpenGL1.0
。
公司为其图形工作站开
SGI
具有许多实用
颜色模式设置
、
编程环境可以方便地对所构模型的人机交互进行控制
高效的功能
建模
变换
如
、
、
、
,
:
光照与材质设置
纹理映射
、
、
位图显示以及双缓存动画等
而
。
公司开发的三维动画软件
已在全世界广泛用于影视
虚拟仿真等领域
,
集成了
视频
商业产品
最先进的动画及数字效果技术
游戏
、
、
、
。 Maya
Aliaso/Wavefront
而且还与最先进的建模
毛发渲染
在目前市场上用来进行数字和三维制作的工具中
数字化布料模拟
、
、
、
运动匹配技术相结合
是首选解决方案
,Maya
即用许多小多边形拼出模型的外观
文件中保存这些多边形的信息
因此可以方便地从三维图形数据文件中读取模型数据并在
。
由于
中绘制[1]。
OpenGL
OpenGL
、
。
、
宽带
本地
它不仅包
可在
。 Maya
。 Maya
Win-
模型数据的
中提供了最基
。
,
OpenGL
Windows
且借助
2 Maya 软件简介
是位于加拿大的
Maya
Aliaso/Wavafront
高端广播
化娱乐
括一般三维和视觉效果制作的功能
多种图形运用
、
、
、M TV、
,
操作系统上运行
。
与
SGIIR IX
dows NT
输出方法中提供了多边形逼近法
,
本的有多边形构造三维模型的方法
3 OBJ 文件格式简介
,
文件是
OBJ
Alias/Wavefront
于它的文件结构非常简单
这里的
模型文件
3D
名是
3.1 OBJ 文件格式
.mod,ASCII
公司开发的三维动画软件
的一种数据输出类型
它定义了对象的几何和其它的一些特性
由
。
,
所以适合在应用程序中读取或进行
3D
OBJ[2]文件不是我们常见的程序编译生产的目标文件
后来被广泛应用到各种应用软件中
,
。 OBJ
,
Maya
,
文件格式转换
而是一种定义物体几何模型的
。
文件可以是二进制文件
也可以是
,
ASCII
格式文件的扩展名是
.obj。
文件
最初是
的标准
其中二进制格式文件的扩展
Wavefront
,
3D
文件
,
Maya
VRML2。
的 开 放 系 统 输 出 数 据 文 件 类 型 有
其中
模型文件为文本类型
OBJ
,
,
结构比较简单
MEL,DXF,Explore,Geo,OBJ, IGES, Aliaswire,Aiff,Image,RIB,MOV (Aaciimotion),
点与点如
它保存的是一些多边形的信息
诸如顶点点几何坐标
纹理坐标
,
、
,
收稿日期:2011-02-16
作者简介:王金峰(1987-),男,河北成安人,硕士,计算机图像处理;姚国清,教授,硕士。
本栏目责任编辑:唐一东
多媒体技术及其应用
2393
、
。
OBJ
文件的基本结构[4]。 OBJ
,
文件由一行行文本组成
记字母也就是关键字
行最后添加一个连接符
下列关键字可以在
顶点数据
(\)。
OBJ
(Vertex data):
(Keyword)
,
几何体顶点
贴图坐标点
顶点法线
参数空格顶点
v:
Vt:
Vn:
Vp:
自由形态曲线
(Geometric vertices)。
(Texture vertices)。
(Vertex normals)。
Deg:
Bmat:
Step:
cstype
元素
点
线
面
度
(Degree)。
基础矩阵
步尺寸
(Step size)。
曲线或表面类型
(Basis matrix)。
(Free-form curve)/
(Parameter values )
(Surface)
(2D curve)
(Curve)
曲线
(Elements):
(Point)
(Line)
(Face)
曲线
P:
L:
F:
Curv:
curv2 2D:
表面
surf:
自由形态曲线
参数值
外部修剪循环
内部整修循环
特殊曲线
Parm:
Trim:
Hole:
Scrv:
sp:
end:
自由形态表面之间的连接
特殊的点
结束陈述
(Special point)
Con:
成组
G:
S:
Mg:
O:
显示
连接
(Connect)
(Grouping):
组名称
光滑组
合并组
对象名称
(Group name)
(Smoothing group)
(Merging group)
(Object name)
渲染属性
(Display)/
导角插值
(Special curve)
(End statement)
(Parameter space vertices)。
表面属性
(Free-form curve)/
(surface attributes):
(Curve or surface type):
表面主体陈述
(surface body statements):
(Outer trimming loop)
(Inner trimming loop)
(Connectivity between free-form surfaces):
Computer Knowledge and Technology 电脑知识与技术
第 7 卷第 10 期 (2011 年 4 月)
何连线组成线
面等等
用一个一个的多边形面片拼合就可以构造出三维物体
下面简要的介绍一个
文件格式[3]。
obj
文件不需要任何种文件头
尽管经常使用几行文件信息的注释作为文件的开头
(File Header),
注释行以符号
为开头
空格和空行可以随意加到文件中以增加文件的可读性
“#”
,
开头
关键字可以说明这一行是什么样的数据
多行可以逻辑地连接在一起表示一行
。 OBJ
有字的行都由一两个标
方法是在每一
。
,
注意连接符
文件使用
后面不能出现空格或
(\)
在这个列表中
。
,
格
否则将导致文件出错
Tab
,
。
关键字根据数据类型排列
每个关键字有一段简短描述
,
。
。
。
表示本行指定一个顶点
此前缀后跟着
个单精度浮点数
,
此前缀后跟着两个单精度浮点数
3
表示本行指定一个纹理坐标
表示本行指定一个法线向量
。
此前缀后跟着
分别表示该定点的
X、Y、Z
分别表示此纹理坐标的
。
个单精度浮点数
3
分别表示该法向量的
,
X、Y、Z
。
。
坐标值
值
U、V
坐标值
。
。
。
(render attributes):
(Bevel interpolation)
颜色插值
溶解插值
(Color interpolation)
(Dissolve interpolation)
(Level of detail)
(Material name)
材质名称
材质库
(Material library)
投射阴影
(Shadow casting)
细节层次
Bevel:
c_interp:
d_interp:
lod:
usemtl:
mtllib:
shadow_obj:
trace_obj:
ctech:
stech:
OBJ
光线跟踪
曲线近似技术
表面近似技术
(Ray tracing)
(Curve approximation technique)
(Surface approximation technique)
文件不包含面的颜色定义信息
不过可以引用材质库
,
即材质库的意思[5]。
材质库中包含材质的漫射
等其它特征
透明度
(transparency)
3.2 OBJ 格式示例
材质库信息储存在一个后缀是
,
".mtl"
的独立文件中
关键字
。
"mtllib"
(diffuse),
。 "usemtl"
环境
光泽
指定了材质之后
(ambient),
的
红绿蓝
的定义值
(specular)
以后的面都是使用这一材质
RGB(
)
以及反射
直到遇到下一个
,
,
,
折射
(specularity),
"usemtl"
(refraction),
来指定新的材质
。
举例说明
的文件格式
。
OBJ
先看一个四边形的
文件
OBJ
square.obj。
2394
多媒体技术及其应用
本栏目责任编辑:唐一东
第 7 卷第 10 期 (2011 年 4 月)
Computer Knowledge and Technology 电脑知识与技术
表示多边形
,
,f
最后一行表示一个有四个顶点的多边形
其顶点是顶点序号来表示的
表示注
。 #
。
的 数 据 解 释 如 下
命令或者文件结束为止
表 示 顶 点 法 向 量
表示平滑组
中间表示纹理向量序号
:vn
。 s
而
,
对应于由
,g
是
1
表示顶点法向量序号
表 示
,
vt
group,all
是
的序号
的 名 字
group
。
在最后两行中
group all
。
命令定义的各行
1//1
。 2//2,3//3,4//4,
face
1
,
第一个
中
含义一样[6]。
下 面 的 两 个
,
都 属 于 这 个
表示顶点序
为了在程序中读入模型
需要建立对应的模型数据结构
程序中首先定义了
文件对应的结构
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
# 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
直到下一个
g
后一个
group,
号
3.3 OBJ 文件的输入处理
1
,
了解了
如对象顶点的结构体
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
*
*/
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;
- maximum difference between vectors
本栏目责任编辑:唐一东
多媒体技术及其应用
2395
Computer Knowledge and Technology 电脑知识与技术
第 7 卷第 10 期 (2011 年 4 月)
/* pass this along for below */
for (i = 1; i <= *numvectors; i++) {
for (j = 1; j <= copied; 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;
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
,
5
,
,
(
就可以在视图类中绘制所得到的对象模型
然后对模型进行操作和交互式处理
。
是实现了三维模型与计算机程序交换
。
4 读入 OBJ 模型进行交互控制
首先需要在
windows
环境下安装
OpenGL
glut
。 GLUT
将下载的压缩包解开
的步骤
下安装
的
库
不是
将得到
OpenGL
所必须的
,
在
但它会给我们的学习带来一定的方便
我的电脑
中搜索
并找到其所在文件夹
,
个文件
Windows
果是
压得到的
GLUT
:1)
则应该是其安装目录下面的
。 2)
“
文件夹
VisualStudio2005,
“VC\PlatformSDK\include\gl
和
放到静态函数库所在文件夹
如果是
glut.lib
把解压得到的
glut32.lib
和
glut.dll
glut32.dll
4)
放到操作系统目录下面的
VisualStudio2005,
文件夹内
。 (
system32
为了验证前面定义的模型的可行性
我们开发了一个演示程序
结果成功地读取了由
”
“gl.h”,
glut.h
把解压得到的
”)。
则应该是其安装目录下面的
典型的位置为
放到这个文件夹
“VC\lib”
:C:\Windows\System32)。
文件模式导出的
软件以
Maya
OBJ
Maya[7]
推荐安装
。
如
解
(
。 3)
文件夹
)。
模型数据
并很容易地实现了模型纹理读取与映射
,
模型数据进入
中以后
利用
。
OpenGL
OpenGL
Maya
,
,
实现三维物体更加真实的显示
5 结束语
,
同时还可以实现三维物体的移动
提供的坐标变换
颜色处理
、
等交互[8]。
、
图
2
旋转
、
、
、
、
是移动的交互后的图像截图
。
光照处理
效果处理
选择及反馈模式等功能可
OpenGL
模型应用于
我们可以得到较真实的三维复杂物体模型
。
输出数据模型
引入
程序中
同时可以进行交互处理
Maya
,
OpenGL
,
城市规划和虚拟现实等领域中
,
,
中
OpenGL
降 低 了
复 杂 建 模 的
在实验系统中
,
得到较好的
成果可用于飞行运动模
当读取的模型
要利用有关图形加速显示
同时如何在读入的模型中加入属性信
当然
.OBJ
。
,
,
如何比较快的显示模型
,
显示技术等
把
Maya
难度
,
我们在
三维动画效果
拟公路勘察
、
数据量很大时
技术
息
LOD
如
,
,
难度比较大还有待于进一步研究
,
我们还可以编制
。
3DMAX,
等多种图形接口程序
把这些软件中建立的物体模型引入
AutoCAD
制作
、
游戏制作等领域
。
,
图 1 OBJ 导入图像
图 2 移动交互图像
OpenGL
的应用程序中
,
将可应用于虚拟现实
商业广告
影视
、
(下转第 2399 页)
、
2396
多媒体技术及其应用
本栏目责任编辑:唐一东
第 7 卷第 10 期 (2011 年 4 月)
Computer Knowledge and Technology 电脑知识与技术
CCritSec RLock;
CheckMediaTyep();
ReceiveMedia()//
…
}
处理接收到的视频并发向网络
;
2.5 视频接收
SocketReceiveFilter
,
负责接收数据包
并将数据包解包后按照媒体数据包的格式转发到下一级过滤器
在这里也是采用程序内过滤器的形式来实现的
了
类
,
CSourceSueam
, SocketReceiveFilter
类的父类选择了
建立的类分别是
CSource
。
SocketReceiveFilter
类
两个类的关键实现如下
类和
:
,
属于客户端的源过滤器
。
的父类选择
类
因此
SocketReceivePin
。
Pin
Class SocketReceiveFilter:
Public CSource{
CCriSec RFilterLock;
GetPin();
GetPinCount();
…
}
Class SocketReceivePin:
Public CSourceStream {
SocketReceiveFilter *RFilter;
CMediaType RMedia;
GetMediaType();
ProssBuffer();
SetMediaType();
…
}
3 结束语
本文介绍了基于
完成了视频的捕获和编解码工作
的电信宽带时即可达到很清晰的效果
DirectShow
,
。
的远程视频展示的实现方法
实现了本地视频捕获
回放和远程展示的功能
,
、
然后自行设计了网络传输部分的
实现流媒体功能
本系统利用现成的
视频捕获端和展示端都采
。
Filter
经测试
,
。
Filter
用
1M
参考文献:
[1]
[2]
[3]
[4]
[5]
[6]
视频展示台
王安
仲丽媛
张振
基于
曾华山
肖振中
陆其明
宋钰
梁晋
,
.
.
DirectShow
基于
的
.
.
基于
基于
,
,
.DirectShow
P2P
DirectShow
DirectShow
开发指南
[EB/OL].http://baike.baidu.com/view/1916343.html.
,
DirectShow
孙加军
UDP
和
协议的网络视频监控系统
[J].
计算机工程与设计
,2010,31(12).
视频会议系统研究与设计
的
视频捕获的实现
的网络视频监测系统的设计与实现
[D].
[J].
武汉
电脑知识与技术
VMR
:
武汉理工大学
,2009.
,2010,9(25):7110-7111.
计算机工程与应用
,2006,42(12).
[J].
北京
:
清华大学出版社
,2003.
[M].
梁辉
,
,
.OpenGL
,
陈研涛
朱亚平
白建军
尚游
(上接第 2396 页)
参考文献:
,
[1]
[2]
[3] Shreiner D.OpenGL
[4]
[5] Angel E.OpenGL
[6]
[7]
[8]
王景波
黄迁
李宏召
费广正
基于
乔林
陆玲
基于
基于
,
,
.
.
.
.OpenGL
程序设计
程序设计指南
的
OpenGL
3D
和
OpenGL
的直升机
“
VisualC++
OpenGL
编程指南
等
图形程序设计指南
. OpenGL
三维图形设计与制作
北京
人民邮电出版社
,1999.
[M].
:
北京
水利水电出版社
[M].
:
北京
机械工业出版社
,2006.
清华大学出版社
:
北京
.
清华大学出版社
,2000.
:
,2005.
.
版
北京
版
[M].5
[M].
[M].2
,2001.
果实造型研究
的红外目标景象仿真研究
地面共振
[J].
三维动态仿真系统
开发研究与设计技术
红外技术
[J].
,2010,36(4):279-280.
,2010,32(2):101-102.
电子测量技术
[J].
,2010,33(1):1-2.
:
”
本栏目责任编辑:唐一东
多媒体技术及其应用
2399