Graphic Basics 1 3D模型文件

Published at 2018-04-26

3D模型文件

obj格式

在Blender中以默认参数创建一个立方体,并直接将其导出为OBJ文件,其内容如下:

cube.obj

# Blender v2.79 (sub 0) OBJ File: ''
# www.blender.org
mtllib Cube.mtl
o Cube
v -1.000000 -1.000000 1.000000
v -1.000000 1.000000 1.000000
v -1.000000 -1.000000 -1.000000
v -1.000000 1.000000 -1.000000
v 1.000000 -1.000000 1.000000
v 1.000000 1.000000 1.000000
v 1.000000 -1.000000 -1.000000
v 1.000000 1.000000 -1.000000
vn -1.0000 0.0000 0.0000
vn 0.0000 0.0000 -1.0000
vn 1.0000 0.0000 0.0000
vn 0.0000 0.0000 1.0000
vn 0.0000 -1.0000 0.0000
vn 0.0000 1.0000 0.0000
usemtl None
s off
f 1//1 2//1 4//1 3//1
f 3//2 4//2 8//2 7//2
f 7//3 8//3 6//3 5//3
f 5//4 6//4 2//4 1//4
f 3//5 7//5 5//5 1//5
f 8//6 4//6 2//6 6//6

其中 v 开头的行为几何体顶点(Geometric vertices)数据,即这个立方体有8个顶点,其坐标的x,y,z值分别为每行对应的三个浮点数。

vn 开头的行为定点法线(Vertex normals)数据,三个浮点数表示其法线在x,y,z三个方向上的向量。

usemtl 指定了在这一行之后的元素使用的材质名称,这个名称定义在mtl文件中。

s off 表示关闭平滑着色(Smooth shading disabled)

f 表示一个面元素(Face Element),其后的数据格式为 v/vt/vn ,即顶点索引、顶点材质索引和顶点法线索引,vt和vn都可以省略。以第一行面元素为例,其由4个顶点按顺序组成,其索引分别为1,2,4,3,法线索引都为1,即法线方向都为(-1,0,0)

在上面的立方体文件中,因为Blender中创建立方体默认没有uv贴图坐标,所以没有以 vt 开始的行,在面元素描述时用 v//vn 省略。

维基百科: Wavefront .obj file

Three.js' ASCII JSON format.

使用Three.js提供的Blender插件io_three可以从Blender中导出用于Three.js的json格式文件。

导出一个默认的立方体如下:

Cube.json

{
    "vertices":[-1,-1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,1,1,-1,-1,1,1,-1],
    "uvs":[],
    "metadata":{
        "generator":"io_three",
        "uvs":0,
        "type":"Geometry",
        "vertices":8,
        "version":3,
        "normals":6,
        "faces":6
    },
    "normals":[-1,0,0,0,-2.98023e-08,-1,1,0,0,0,2.98023e-08,1,0,-1,2.98023e-08,0,1,-2.98023e-08],
    "faces":[33,0,1,3,2,0,0,0,0,33,2,3,7,6,1,1,1,1,33,6,7,5,4,2,2,2,2,33,1,0,4,5,3,3,3,3,33,4,0,2,6,4,4,4,4,33,7,3,1,5,5,5,5,5]
}

可以看出,其中metadata用来保存一些元信息,vertices,uvs,normalsfaces分别用一个一维数组来储存所有的数据。

faces中的33表示接下来是一个4个顶点的面,其后的5个元素中,前4个表示顶点的索引,第5个表示法线的索引。