欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

3D模型--obj文件小知识

程序员文章站 2022-03-26 17:22:20
...

小小总结

为了研究三维模型的轻量化技术,首先来学习一下obj文件,参考了不少资料后,写下来方便自己查阅,同时也可以帮助到有需要的朋友。

简单介绍

obj文件是一种非常标准的3D模型文件格式,在各种3D模型软件中的互通互导性都非常强,同时也支持一些游戏引擎的读写。下面来详细介绍一下obj文件格式的一些具体知识吧。

obj文件的概念和特点介绍

  1. obj文件是一间名为Wavefront公司为其一个3D建模动画软件开发的文件格式,现已公开,得到广泛应用。
  2. obj文件是一种基于几何定义的文本文件,obj文件格式是一种简单的单独表示3D几何图元的文件格式——也就是,顶点的坐标,每个顶点纹理的UV坐标,顶点法向量,以及组成多边形的面的顶点坐标、以及纹理UV坐标序列。可以直接通过写字板或者记事本打开进行编辑操作
  3. obj文件目前的格式支持多边形(Polygon)直线(Lines)表面(Surfaces),和*形态曲线(Free-form Curves)。其中直线和多边形直接用点来描述,表面和曲线则根据于它们的控制点和依附于曲线类型的额外信息来定义,这些额外信息包括像贝塞尔(Bezier)曲线,B样条(B-spline),基数(Cardinal/Catmull-Rom样条),和泰勒方程(Taylor equations)等。
  4. obj文件是存储3D模型数据的文本文件,不包含面的颜色信息,也无法包含动画、材质特性、贴图路径、动力学、粒子等信息。

obj文件的基本结构

文件格式

obj文件不需要任何一种文件头(File Header),文件开头通常是注释掉的几行文本说明信息,注释符号是哈希字符‘#’

空格和空行可以随意加到文件中以增加文件的可读性。有字的表明此行的数据类型。多行可以逻辑地连接在一起表示一行,方法是在每一行最后添加一个连接符 ‘\’(斜杠)

一个obj格式的文件可能包含了顶点数据,*形式的曲面/表面属性,绘制索引序列,*形式的曲面/表面内容声明,关联*形式的表面,组和渲染属性信息。大多数常见的绘制索引主要是几何顶点,纹理坐标,顶点法线以及多边形的面等。

数据类型和关键字

顶点数据(Vertex data):

v 几何体顶点 (Geometric vertices)

vt 贴图坐标点 (Texture vertices)

vn 顶点法线 (Vertex normals)

vp 参数空格顶点 (Parameter space vertices)

*形态曲线(Free-form curve)/表面属性(surface attributes):

deg 度 (Degree)

bmat 基础矩阵 (Basis matrix)

step 步尺寸 (Step size)

cstype 曲线或表面类型 (Curve or surface type)

元素(Elements):

p 点 (Point)

l 线 (Line)

f 面 (Face)

curv 曲线 (Curve)

curv2 2D曲线 (2D curve)

surf 表面 (Surface)

*形态曲线(Free-form curve)/表面主体陈述(surface body statements):

parm 参数值 (Parameter values )

trim 外部修剪循环 (Outer trimming loop)

hole 内部整修循环 (Inner trimming loop)

scrv 特殊曲线 (Special curve)

sp 特殊的点 (Special point)

end 结束陈述 (End statement)

*形态表面之间的连接(Connectivity between free-form surfaces):

con 连接 (Connect)

成组(Grouping):

g 组名称 (Group name)

s 光滑组 (Smoothing group)

mg 合并组 (Merging group)

o 对象名称 (Object name)

显示(Display)/渲染属性(render attributes):

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)

obj文件的实例解释

这是一个从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