详解3D中的obj文件格式

加载3D模型的时候,遇到.obj格式的模型文件。之前有专门看过相关的资料,可惜没有总结,一下就忘了。再次用到,又去搜索了一番,发现网上很多文章讲的不是很全面。于是就找到百科上的文档,总结一下。
Obj(或者.obj)是一种几何定义文件格式,第一次是 Wavefront Technologies在他们的可视化加强动画包里面使用的。文件格式是公开的,并能很好的在其他的3D应用中被支持。
Obj文件格式是一种简单的单独表示3D几何图元的文件格式——也就是,顶点的坐标,每个顶点纹理的UV坐标,顶点法向量,以及组成多边形的面的顶点坐标、以及纹理UV坐标序列。面的顶点默认为逆时针顺序,法向量不是必须的。OBJ文件并非归一化的,但是可以在注释中加入缩放信息。
Obj文件可以是ASCII的编码(.obj)方式也可以是二进制格式(.mod)。以ASCII格式存储的obj文件必须用.obj作为文件拓展名。

1. 文件格式(File Format)

以哈希字符(#)开始的一行表示注释。

# this is a comment

一个obj格式的文件可能包含了顶点数据,自由形式的曲面/表面属性,绘制索引序列,自由形式的曲面/表面内容声明,关联自由形式的表面,组和渲染属性信息。大多数常见的绘制索引表现为几何顶点,纹理坐标,顶点法线以及多边形的面:

# List of geometric vertices, with (x,y,z[,w]) coordinates, w is optional and defaults to 1.0. 
v 0.123 0.234 0.345 1.0 
v ... 
... 
# List of texture coordinates, in (u, v [,w]) coordinates, these will vary between 0 and 1, w is optional and defaults to 0. 
vt 0.500 1 [0] 
vt ... 
... 
# List of vertex normals in (x,y,z) form; normals might not be unit vectors. 
vn 0.707 0.000 0.707 
vn ... 
... 
# Parameter space vertices in ( u [,v] [,w] ) form; free form geometry statement ( see below ) 
vp 0.310000 3.210000 2.100000 
vp ... 
... 
# Polygonal face element (see below) 
f 1 2 3 
f 3/1 4/2 5/3 
f 6/4/1 3/5/3 7/6/5 
f 7//1 8//2 9//3 
f ... 
...

1.1 几何顶点

一个顶点可以用字符v开头的一行来表示。接着后面跟上(x, y, z [w])的值来表示顶点坐标。W是可选项,默认为1.0。一些应用支持顶点颜色,通过在x y z后面跟上red, green, blue值来表示。颜色值的范围为0到1.0。

1.2 参数顶点空间

自由形式的几何图元声明可以使用字符vp开头的行来表示,用于定义一个曲面或者平面的参数空间中的顶点。"u"只能在曲面顶点中使用,u和v用于表示non-rational剪裁曲面的点,而u,v以及w表示rational剪裁曲面的点。

1.3 表面单元

表面通过一个包含顶点,纹理以及法线索引的序列来表示。类似四边形这种多边形可以通过多于三个包含顶点/纹理/法线索引来定义。
OBJ文件也支持自由形式的使用曲面和表现来定义对象的几何图元,例如NURBS表面。

顶点索引

一个合法的顶点索引符合上面定义的顶点序列格式。如果一个索引是正值则表示相对于顶点序列从1开始的偏移。如果一个索引是负的,表示从顶点序列结尾的偏移,从-1开始。
每个面都可以包含三个或者更多的顶点。

f v1 v2 v3 ....

纹理坐标索引

在描述一个平面的时候,纹理坐标索引作为可选项用于描述该顶点相关的纹理坐标。为了描述纹理坐标索引,必须在顶点坐标索引之后紧密添加一根斜线(/),之后再紧密添加纹理坐标索引。在斜线的前后都不能有空格。一个合法的纹理坐标索引从1开始,并符合之前描述的格式。每个面可以包含三个或者更多的单元。

f v1/vt1 v2/vt2 v3/vt3 ...

顶点法线索引

法线索引用于描述顶点的法向量,在描述面的时候是可选项。要添加顶点法线索引,必须在纹理索引之后添加第二根斜线(/),然后在之后添加法线索引。斜线前后不能有空格。合法的法线索引从1开始,并符合之前面描述的格式。每个面可以包含三个或者更多的单元。

f v1/vt1/vn1 v2/vt2/vn2 v3/vt3/vn3 ...

顶点坐标法线索引(不包含纹理索引)

可以在定义几何图元的时候忽略纹理坐标索引,但是必须在顶点坐标索引后加上两根斜线(//),然后添加法线索引。

f v1//vn1 v2//vn2 v3//vn3 ...

其他几何格式

Obj文件采用若干差值方法来支持高阶表面,例如泰勒和B差值,尽管支持这些特性要使用一些非标准的第三方文件。Obj文件不支持网格分级或者任何其他形式的动画或形变,例如顶点蒙皮或纹理变形。

材质引用

描述多边形的可见属性存储在外部的.mtl文件中。OBJ文件可能会引用超过一个的.mtl文件。.mtl文件可能包含一个或者多个不同命名的材质定义。

mtllib [external .mtl file name]
  ...

通过绘制单元之后的这个标签来指明使用的材质。材质名称必须和外部定义的.mtl文件名称匹配。

usemtl [material name]
  ...

objects名称和多边形group标签

o [object name]
  ...
  g [group name]
  ...
  • Group声明用于组织模型的单元(element)以及简化数据操作
  • Object声明用于标识在一个文件中的不同object单元
    所有的group声明都是基于状态的。依旧是一旦声明了group,将应用于所有之后的内容,直到下一个group 声明。
    通过Smoothing Group可以实现多边形平滑渲染。
s 1
  ...
  # Smooth shading can be disabled as well.
  s off
  ...

单个obj文件中可以包含多个object标签或group标签。
其中,o标签和g标签仅仅是在组织上进行分组而存在的,例如一个o标签下,可能包含多个g,或者一个g开头的顶点数据集合之后包含多个g组织描述的三角面。也有将usemtl标签作为网格分组的,原因是考虑了同一组网格使用了相同的纹理。但有个不方面的地方就是对于需要单个控制的地方,略显不便。例如一个o或者g标签的数据集合表示人脸,之后眼睛,耳朵,鼻子等五官分作不同的g来组织,使用同一个纹理。采用usemtl分组的话,如果想对眼睛,嘴巴,等进行单独变换的时候很不方便。因此,本人还是采用g来进行网格划分。
通常处理obj文件的时候,会抛弃顶点法线数据,而通过顶点信息来进行计算。有了以上的顶点坐标、法线、纹理坐标等信息,就可以进行3D模型文件的渲染了。
下面是一个简单3D模型的光照效果。猛戳代码

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容