obj文件解析

obj文件解析

 1 前言

OBJ文件是Alias|Wavefront公司为它的一套基于工作站的3D建模和动画软件"Advanced Visualizer"开发的一种标准3D模型文件格式,目前市面上大多数主流的软件平台都是支持OBJ格式,OBJ模型于是也就成为了一种常用的数据交换格式。 OBJ文件是一种文本文件,由于模型是明码标记,这就方便我们对其进行查看、编辑。

博主通过参考OBJ规范文档,将规范文档加上自己的一定理解写成本文,旨在帮助大家了解obj模型结构,在日常工作中更好使用它!

2 概述

2.1 Obj模型特点

OBJ3.0文件格式支持直线(Line)、多边形(Polygon)、表面(Surface)和自由形态曲线(Free-form Curve)。直线和多边形通过它们的点来描述,曲线和表面则根据它们的控制点和依附于曲线类型的额外信息来定义,这些信息支持规则和不规则的曲线,包括那些基于贝塞尔曲线(Bezier)、B样条(B-spline)、基数(Cardinal/Catmull-Rom)和泰勒方程(Taylor equations)的曲线。其他特点如下:

(1)OBJ文件是一种3D模型文件。不包含动画、材质特性、贴图路径、动力学、粒子等信息。

(2)OBJ文件主要支持多边形(Polygons)模型。虽然也支持曲线(Curves)、表面(Surfaces)、点组材质(Point Group Materials),但Maya导出的OBJ文件并不包括这些信息。

(3)OBJ文件支持三个点以上的面,这一点很有用。很多其它的模型文件格式只支持三个点的面,所以导入Maya的模型经常被三角化了,这对于我们对模型进行再加工甚为不利。

(4)OBJ文件支持法线和贴图坐标。在其它软件中调整好贴图后,贴图坐标信息可以存入OBJ文件中,这样文件导入Maya后只需指定一下贴图文件路径就行了,不需要再调整贴图坐标。

2.2 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里的面的索引可正可负,为正数时是指顶点的绝对索引,为负时(比如:f -a -b -c),表示从该面位置开始,倒数的第a,b,c个顶点,vn,vt索引也一样。

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

材质中包含材质的漫射(diffuse),环境(ambient),光泽(specular)的RGB(红绿蓝)的定义值,以及反射(specularity),折射(refraction),透明度(transparency)等其它特征。

"usemtl"指定了材质之后,以后的面都是使用这一材质,直到遇到下一个"usemtl"来指定新的材质。

注意:这里面最常用的几个参数是v,vt,vn,f,s,g,o,usemtl,mtllib 其他的参数很少用到。

OBJ数据解析

3.1 模型材质的定义(mtllib)

 

obj模型通过记事本打开之后发现,在模型的开头会定义材质的引用对象:mtllib model.mtl 这句话的意思是材质参考model.mtl文件,至于mtl文件的组织结构后面将会详细介绍,这里不再详述,大家只要知道它是一个模型材质文件就行了。

#开头的表示注释内容,软件解析文件的时候会自动忽略。

3.2模型顶点(v)

计算机图形学中模型通过顶点、顶点法线、顶点uv、面构成。在obj模型中模型的顶点是通过v进行标识记录的,格式为“v x y z”。其中xyz分别表示xyz坐标值。

 

 

3.3顶点法线(vn)

模型的顶点和面都是具有法线这个概念的,法线决定着对应对象的可见性。法线朝内,对象不可见。法线朝外,对象可见。模型面的法线是可以根据模型顶点法线进行计算得到,所以obj中的法线用顶点法线表示就可以。

 

 

顶点法线使用vn进行标识,表示格式为:“vn x y z” 其中xyz分别表示xyz方向上向量值。

3.4 顶点贴图坐标(vt)

具有贴图的模型,模型几何与贴图是如何对应起来的?其实很简单,通过uv坐标就可以将模型与对应贴图,标识符为vt,表达格式为:“vt u v”

 

 

3.5模型面(f)

模型面对象就像一个容器将上面的顶点坐标、顶点法线、顶点uv通过索引值进行组织在一起,封闭为模型体。面对象可以由三角形或者四边形构成,其表达格式为:”f verticeIndex\vtIndex\vnIndex”其中verticeIndex表示顶点序列号,vtIndex表示uv索引号,vnIndex表示法线索引号,其中vtIndex,vnIndex可以缺失,不写也没有关系,但是顶点索引值必须得有。

 

 

3.6 对象材质(usemtl)

对于上面编写的模型结构,需要为这个对象指定一个材质,需要用usemtl 进行标识,格式为usemtl [material name]

 

 

3.7 其他参数

o标识对象名称

g 标识模型组

s 标识光滑组

 

 

 

4 Mtl数据解析

当你导出Obj模型的时候会发现除了.obj文件还会有个同名.mtl文件,这个文件用来干什么的?其实这个文件是用来记录模型的材质参数的,包括贴图、环境光参数、模型反射等参数。

 

 

Newmtl 标识材质名称

Ks 标识镜面反射颜色,颜色为rgb参考,取值0-1

Ns标识镜面反射中加权反射指数

Ka标识环境颜色,颜色为rgb参考,取值0-1

Kd标识漫反射颜色,颜色为rgb参考,取值0-1

d 和Tr 标识材质的透明度,Tr=1-d

map_ka和map_kd分别表示贴图路径

模型的材质可能会要不同的效果,为了达到这种区分,用关键字illum进行标识

Illum 0表示颜色和环境参数关闭

Illum 1表示颜色和环境参数开启

Illum 2表示材质高亮显示

Illum 3表示开启反射和光线跟踪

Illum 4表示玻璃透明度开启,管线追踪开启

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值