您的位置:首页 > 运维架构

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

2009-12-26 19:28 399 查看
<!--
/* 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
样条、Cardinal
、Taylor(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
命令为止。

#
材质red
由master.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中找到。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: