当前位置: 首页 > 工具软件 > OJB > 使用案例 >

孙其功陪你学之——OJB文件介绍

常智勇
2023-12-01
OBJ 文件:
 
OBJ文件是Alias|Wavefront公司为它的一套基于工作站的3D建模和动画软件"Advanced Visualizer"开发的一种标准3D模型文件格式,很适合用于3D软件模型之间的互导,也可以通过Maya读写。比如你在3dsMax或LightWave中建了一个模型,想把它调到Maya里面渲染或动画,导出OBJ文件就是一种很好的选择。目前几乎所有知名的3D软件都支持OBJ文件的读写,不过其中很多需要通过插件才能实现。
OBJ文件不需要任何种头文件(File Header),尽管经常使用几行文件信息的注释作为文件的开头。OBJ文件由一行行文本组成,注释行以符号“#”为开头,空格和空行可以随意加到文件中以增加文件的可读性。有字的行都由一两个标记字母也就是关键字(Keyword)开头,关键字可以说明这一行是什么样的数据。多行可以逻辑地连接在一起表示一行,方法是在每一行最后添加一个连接符(\)。注意连接符(\)后面不能出现空格或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文件不包含面的颜色定义信息,不过可以引用材质库,材质库信息储存在一个后缀是".mtl"的独立文件中。关键字"mtllib"即材质库的意思。
材质库中包含材质的漫射(diffuse),环境(ambient),光泽(specular)的RGB(红绿蓝)的定义值,以及反射(specularity),折射(refraction),透明度(transparency)等其它特征。
"usemtl"指定了材质之后,以后的面都是使用这一材质,直到遇到下一个"usemtl"来指定新的材质。
例如:
mtllib teapot.mtl
usemtl gold
v -3.000000 1.800000 0.000000
v -2.991600 1.800000 -0.081000
v -2.991600 1.800000 0.081000
v -2.989450 1.666162 0.000000
v -2.985000 1.921950 0.000000
v -2.985000 1.921950 0.000000
v -2.981175 1.667844 -0.081000
v -2.981175 1.667844 0.081000
v -2.976687 1.920243 -0.081000
v -2.976687 1.920243 0.081000
v -2.968800 1.800000 -0.144000
v -2.968800 1.800000 0.144000
v -2.958713 1.672406 -0.144000

 

1。OBJ文件

OBJ文件中包含丰富的3D对象类型,而且文档 的说明很详细。因此熟悉OBJ文件的格式对于理解其他3D文件的格式也是很有用的。
下面我们举例说明OBJ文件的格式:
例1:

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

v 表示顶点坐标(vertex)。

f 表示面(face),就是多边形。最后一行表示一个
有四个顶点的多边形。其顶点是用引用号(reference
number)表示的。引用号就是顶点序号。

例二:

v 0.000000 2.000000 2.000000
v 0.000000 0.000000 2.000000
v 2.000000 0.000000 2.000000
v 2.000000 2.000000 2.000000
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
f 8 7 6 5
f 4 3 7 8
f 5 1 4 8
f 5 6 2 1
f 2 6 7 3

这次有8个顶点,6个面。注意OBJ文件格式规范中规定可以用负的顶引用号表示相对顶点序号,但glm不能处理这
种情况,用3D Exploration可以打开,但objview会crash)。

例3:

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

# 表示注释

vn 表示顶点法向矢量(vertex normal)。我们知道在OpenGL中要使用光照需要对每个点指定 法向矢量。在OBJ文件中则把这些法向矢量集中放在一起,而用序号来引用它们。
g 表示group,all是group的名字。下面的两个 face 都属于这个group,直到下一个g 命令或者 文件结束为止。
s 表示平滑组(smooth group),1是group的序号。
比较有意思的是最后两行。1//1 中第一个1表 示顶点序号(对应于由 v 命令定义的各行),后一个1表示顶点法向矢量序号(对应于由 vn命令
定义的各行)。中间其实省略了纹理矢量序号(对应于由 vt 命令定义的各行)。2//2,3//3,4//4,都作同样的解释。因此这一行还是表示一个四边形,只不过对每个点不仅定义了顶点坐标,而且定义了法向矢量。

例4:下面是colorcube.obj的内容:

mtllib colorcube.mtl
v 0.000000 2.000000 2.000000
v 0.000000 0.000000 2.000000
v 2.000000 0.000000 2.000000
v 2.000000 2.000000 2.000000
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
# 8 vertices
g front
usemtl red
f 1 2 3 4
g back
usemtl blue
f 8 7 6 5
g right
usemtl green
f 4 3 7 8
g top
usemtl gold
f 5 1 4 8
g left
usemtl orange
f 5 6 2 1
g bottom
usemtl purple
f 2 6 7 3
# 6 elements

mtllib colorcube.obj 表示本OBJ文件要用到一个材料文件colorcube.mtl,这个文件和本文件在同一个目录下。
usemtl red 表示此后的物体使用名叫red的材料,直到下一个usemtl 命令为止。材料red 由colorcube.mtl 定义。
下面是colorcube.mtl的内容:

#
# colocube.mtl
#

newmtl red
Ka 0 0 0
Kd 1 0 0

newmtl blue
Ka 0 0 0
Kd 0 0 1

newmtl green
Ka 0 0 0
Kd 0 1 0

newmtl gold
Ka 0.247250 0.199500 0.074500
Kd 0.751640 0.606480 0.226480
Ks 0.628281 0.555802 0.366065
illum 0
Ns 51.200001

newmtl orange
Ka 0 0 0
Kd 0.9 0.5 0

newmtl purple
Ka 0 0 0
Kd 0.7 0 0.9

newmtl red 定义一个名叫red的材料。

Ka,Kd,Ks,illum,Ns 分别定义ambient, diffuse, specular, emission 和 shiness 参数。
到这里,我们对OBJ文件中涉及多边形的部分有了初步的了解。OBJ文件还包含很多其它的命令,实现规范中的所有命令是很繁杂的工作,glm.c 只实现了涉及多边形的一部命令,大体上也就是我们这几个例子中所用到的命令。

 类似资料: