3D OBJ文件格式

简介

OBJ(或称.obj)是一种简单的3D模型文件格式,由Wavefront公司开发,适用于各种3D软件模型之间转换,绝大多数3D软件支持该模型,如3DS Max、Maya等.

OBJ文件仅包含3D几何数据,即每个顶点位置(xyz坐标)、纹理贴图位置(UV坐标)、顶点法向量,由顶点列表定义的多边形的面(三角形). 顶点默认以顺时针顺序存储,因此没必要显示声明面法线. OBJ文件没有单位,但能包含人类可读的注释行中包含比例信息.

OBJ文件内容可以是ASCII格式(.obj)或二进制格式(.mod)。本文介绍ASCII格式的.obj文件. obj文件格式支持多边形对象、自由形式对象. 多边形几何体用点、线、面定义对象,自由形式几何体用曲线和曲面.

文件格式

文件结构

OBJ文件结构有以下数据类型:

1)顶点数据

  • 几何顶点(v)
  • 纹理顶点(vf)
  • 顶点法向量(vn)
  • 参数空间顶点(vp)

2)自由形式曲线/曲面属性

bmatrix,贝塞尔,B-样条,基数,泰勒(cstype)

  • 度(deg)
  • bmatrix(bmat)(basis matrix,基矩阵/基础矩阵)
  • 步长(step)

3)元素

  • 点(p)
  • 线(l)
  • 面(f)
  • 曲线(curv)
  • 2D曲线(curv2)
  • 表面(surf)

4)自由形式曲线/表面本体描述

  • 参数值(parm)
  • 外部裁剪环(trim)
  • 内部裁剪环(hole)
  • 特殊曲线(scrv)
  • 特殊点(sp)
  • 结束语句(end)

5)自由形式表面间的连接

6)分组

  • 分组名(g)
  • 平滑组(s)
  • 合并组(mg)
  • 对象名(o)

7)展示/渲染属性

  • 斜面插值(bevel)
  • 颜色插值(c_interp)
  • 溶解插值(d_interp)
  • 详细程度(lod)
  • 材料名称(usemtl)
  • 材料库(mtllib)
  • 阴影投射(shadow_obj)
  • 光线追踪(trace_obj)
  • 曲线近似技术(ctech)
  • 表面近似技术(stech)

然而最常用的的元素是几何顶点、纹理坐标、顶点法向量、多边形面. 因此本文不解读每个数据类型,主要介绍常用的. 如果想了解每个类型,请参考OBJ文件规格书B1. Object Files (.obj)

下图展示这些类型数据如何在一个典型的.obj文件中组合到一起:

img

注释

注释是给人看的,不会被处理. 注释以行为单位,"#"作为开头标记.

e.g.

# this is a comment

顶点数据(Vertex data)

顶点数据提供坐标:

  • 几何顶点(v)
  • 纹理顶点(vt)
  • 顶点法向量(vn)

对于自由形式对象,顶点数据也提供:

  • 参数空间顶点(vp)

4种类型顶点坐标系均符合右手规则.

4种顶点信息如下:

# List of geometric vertices, with (x,y,z,[w]) coordinates, w is optional and defaults to 1.0.
v -5.000000 5.000000 0.000000
v -5.000000 -5.000000 0.000000
v 5.000000 -5.000000 0.000000
v 5.000000 5.000000 0.000000
# List of texture coordinates, in (u,[v,w]) coordinates, this will vary between 0 and 1. v, w are optional and default to 0.
vt -5.000000 5.000000 0.000000
vt -5.000000 -5.000000 0.000000
vt 5.000000 -5.000000 0.000000
vt 5.000000 5.000000 0.000000
# List of vertex normals in (x,y,z) form; normals might not be unit vertors.
vn 0.000000 0.000000 1.000000
vn 0.000000 0.000000 1.000000
vn 0.000000 0.000000 1.000000
vn 0.000000 0.000000 1.000000
# Parameter space vertices in (u,[v,w]) form; free form geometry statement
vp 0.210000 3.590000
vp 0.000000 0.000000
vp 1.000000 0.000000
vp 0.500000 0.500000

坐标语法

v x y z [w]

多边形和自由形式几何体描述. 指定几何顶点及其xyz坐标. 有理(rational)曲线和表面要求第四个齐次坐标,即weight(权重,简写w).

x,y,z定义顶点的3D空间坐标,浮点数. w是weight,默认1.0.

vp u [v w]

自由形式几何体描述. 在曲线或曲面的参数空间中指定一个点.

用法决定了需要多少坐标. 曲线的特殊点需要在曲线的参数空间中有一个1D控制点(u). 曲面的特殊点需要在曲面参数空间中的2D点(u、v). 非有理(non-rational)修剪曲线的控制点需要u和v坐标. 有理修剪曲线的控制点需要u、v和w坐标(默认1.0).

vn i j k

多边形和自由形式几何描述. i、j、k指定法向量,浮点数.

对于多边形,顶点法线替代实际的面法线;对于曲面,顶点法线在整个曲面上插值,替换实际的分析曲线法线.

vt u [v w]

多边形和自由形式几何体的顶点描述. 指定顶点纹理及其坐标. 纹理坐标:1D纹理要求u(水平方向),2D纹理要求u、v(垂直方向),3D纹理要求3个. v、w(深度)默认0.

指定自由形式曲线、曲面

指定自由形式曲线(curves)/曲面(surfaces)涉及3步:

1) 用自由形式曲线、曲面属性指定其类型(bmatrix、Bezier、B-样条、Cardinal或Taylor)
2)用元素说明描述曲线或曲面
3) 用自由形式曲线、曲面体说明提供额外信息

自由形式的曲线、曲面属性:

  • 所有曲线和曲面都需要数据类型,由cstype语句提供
  • 所有曲线和曲面都需要度数据,由deg语句提供
  • bmatrix曲线或曲面需要bmat语句
  • bmatrix曲线或曲面也需要步长,由step语句提供

元素:

  • 所有曲线和曲面需要控制点,控制点在curve、curv2或surf语句中引用
  • 3D曲线和曲面需要参数范围,分别在curve和surf语句中给出

自由形式曲线/曲面体语句:

错误检查

开始读取obj文件时,上面一组数据可能是空的,无默认值. 读取文件时,会遇到一些语句,累积信息,并且报告一些错误.
当遇到结束语句时,将执行以下错误检查,这些检查涉及各种语句之间的一致性:

  • 提供所必需的信息
  • 控制点的数量、参数值的数量(knots)和degree,与曲线或曲面类型一致. 如果类型是bmatrix,则步长也一致
  • 如果类型是bmatrix,阶数(degree)是n,bmatrix大小(n+1)×(n+1)

自由形式曲线、曲面属性

支持5种类型自由形式几何体:
1)Bezier(贝塞尔曲线)
2)basis matrix(基矩阵)
3)B-样条
4)Cardinal(一种平滑插值的样条曲线)
5)Taylor

只能将这些类型应用于曲线和曲面. 5种类型可以是有理的或非有理的.

除了指定类型外,你必须定义曲线或曲面的degree(阶数).对于基矩阵曲线和曲面元素,必须指定基矩阵和步长.

所有自由形式曲线和曲面属性语句都是状态设置的. 意味着一旦设置了属性语句,它就会应用于后面的所有元素,直到它重置为不同值.

指定属性的语法

cstype [rat] type

自由形式几何体语句. 指定曲线或曲面的类型,有理或非有理形式.

rat: 可选参数. 指定曲线或曲面类型的有理形式. 如果未出现,则表示曲线或曲面为非有理的.
type: 指定曲线或曲面类型. 支持类型:

type 含义 中文
bmatrix basis matrix 基矩阵
bezier Bezier 贝塞尔曲线
bspline B-spline B-样条
cardinal Cardinal 一种平滑插值的样条曲线
taylor Taylor 泰勒

无默认值,必须提供值.

deg degu [degv]

自由形式语句. 设置曲线、曲面的多项式次数(degree).

degu: u方向degree. 曲线、曲面都需要.
degv: v方向degree. 仅曲面需要. 对于Bezier,B-样条、泰勒和基矩阵,没有默认值,必须提供值;对于Cardinal,degree恒为3(其他值忽略).

# deg 语句必须在bmat语句前, 矩阵大小必须适合degree
bmat u matrix
bmat v matrix

自由形式几何体语句. 设置基矩阵用于基矩阵曲线、曲面. u、v值必须在各自的bmat语句中指定.

u: 指定u方向的基矩阵
v: 指定v方向基矩阵
matrix: 列出基矩阵内容,列表j变化最快. 如果n是给定u或v方向的阶数,则矩阵(i,j)大小应为(n+1)×(n+1).

无默认值,须提供.

step stepu stepv

自由形式几何体. 用基矩阵设置曲线、曲面的步长.
stepu: u方向步长. 曲线、曲面都需要它.
stepv: v方向步长. 仅适用于使用基矩阵的曲面.

无默认值,须提供.

tips: 样条曲线中,根据控制点按步长间隔生成曲线/曲面的点.

对于控制点、阶数、步长的关系,举例说明. 假设给定k个控制点的曲线:

\[{v_1,...,v_k} \]

如果曲线阶数n,那么每个多项式段就需要n+1个控制点.因为由n阶多项式描述的样条曲线,从0次幂到n次幂共有n+1个系数,需要通过n+1控制点对应方程求解.

如果步长s,那么第i个多项式段(从0开始)将使用控制点:

\[{v_{is+1},...,v_{is+n+1}} \]

示例

  1. 用基矩阵创建三次贝塞尔曲面
cstype bmatrix
deg 3 3
step 3 3
bmat u 1 -3 3 -1 \
       0 3 -6 3 \
       0 0 3 -3 \
       0 0 0 1
bmat v 1 -3 3 -1 \
       0 3 -6 3 \
       0 0 3 -3 \
       0 0 0 1
  1. 用基矩阵创建哈密特曲线
cstype bmatrix
deg 3
step 2
bmat u 1 0 -3 2 0 0 3 -2 \
       0 1 -2 1 0 0 -1 1
  1. 用基矩阵创建u方向Bezier、v方向B-样条的曲面
cstype bmatrix
deg 3 3
step 3 1
bmat u 1 -3 3 -1 \
       0 3 -6 3 \
       0 0 3 -3 \
       0 0 0 1
bmat v 0.16666 -0.50000 0.50000 -0.16666 \
       0.66666 0.00000 -1.00000 0.50000 \
       0.16666 0.50000 0.50000 -0.50000 \
       0.00000 0.00000 0.00000 0.16666

元素

多边形几何体支持3种元素类型:

  • 线

自由形式几何体支持3种元素类型:

  • 曲线
  • 曲面上的2D曲线
  • 曲面

所有元素可自由混合.

引用顶点数据

对于所有元素,引用编号用于标识几何体顶点、纹理顶点、顶点法向量、参数空间顶点.

这些顶点的类型都单独编号,从1开始,第二个是2,以此类推.
e.g. 文件中,第一个纹理顶点编号1,第二个编号2,... 编号连续,贯穿整个文件,即使被其他(类型)数据分隔,编号也会继续.

除了向下计数,还可以从元素的位置向上计数列表中的顶点,表示相对位置. 此时,参考数为负数.
e.g. -1表示元素正上方顶点,-2表示往上数的2个参考.

引用顶点分组

一些元素,如面、曲面,可能有引用顶点数据的三元组编号,用于几何体顶点、纹理顶点、顶点法向量. 引用编号按顺序排列,用“/”间隔,编号与斜杠间无间隔.

引用编号顺序:

1)几何顶点
2)纹理顶点,跟在第1个斜杠后
3)顶点法线,跟在第2个斜杠后

一行可能有多个“几何体顶点/纹理顶点/顶点法向量”,如:

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

解读:

f v/vt/vn v/vt/vn v/vt/vn v/vt/vn

tips: 这里的数字是引用了对应类型顶点的编号,如2/2/2代表文件中第2个几何体顶点、第2个纹理顶点、第2个顶点法向量.

问题:为什么f后面有时3组数据,有时4组数据?
f后面有几组数据,则该面(face)代表几边形,如3组数据代表三角形,4组数据代表四边形.

问题:如果只有几何体顶点、顶点法向量,没有纹理顶点呢?
使用2个连续的斜杠(//):

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

但三元组的风格必须保持一致,不能部分指定顶点法向量而另一部分不指定. 非法描述:

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

引用顶点组语法

p v1 [v2 v3] ...

多边形几何体语句. 指定(几何体)点元素及其顶点(from 顶点列表). 可用该语句指定多个点. 虽然点不能被着色或渲染,但能用于其他高级可视程序.

v: 点元素的顶点引用编号,每个点元素对应一个顶点. 正值表示绝对顶点编号,负值表示相对顶点编号.

l v1[/vt1] v2[/vt2] v3[/vt3] ...

多边形几何体语句. 指定一条直线及其顶点引用编号. 纹理顶点引用编号可选.

v: 直线上顶点的引用编号. 一条直线最少2个顶点,最大值无限制. 正值代表绝对顶点编号,负值代表相对顶点编号.

vt: 可选. 直线元素的纹理顶点的引用编号.

f v1[/vt/vn1] v2[/vt2/vn2] v3[/vt3/vn3] ...

多边形几何体语句. 指定面元素及其顶点引用编号.

v: 面元素中的顶点的引用编号. 一个面最少需要3个顶点.

vt: 可选. 面元素中纹理顶点的引用编号. 跟在第1个斜杠后.

vn: 面元素中顶点法向量的引用编号. 跟在第2个斜杠后.

面元素用曲面法向量指示其朝向. 如果顶点围绕面按逆时针顺序排列,则面和法向量都将指向观察者. 如果顶点顺时针排列,则远离观测者. 如果指定顶点法向量,则它们应指向表面法向量的大致方向,否则可能导致不可预测行为.

在语句中,如果面分配了纹理图,并且没有分配纹理顶点,则纹理图在渲染时将被忽略.

curv u0 u1 v1 v2 ...

自由形式几何体元素语句. 指定一条曲线的参数范围、控制点. 曲线不能被着色或渲染,但能用于其他高级可视程序.

u0: 曲线的起始参数值,浮点型.

u1: 曲线的结束参数值,浮点型.

v: 控制点的顶点引用编号. 可指定多个控制点,最少2个.

对于非有理曲线,控制点必须是3D的;对于有理曲线,控制点是3D或4D的. 第4个坐标(weight)默认1.0.

curv2 vp1 vp2 [vp3 ...]

自由形式几何体语句. 指定曲面上的2D曲线及其控制点.

vp: 控制点的参数顶点引用编号. 可指定多个控制顶点. 2D曲线最少要求2个.

控制点是参数顶点,因为曲线必须位于一些曲面的参数空间. 对于非有理曲线,控制顶点是2D的;对于有理曲线,控制点是2D或3D的. 第4个坐标(weight)默认0.

surf s0 s1 t0 t1 v1[/vt1/vn1 v2/vt2/vn2] ...

自由形式几何体的元素语句. 指定曲面的参数范围、控制点. 在u方向s0-s1、v方向t0-t1的全局参数范围内评估曲面.

s0: 曲面在u方向的起始参数值

s1: u方向的结束参数值

t0: v方向的起始参数值

t1: v方向的结束参数值

v: 曲面中控制点的引用编号

vt: 可选参数. 曲面中的纹理顶点的引用编号.

vn: 可选参数. 曲面中顶点法向量的引用编号.

对于非有理曲面,控制点是3D的;对于有理曲面,控制点是3D或4D的. 第4个坐标(weight)默认1.0.

多边形几何体示例

自由形式几何体,参见下一节.

  1. 正方西

逆时针顺序给出正方形4顶点(面对于顶点顺序):

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
  1. 立方体

8个点6个面,注意面的朝向(顶点顺序)

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
f 1 2 3 4
f 8 7 6 5
f 4 3 7 8
f 5 1 4 8
f 5 6 2 1
f 2 6 7 3

这里的顶点是共享的

  1. 负引用编号的立方体

顶点是不共线的,每个面指定的是相对位置的顶点

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
f -4 -3 -2 -1
v 2.000000 2.000000 0.000000
v 2.000000 0.000000 0.000000
v 0.000000 0.000000 0.000000
v 0.000000 2.000000 0.000000
f -4 -3 -2 -1
v 2.000000 2.000000 2.000000
v 2.000000 0.000000 2.000000
v 2.000000 0.000000 0.000000
v 2.000000 2.000000 0.000000
f -4 -3 -2 -1
v 0.000000 2.000000 0.000000
v 0.000000 2.000000 2.000000
v 2.000000 2.000000 2.000000
v 2.000000 2.000000 0.000000
f -4 -3 -2 -1
v 0.000000 2.000000 0.000000
v 0.000000 0.000000 0.000000
v 0.000000 0.000000 2.000000
v 0.000000 2.000000 2.000000
f -4 -3 -2 -1
v 0.000000 0.000000 2.000000
v 0.000000 0.000000 0.000000
v 2.000000 0.000000 0.000000
v 2.000000 0.000000 2.000000
f -4 -3 -2 -1

自由形式曲线、曲面本体语句

可指定自由形式曲线、曲面元素的额外信息,称为本体语句(body statements).

可指定的值有:

  • 参数(parameter)
  • 节点向量(knot vector)
  • 外部裁剪环(trimming loop)
  • 内部裁剪环(hole)
  • 特殊曲线(special curve)
  • 特殊点(special point)

这部分较少使用,详情略. 可参见OBJ文件规格书(B1. Object Files (.obj)).

分组

4种语句帮助处理分组(group)元素:

  • 分组名语句用于组织元素集合,简化模型中的数据处理
  • 平滑组语句允许你识别要插值法向量的元素,以使这些元素具有平滑、非分面(non-faceted)的外观. 这是一种指定顶点法向量的快速方法
  • 合并组语句用于识别应检查邻接检测的自由形式元素. 你也可以用合并组将那些距离足够近而被视为相邻但不应合并的表面.
  • 对象名语句允许你在单文件中为整个对象赋予名字.

所有分组语句都是状态设置的(state-setting). 一旦设置分组语句,将应用到接下来所有元素,直到下一个分组语句.

示例(部分):展示了属于3个分组中的一个单元素分组. 平滑组处于禁用状态

g square thing all
s off
f 1 2 3 4

示例:展示合并组1中合并分辨率为0.5的2个曲面

mg 1 .5
surf 0.0 1.0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
surf 0.0 1.0 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32

tips: 前面讲过,surf语句指定曲面的参数范围、控制点.

分组语法

g group_name1 [group_name2 ...]

自由形式几何体语句. 为接下来的语句指定分组名. 一行可以有多个分组名,后面数据属于所有组.

group_name: 分组名,可以是字母、数字或者它们的结合. 默认为"default".

s group_number

多边形和自由形式几何体语句. 为接下来的元素设置平滑组. 如果不想用平滑组,设置为off或赋值0.

如果要在Model和PreView中显示平滑着色,在赋值平滑组后,你必须创建顶点法向量(建模软件或vn语句).

用图像渲染时,为了平滑多边形几何体,只需要将元素放入某个平滑组中即可. 然而,顶点法线会覆盖不同的平滑组.

group_number: 平滑分组编号. 关闭平滑分组,使用0值或off. 多边形元素用分组编号将元素放入不同的平滑分组.

对于自由曲面,可以启用或关闭平滑分组;大于0的值之间没有差异.

mg group_number res

自由形式几何语句. 为后面的自由曲面设置合并组和合并分辨率. 如果你不想用合并组,指定off或值0.

邻接检测(adjacency detection)仅在组内执行,而不在组间执行. 不允许不同合并组之间的曲面之间存在连接.同一合并组中的曲面沿着距离res以内的边合并一起.

group_number: 合并组编号. 关闭邻接检测,用值0或off.

res: 要合并到一起的2个曲面之间的最大距离. 该值必须>0,仅当使用合并组时该参数是必须的.

o object_name

多边形和自由形式几何体语句. 可选. 任何Wavefront程序都不会处理它. 它在该语句后定义的元素,指定用户定义的对象名称.

object_name: 用户定义对象名. 无默认值.

分组示例

  1. 带组名的立方体

立方体的每个面放在单独的组中,所有元素属于group cube

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 vertices

g front cube
f 1 2 3 4
g back cube
f 8 7 6 5
g right cube
f 4 3 7 8
g top cube
f 5 1 4 8
g left cube
f 5 6 2 1
g bottom cube
f 2 6 7 3
# 6 elements

tips: 前面讲过,g语句可以支持多个组名,后面的元素归属该行所有分组.

  1. 一个平滑分组的2个相邻正方形

2个相邻正方形共享一条边. 正方形放置在平滑分组,以确保用图像渲染时,公共边将会被平滑处理.

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
# 6 vertices

g all
s 1
f 1 2 3 4
f 4 3 5 6
# 2 elements
  1. 有顶点法向量的2个相邻正方形

2个正方形共享一条边. 添加顶点法向量到正方形的每个角,确保公共边在Model和PreView中显示以及用图像渲染时将平滑.

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

显示/渲染属性

显示、渲染属性描述对象在Model和PreView显示或用图像渲染时的外观.

一些属性应用到自由形式几何体,例如材质名称和库,光线追踪,以及阴影投射. 插值属性仅适用于自由形式几何体.

下图展示对多边形和自由形式几何体可用的显示和渲染语句:

polygonal only polygonal or free-form free-form only
bevel lod ctech
c_interp usemtl stech
d_interp mtllib
shadow_obj
trace_obj

所有显示和渲染语句是状态设置的. 也就是说,一旦设置,将应用到所有元素,除非重置为不同值.

显示/渲染属性语法

bevel on/off

多边形几何体语句. 启用/禁用倒角插值(bevel interpolation). 仅适用于倒角对象,即边由斜面分隔的对象. 倒角插值使用法向量插值给平面提供圆度的错觉,不会影响非斜切面的平滑.

倒角:把棱角切削成斜面.

on: 启用
off: 禁用. 默认off.(下同)

c_interp on/off

多边形几何体语句. 启用/禁用颜色插值.

颜色插值在给定顶点的材质之间创建多边形曲面上的混合. 这将在面元素上创建颜色的混合.

为支持颜色插值,必须按顶点而非按元素指定材质.附加到多边形的顶点的所有材质的照明模型必须相同. 颜色插值适用于环境光(Ka)、漫反射(Kd)、镜面反射(Ks)和镜面高光(Ns)材质特性的值.

d_interp on/off

多边形几何体语句. 启用/禁用溶解插值(dissolve interpolation).
溶解插值在指定多边形顶点的材质的溶解(d)值之间创建一个插值或混合. 该功能用于创建显示不同程度的表观透明度的效果,如在玻璃或云中.

为支持溶解插值,材质必须按顶点指定而不是元素. 溶解插值中,所有指定顶点的材质必须包含一个溶解因子命令以指定溶解.

lod level

多边形和自由形式几何体语句. 设置PreView动画中显示的细节级别. 详细级别功能允许你控制在PreView中显示哪个对象的元素.

level: 显示的细节级别. 0或省略lod语句,所有元素将显示. 1~100之间整数.

maplib filename1 [filename2 ...]

渲染标识符,为用usemap标识符设置的纹理贴图定义而指定图库文件. 你能用maplib指定多个文件. 如果指定了多个文件,为贴图定义从第一个到最后一个搜索.

当你用Model程序指定图库时,Model只允许每个.obj文件有一个图库. 可用用文本编辑器指定多个库.

filename: 纹理贴图所在库文件名字. 无默认值.

usemap map_name/off

渲染标识符,为接下来的元素指定纹理贴图名. 如果禁用纹理贴图,指定off.

如果为一个没有纹理顶点的面指定了纹理贴图,该纹理贴图将会被忽略.

map_name: 纹理贴图名.
off: 禁用纹理映射. 默认值off

usemtl material_name

多边形和自由形式几何体语句. 为接下来元素指定材质名. 一旦指定材质,它将不能被禁用,只能被改变.

material_name: 材质名. 如果没有指定,则用白色材质.

mtllib filename1 [filename2 ...]

多边形和自由形式几何体语句. 为由usemtl语句设置的材质定义而指定材质库文件. 你能用mtllib指定多个文件. 如果指定了文件名,则为了材质定义从第一个到最后一个搜索.

当你用Model程序指定一个材质库时,每个.obj文件仅允许一个材质库. 你能用文本编辑器指定多个库.

filename: 库文件名. 无默认值.

shadow_obj filename

多边形和自由形式几何体语句. 指定阴影对象文件名. 该对象用于为当前对象投射阴影. 阴影仅在渲染图像中可见,硬件着色(hardware shading)中不可见. 除了阴影之外,阴影对象不可见.

只有在对象有阴影对象时,它才会投射阴影. 可以将对象当作自己的阴影对象. 然而,对于阴影对象,通常首选原始对象的简化版本,因为阴影投射将会大大增加渲染时间.

filename: 阴影对象文件名. 可以是任何有效的对象文件名,.obj 或.mod文件. 如果无扩展名,则默认.obj.

一个文件中只能存储一个阴影对象. 如果指定了多个,则将最后一个有效.

trace_obj filename

多边形和自由形式几何体语句. 指定光线追踪对象文件名. 该对象文件用于在反射表面生成当前对象的反射. 反射仅在渲染图像中可见,硬件着色中不可见.

只有当对象有跟踪对象时,它才会出现在反射中. 能将对象用作自己的追踪对象. 然而,对于追踪对象,初始对象的简化版通常是追踪对象首选,因为光线追踪能极大地增加渲染时间.

filename: 光线追踪对象的文件名. 支持.obj和.mod,如果没有指定扩展名,默认.obj.

如果指定多个,则最后一个有效.

ctech technique resolution

自由形式几何体语句. 指定曲线近似计技术(technique). 参数指定曲线的计数和分辨率.

3种technique:

  1. ctech cparm res

用一个分辨率参数指定具有恒定参数细分的曲线. 曲线的每个多项式段在参数空间中被细分n次,其中n = res × 曲线阶数.

res: 分辨率参数. 值越大,分辨率越高. 如果res为0,则每个多边形曲线段由单个线段表示.

  1. ctech cspace maxlength

指定常量空间细分曲线. 曲线由一系列线段近似,这些线段长度在实际空间中 ≤ maxlength.

maxlength: 线段的最大长度. 值越小,分辨率越高.

  1. ctech curv maxdist maxangle

用单独的分辨率为最大距离和最大角度指定依赖于曲率的细分.
曲线由一系列线段近似,其中,
1)对象空间中,线段和实际曲线之间的距离必须小于maxdist;
2)线段末端的切向量之间的角度必须小于maxangle.

maxdist: 线段和实际曲线之间在实际空间中的距离

maxangle: 线段端点的切向量间的角度(度为单位)

maxdist和maxangle越小,分辨率越高.

stech technique resolution

自由形式几何体语句. 参数为曲面指定技术和分辨率.

可选择:

  1. stech cparma ures vres

u方向和v方向的单独分辨率参数指定具有恒定参数细分的曲面. 曲面的每个面在参数空间中被细分n次,其中n是分辨率参数 × 曲面的阶数

ures: u方向分辨率

vres: v方向分辨率

ures、vres越大,分辨率越高. 如果ures、vres都为0,则每个面片近似为2个三角形.

  1. stech cparmb uvres

指定具有恒定参数细分的曲面,并在u方向、v方向用一个分辨率参数细化.
仅用修剪曲线上的点执行初始三角测量. 然后对该三角测量进行细化,直到所有边都具有合适长度. 生成的三角形不会像cparma技术那样沿等参数线(isoparametric lines)定向.

uvres: u、v方向的分辨率参数. 值越大,分辨率越高

  1. stech cspace maxlength

指定具有恒定空间细分的曲面.

曲面被细分为矩形区域,直到任何矩形边在实际空间中的长度 < 最大长度. 然后,对这些矩形区域进行三角形化.

maxlength: 任意矩形边在实际空间中的长度. 值越小,分辨率越高.

  1. stech curv maxdist maxangle

用单独的分辨率参数为最大距离和最大角度指定具有曲率相关的细分曲面.

曲面细分为矩形区域,直到
1)近似矩形和实际表面间的真实空间中的距离 < maxdist(近似),并且
2)矩形拐角处的曲面法线之间的角度(以度为单位) < maxangle. 细分后,将对区域进行三角测量.

maxdist: 真实空间中近似矩形和实际曲面的距离

maxangle: 矩形拐角处的曲面法向量的角度(度为单位)

值越小,分辨率越高

显示/渲染属性示例

  1. 带材质的立方体

立方体每个面有不同材质

# 指定材质库, .mtl是材质库文件
mtllib master.mtl

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 vertices

# 定义分组front
g front
# 指定材质名
usemtl red
# 定义面
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
  1. 立方体投射阴影

当用图像渲染时,立方体在别的物体上投射阴影. 存储在cube.obj中的立方体,引用自己为阴影对象.

mtllib master.mtl
# 指定阴影对象文件为自身
shadow_obj cube.obj

# 顶点、分组定义同上面的例子
...
  1. 立方体投射反射

当用图像渲染时,立方体将其反射投射到任何可反射物体上. 存储在cube.obj中的立方体,引用自身为追踪对象.

mtllib master.mtl
# 指定光线追踪对象文件
trace_obj cube.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 vertices

# 顶点、分组定义同上面的例子
...
  1. 纹理映射的正方形

1x1纹理贴图映射到2x2正方形. 拉伸纹理以完全适合正方形.

# 指定材质库
mtllib master.mtl

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 wood
f 1/1 2/2 3/3 4/4
# 1 element

.mtl文件是用于.obj文件的材质库文件,可用于定义多种材质. 可定义材质对环境光、漫反射、镜面反射系数,透明度、光泽度等. 详见:Material_template_library | Wiki以及MTL Files Material Definitions for OBJ Files

注:有关自由形式曲线、曲面类型的数学知识,略. 参见原官方文档.

参考

Wavefront .obj file | Wiki

Material Definitions for OBJ Files

B1. Object Files (.obj)

posted @ 2024-01-26 14:27  明明1109  阅读(257)  评论(0编辑  收藏  举报