-
OBJ
文件格式内幕详解
2009
年
05
月
26
日
星期二
15:16
我们经常见到的
*.obj
文件有两种
:
第一种是基于
COFF(Common
Object
File
Forma
t)
格式的
OBJ
文件
(
也称目标文件
)
,这种格式
用于编译应用程序;第
二种是
Alias|Wavefront
公司推出的
OBJ
模型文件。
我要讲的
OBJ
文件格式是指
< br>第二种
-OBJ
模型文件。
说起<
/p>
3D
文件格式,大家一定不会感到陌生,
,
,
,
,
< br>,
,相信人人都能列举出几种来。但是说起
OBJ
文件的
具体特征,却很少有人能给出较为圆满
的描述。
很多人认识
OBJ
文件是从使用
Poser
开始的,
Poser
是一款人体建模软件,要把
Poser<
/p>
生成的人体导出到其它
3D
软件中进行再
加工,就用到了
OBJ
文件。
OBJ<
/p>
文件是一种标准的
3D
模型文件
格式,
很适合用于
3D
软件模型之间的互导。
比如你在
3dsMax
< br>或
LightWave
中建
了一
个模型,想把它调到
Maya
里面渲染或动画,导出
OBJ
文件就是一种很好的
选择。目前几乎所有知
名的
3D
软件都支持
OBJ
文件的读写,不过很多软件需要
通过插件才能做到这一点。
另外,作为一种优秀的文件格式,很多游戏引擎也都支持
< br>OBJ
文件的读取。
了
解
OBJ
文件格式有什么用呢?如果你不学编
程的话,用处确实不大。不过,
3D
软件模型之间的互导是一件
很常见的事情,不幸的是,目前的
3D
软件模型导出
功能都不那么完美,
经常会出现缺面少线的情况,
有时还会遇到导出的模型根本
打不开的情况。
如果情况非常紧急
的话,
你一定会不惜一切代价仔细研究,
期望
< br>找到原因,解决问题。在这种情况下,我的教程也许会对你有很大帮助。
OBJ
文
件是一种文本文件格式,
这就意味着你可以直接用写字板打开进行查
看修改,
如果你能看懂每一行的内容是什么意思,
相信距离
你成功的解决问题已
经不远了。
如果
Maya
自身的模型出错,
也可以先转成
OBJ
格式,
修改之后再导回
Maya
。<
/p>
OBJ
文件
--
概念
<
/p>
OBJ
文件是
Wavefront
公司为它的一套基于工作站的
3D
建模和动画
软件
Visualizer
开发的一种
文件格式,
这种格式同样也以通过
Maya
读写。
要想知道一个文件是不是
OBJ
p>
文件,通常根据这个文件名的后缀来判断,
OBJ
< br>文件的后缀是
。
OBJ
文件是让人可读的文本,你可以直接用写字板打
开对它进行编辑。
另外,
有一种与此相关二进制文件格式<
/p>
(
使用
后缀
p>
)
,
二进制格式作为专利
< br>未公开,因此在这里我们不作讨论。
OBJ
最近的有文档的版本是
p>
v3.0
,代替以前的
v2.11
版本。
OBJ3.0
格式支持多边形
(Polygo
n)
,直线
(Lines)
,表面
p>
(Surfaces)
,和自
由形态曲线<
/p>
(Free-form
Curves)
。
直线和多角形通
过它们的点来描述,
曲线和表面则根据于它们的控制点和依附于
曲线类型的额外信息来定义。
这些信息支持规则和不规则的曲线,
包括那些基于
贝塞尔
(Bezier)
曲线,
B
样条
(B-spline)
,基数
(Cardinal/Catmull-Rom
样条
)
,
和泰勒方程<
/p>
(Taylor
equations)
的曲线。
OBJ
文件
--
特点
(1)OBJ
是一种
3D
模型文件,因此不包含动画、材质特性、贴图路径、动力
学、粒子等信息。<
/p>
(2)
OBJ
文件主要支持多边形
(Polygons)
模型。
虽然
OBJ
p>
文件也支持曲线
(Curves)
、表面<
/p>
(Surfaces)
、点组材质
(Po
int Group
Materials)
,但
Maya
导出的
OBJ
文件
并不包括这些信息。
(3)OBJ
文件支持三个点以上的面,这一点很有用。
很多其它的模型文件格式只支持三个点的面,所以我们导入
Maya
的模型经常被
三角化了,这对于我们对模型的
再加工甚为不利。
(4)OBJ
文件支持法
线和贴图坐标。
在其它软件中调整好贴图后,
贴图坐标信息可以存入
OBJ
文件中,
这样文件
导入
Maya
后只需指定一下贴图文件路径就行了,不需要再调
整贴图坐标了。
OBJ
文件
--
基本结构
OBJ
文件不需要任何种文件头
(File Header)<
/p>
,尽管经常使用几行文件
信息的注释作为文件的开头。
OBJ
文件由一行行文本组成,注释行以一个
“井”号
(#)
为开头,空格和空行可
以随意加到文件中以增加文件的可读性。
有字的行都由一两个标记字母也就是关
键字
(Keyword)
开头,关键字可以说明
这一行是什么样的数据。多行可以逻辑地
连接在一起表示一行,方法是在每一行最后添加
一个连接符
()
。
注意连接符
()
后面不能出现空格或
< br>tab
格,否则将导致文件出错。
下列关键字可以在
OBJ
文件使用。
在这个列表中
,
关键字根据数据类型排列,每个关键字有一段简短描述。
顶点数据
(Vertex
data)
:
v
几何体顶点
(Geometric vertices)
vt
贴图坐标点
(Texture vertices)
vn
顶点法线
(Vertex normals)
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
文件
--
实例:
下面通过实例来具体讲解。
OBJ
文件记录一个四边形的代码:
v -0.58 0.84 0
v 2.68 1.17
0
v 2.84 -2.03 0
v -1.92
-2.89 0
f 1 2 3 4
让我们来创建一个
OBJ
文件,不过这一回我们不用
3D
软件,而是用写字
板
来创建。
打开写字板,把上面的
5
行代码写上去,可以适当加一点注释。
保存文件为文本格式,文件名为
p>
,如图。
注意:
代码最后一定要按一下回车把光标切换到下一行,
就是说加一个换行
符
(n)
< br>。否则会看到如下错误信息:
// Error: line 1: OBJ file
line 5: index out of range. //
// Error: line 1: Error
reading file. //
点击放大
在
Maya
中导入
文件,
看见了吧,
导入了一个四边
形。
这个四边
形的形状是完全由前面的那
5
行代码决定的,下面我们来分析一个这些代码。
v -0.58 0.84 0
画一个四边形需要四个顶点,这是
第一个顶点,
表示顶点
(vertex
)
,
为这个顶点的
X
轴坐标值,
为
< br>Y
轴坐标值,
为
Z
轴坐标值。
这是第一个顶点,它的索引号是
1
。索引号是画面时要用到的。
v 2.68 1.17 0
v 2.84 -2.03 0
v -1.92 -2.89 0
这分别是第二、三、四个顶点,它
们的索引号分别是
2
,
3
,
4
。
f 1
2 3 4
现在开始画面,<
/p>
表示面
(face)
,
1
,
2
,
3
,
4
是前
面那四个顶点的索引号。
请注意画这个面连接点的顺序,
是从第
一个点出发,
依次连接第二、
三、
四个
点。
如果连接的顺序不同所生成的面也会截然不同,例如
会产生一个交
迭的面,如图。
面的连接点是按顺时针排列或逆时针排列,将决定面的法线方
向
(
面的反正
)
。
例如:
面的法线向外,
面的法线向里。
面的连接点顺序错误,是导致导入模型产生碎面的一个重要原因。
一个面
不能出现两个以上相同的顶点,这也是检查
OBJ
文件出错的一
个要
点。
例如:
,有
两个相同的顶点,索引号是
3
。一个面出现两个
相同顶点,可能造成程序的内存分配错误。
下面来研究一下
Maya
导出的
OBJ
文件。
在
May
a
中创建一个多边形立方体,选中这个立方体,选择菜单
Export
Selection...
导
出格式为
OBJ
,
文件名为
,
如果没有此格式,
请在
Plug-in
Manager
中载
入
。
用写字
板打开
,可
以看到如下代码:
# The
units used in this file are centimeters.
g default
v -0.500000
-0.500000 0.500000
v 0.500000 -0.500000 0.500000
v -0.500000
0.500000 0.500000
v 0.500000 0.500000 0.500000
v -0.500000
0.500000 -0.500000
v 0.500000 0.500000 -0.500000
v -0.500000
-0.500000 -0.500000
v 0.500000 -0.500000 -0.500000
vt 0.000000
0.000000
vt
1.000000 0.000000
vt 0.000000 1.000000
vt 1.000000 1.000000
vt 0.000000
2.000000
vt
1.000000 2.000000
vt 0.000000 3.000000
vt 1.000000 3.000000
vt 0.000000
4.000000
vt
1.000000 4.000000
vt 2.000000 0.000000
-
-
-
-
-
-
-
-
-
上一篇:用C++实现的无向图广度优先遍历
下一篇:图的应用的实验报告