OpenGL系统设计-高级3D模型接口之OBJ模型(1)

<!-- /* Font Definitions */ @font-face {font-family:Courier; panose-1:2 7 4 9 2 2 5 2 4 4; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:黑体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimHei; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:1 135135232 16 0 262144 0;} @font-face {font-family:"/@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:"/@黑体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:1 135135232 16 0 262144 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; mso-pagination:none; font-size:10.5pt; mso-bidi-font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:宋体; mso-font-kerning:1.0pt;} h1 {mso-style-parent:""; mso-style-next:"标题 2"; margin-top:12.0pt; margin-right:0cm; margin-bottom:12.0pt; margin-left:21.6pt; text-align:justify; text-justify:inter-ideograph; text-indent:-21.6pt; mso-pagination:widow-orphan; page-break-after:avoid; mso-outline-level:1; mso-list:l0 level1 lfo1; tab-stops:list 21.6pt; font-size:16.0pt; font-family:Arial; mso-fareast-font-family:黑体; mso-bidi-font-family:"Times New Roman"; mso-font-kerning:0pt; mso-bidi-font-weight:normal;} h2 {mso-style-parent:""; mso-style-next:正文; margin-top:12.0pt; margin-right:0cm; margin-bottom:12.0pt; margin-left:28.8pt; text-align:justify; text-justify:inter-ideograph; text-indent:-28.8pt; mso-pagination:widow-orphan; page-break-after:avoid; mso-outline-level:2; mso-list:l0 level2 lfo1; tab-stops:list 28.8pt; font-size:12.0pt; font-family:Arial; mso-fareast-font-family:黑体; mso-bidi-font-family:"Times New Roman"; font-weight:normal;} h3 {mso-style-next:正文; margin-top:13.0pt; margin-right:0cm; margin-bottom:13.0pt; margin-left:36.0pt; text-indent:-36.0pt; line-height:173%; mso-pagination:lines-together; page-break-after:avoid; mso-outline-level:3; mso-list:l0 level3 lfo1; tab-stops:list 36.0pt; font-size:12.0pt; mso-bidi-font-size:16.0pt; font-family:"Times New Roman"; mso-fareast-font-family:黑体; mso-font-kerning:1.0pt; font-weight:normal; mso-bidi-font-weight:bold;} p.MsoBodyText, li.MsoBodyText, div.MsoBodyText {margin-top:0cm; margin-right:0cm; margin-bottom:6.0pt; margin-left:0cm; mso-pagination:none; font-size:10.5pt; mso-bidi-font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:宋体; mso-font-kerning:1.0pt;} p.MsoBodyTextFirstIndent, li.MsoBodyTextFirstIndent, div.MsoBodyTextFirstIndent {mso-style-update:auto; mso-style-parent:正文文本; mso-style-link:" Char Char"; margin:0cm; margin-bottom:.0001pt; text-indent:19.85pt; mso-pagination:none; font-size:10.5pt; font-family:"Times New Roman"; mso-fareast-font-family:宋体; mso-ansi-language:ZH-CN;} p.a, li.a, div.a {mso-style-name:正文(首行不缩进); margin:0cm; margin-bottom:.0001pt; line-height:150%; mso-pagination:none; mso-layout-grid-align:none; text-autospace:none; font-size:10.5pt; mso-bidi-font-size:10.0pt; font-family:"Times New Roman"; mso-fareast-font-family:宋体;} span.CharChar {mso-style-name:" Char Char"; mso-style-locked:yes; mso-style-link:正文首行缩进; mso-ansi-font-size:10.5pt; mso-bidi-font-size:10.5pt; font-family:宋体; mso-fareast-font-family:宋体; mso-ansi-language:ZH-CN; mso-fareast-language:ZH-CN; mso-bidi-language:AR-SA;} /* Page Definitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;} @page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:36.0pt; mso-footer-margin:36.0pt; mso-paper-source:0;} div.Section1 {page:Section1;} /* List Definitions */ @list l0 {mso-list-id:1666475049; mso-list-template-ids:-28945502;} @list l0:level1 {mso-level-style-link:"标题 1"; mso-level-text:%1; mso-level-tab-stop:21.6pt; mso-level-number-position:left; margin-left:21.6pt; text-indent:-21.6pt;} @list l0:level2 {mso-level-style-link:"标题 2"; mso-level-text:"%1/.%2"; mso-level-tab-stop:28.8pt; mso-level-number-position:left; margin-left:28.8pt; text-indent:-28.8pt;} @list l0:level3 {mso-level-style-link:"标题 3"; mso-level-text:"%1/.%2/.%3"; mso-level-tab-stop:36.0pt; mso-level-number-position:left; margin-left:36.0pt; text-indent:-36.0pt;} @list l0:level4 {mso-level-tab-stop:1.0cm; mso-level-number-position:left; margin-left:46.8pt; text-indent:-34.0pt;} @list l0:level5 {mso-level-text:%5); mso-level-tab-stop:1.0cm; mso-level-number-position:left; margin-left:46.8pt; text-indent:-34.0pt;} @list l0:level6 {mso-level-number-format:alpha-lower; mso-level-text:%6); mso-level-tab-stop:1.0cm; mso-level-number-position:left; margin-left:46.8pt; text-indent:-34.0pt;} @list l0:level7 {mso-level-number-format:roman-lower; mso-level-text:%7; mso-level-tab-stop:1.0cm; mso-level-number-position:left; margin-left:46.8pt; text-indent:-34.0pt;} @list l0:level8 {mso-level-text:"%1/.%2/.%3/.%4/.%5/.%6/.%7/.%8"; mso-level-tab-stop:72.0pt; mso-level-number-position:left; margin-left:72.0pt; text-indent:-72.0pt;} @list l0:level9 {mso-level-text:"%1/.%2/.%3/.%4/.%5/.%6/.%7/.%8/.%9"; mso-level-tab-stop:79.2pt; mso-level-number-position:left; margin-left:79.2pt; text-indent:-79.2pt;} ol {margin-bottom:0cm;} ul {margin-bottom:0cm;} -->

1.1        OBJ

这里的 OBJ文件不是我们常见的程序编译生产的目标文件,而是一种定义物体几何模型的 3D文件,最初是 Wavefront的标准 3D模型文件,后来被广泛应用到各种应用软件中。 OBJ文件可以是二进制文件,也可以是 ASCII文件,其中二进制格式文件的扩展名是 .mod ASCII格式文件的扩展名是 .obj

OBJ 文件支持多边形几何体和自由形状的几何体。多边形几何体使用点、线、面来表示物体,而自由形状几何体使用曲线、曲面来表示物体。

 

OBJ文件中数据的表达方式是

 

type data

 

type表示数据类型, data表示对应的数据。如 v 1.0 0.0 1.0就表示一个坐标点( 1.0, 0.0, 1.0)。 OBJ文件中可以包含以下数据类型,括号内是对应数据的命令名称。

 

1 、顶点数据

        几何顶点(v)

        纹理顶点(vt)

        顶点法向量(vn)

        参数空间顶点(vp)

2 、自由形状的曲线/ 曲面

        Bezier B 样条、CardinalTaylor(cstype)

        度数(deg)

        基准矩阵(bmat) 

        步长(step)

3 、基本元素

        (p)

        线(l)

        (f)

        曲线(curv)

        2 维曲线(curv2)

        曲面(surf)

4 、自由形状曲线/ 曲面语句   

        参数值(parm)

外部调整循环 (trim )

内部调整循环(hole )

特殊曲线 (scrv )

特殊点 (sp )

完成语句 (end )

自由形体面之间的连接 (con )

 

OBJ整个文件的结构包含

 

组名 (g )

光滑组(s )

合并组 (mg )

物体名 (o )

显示/ 渲染属性

斜角插值(bevel )

颜色插值 (c_interp )

淡入淡出插值 (d_interp )

细节级别 (lod )

材质名称 (usemtl )

材质库 (mtllib )

• shadow casting (shadow_obj )

光线跟踪 (trace_obj )

曲线逼近方法 (ctech )

曲面逼近方法 (stech )

 

下面我们再来举例说明 OBJ的文件格式。先看一个四边形的 OBJ文件 square.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 表示四个顶点坐标, f 表示多边形,最后一行表示一个有四个顶点的多边形。其顶点是顶点序号来表示的。 # 表示注释。 又如

# 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 的数据解释如下 vn 表示顶点法向量 g 表示 group all group 的名字。下面的两个 face 都属于这个 group,直到下一个 g 命令或者文件结束为止。 s 表示平滑组,而1是group all的序号。

在最后两行中 1//1中,第一个 1表示顶点序号,后一个 1表示顶点法向量序号,中间表示纹理向量序号,对应于由 vt 命令定义的各行。 2//2 3//3 4//4,含义一样。

接下来再看一个利用材质的例子 colorcube.obj文件。

# colorcube.obj

mtllib master.mtl       # OBJ 文件要用到一个材质文件master.mtl ,这个文件

# OBJ 文件在同一个目录下

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 个顶点

g front         # front ,到下一个g 结束

usemtl red      # 表示此后的物体使用名叫red 的材质,直到下一个usemtl 命令为止。

# 材质redmaster.mtl 定义

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

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

vt 0.000000 1.000000 0.000000

vt 0.000000 0.000000 0.000000

vt 1.000000 0.000000 0.000000

vt 1.000000 1.000000 0.000000

# 4 vertices

usemtl copper

f 1/1 2/2 3/3 4/4

 

master.mtl文件的内容是:

#master.mtl

newmtl red          # 定义一个名叫red 的材质
Ka 0 0 0            # Ka,Kd,Ks,illum,Ns
分别定义环境光、漫射光、镜面光、散射

                    # 光和#emission shiness 参数

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 copper

Ka 0.329412 0.223529 0.027451

Kd 0.780392 0.568627 0.113725

Ks 0.992157 0.941176 0.807843

Ns 27.897400

 

上面的几个例子涉及的是 OBJ文件中最基本的数据,其他的数据和命令的详细说明可以参考 OBJ文件规范。该规范文件可在所附的 CD-ROM中找到。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值