为了研究三维模型的轻量化技术,首先来学习一下obj文件,参考了不少资料后,写下来方便自己查阅,同时也可以帮助到有需要的朋友。
obj文件是一种非常标准的3D模型文件格式,在各种3D模型软件中的互通互导性都非常强,同时也支持一些游戏引擎的读写。下面来详细介绍一下obj文件格式的一些具体知识吧。
obj文件不需要任何一种文件头(File Header),文件开头通常是注释掉的几行文本说明信息,注释符号是哈希字符‘#’。
空格和空行可以随意加到文件中以增加文件的可读性。有字的表明此行的数据类型。多行可以逻辑地连接在一起表示一行,方法是在每一行最后添加一个连接符 ‘\’(斜杠)。
一个obj格式的文件可能包含了顶点数据,自由形式的曲面/表面属性,绘制索引序列,自由形式的曲面/表面内容声明,关联自由形式的表面,组和渲染属性信息。大多数常见的绘制索引主要是几何顶点,纹理坐标,顶点法线以及多边形的面等。
v 几何体顶点 (Geometric vertices)
vt 贴图坐标点 (Texture vertices)
vn 顶点法线 (Vertex normals)
vp 参数空格顶点 (Parameter space vertices)
deg 度 (Degree)
bmat 基础矩阵 (Basis matrix)
step 步尺寸 (Step size)
cstype 曲线或表面类型 (Curve or surface type)
p 点 (Point)
l 线 (Line)
f 面 (Face)
curv 曲线 (Curve)
curv2 2D曲线 (2D curve)
surf 表面 (Surface)
parm 参数值 (Parameter values )
trim 外部修剪循环 (Outer trimming loop)
hole 内部整修循环 (Inner trimming loop)
scrv 特殊曲线 (Special curve)
sp 特殊的点 (Special point)
end 结束陈述 (End statement)
con 连接 (Connect)
成组(Grouping):
g 组名称 (Group name)
s 光滑组 (Smoothing group)
mg 合并组 (Merging group)
o 对象名称 (Object name)
bevel 导角插值 (Bevel interpolation)
c_interp 颜色插值 (Color interpolation)
d_interp 溶解插值 (Dissolve interpolation)
lod 细节层次 (Level of detail)
usemtl 材质名称 (Material name)
mtllib 材质库 (Material library)
shadow_obj 投射阴影 (Shadow casting)
trace_obj 光线跟踪 (Ray tracing)
ctech 曲线近似技术 (Curve approximation technique)
stech 表面近似技术 (Surface approximation technique)
这是一个从3D Builder导出的名为ACAR.obj的文件(楼主做过一些改动,重新导入可能会出现错误,这里只是为了方便作为解释)。
#Exported from 3D Builder
o Object.1
v 36.451351 4.999999 13.781589 188 188 188
v 128.451355 68.897858 13.781589 188 188 188
v 0.000000 4.999999 13.781589 188 188 188
#............
o Object.2
v 22.295732 9.999998 27.563177 188 188 188
v 20.855162 9.999998 27.487680 188 188 188
v 18.036983 9.999998 26.888657 188 188 188
v 22.295732 9.999998 27.563177 188 188 188
#............
f 590 517 605
f 593 637 638
f 639 640 607
#...........
g default
v -0.500000 -0.500000 0.500000
v 0.500000 -0.500000 0.500000
vt 1.000000 4.000000
vt 2.000000 0.000000
vt 2.000000 1.000000
vt -1.000000 0.000000
vt -1.000000 1.000000
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
vn 0.000000 1.000000 0.000000
vn 0.000000 1.000000 0.000000
s off
g pACAR1
usemtl initialShadingGroup
f 1/1/1 2/2/2 4/4/3 3/3/4
f 3/3/5 4/4/6 6/6/7 5/5/8
f 5/5/9 6/6/10 8/8/11 7/7/12
f 7/7/13 8/8/14 2/10/15 1/9/16
f 2/2/17 8/11/18 6/12/19 4/4/20
f 7/13/21 1/1/22 3/3/23 5/14/24
按顺序来解释一下我这个obj文件吧。
“o (Object)”声明用于标识在一个文件中的不同object单元;
“v 36.451351 4.999999 13.781589 188 188 188”,v表示顶点坐标,前三个数分别表示xyz轴的坐标,后三个数为可选项,表示点的颜色;
“g default",所有的group声明都是基于状态的。一旦声明了group,将应用于所有之后的内容,直到下一个group 声明。
“vt 1.000000 4.000000”,代表点的贴图坐标;
“vn 0.000000 0.000000 1.000000”,代表点的法线;
“s off”,表示关闭光滑组;
“usemtl initialShadingGroup”,表示使用的材质;
“f 7/13/21”,顶点法线索引,索引号分别用左斜线(/)隔开,格式:“f v/vt/vn”;
这次的学习比较简单,有问题的话也非常欢迎读者朋友指出批评。通常处理obj文件的时候,会抛弃顶点法线数据,而通过顶点信息来进行计算。有了以上的顶点坐标、法线、纹理坐标等信息,就可以导入3D软件进行3D模型文件的渲染了。
这里非常感谢两位前辈所著,让我节省了不少时间,同时受益匪浅!
https://www.cnblogs.com/slysky/p/4081307.html
https://blog.csdn.net/m0_38068229/article/details/103424196