3D文件格式之OBJ介绍

      在 instant-ngp 中使用NeRF时,保存的mesh可指定为obj,这里对obj文件格式进行说明。

      OBJ文件(.obj)包含有关3D对象的几何体的信息。OBJ文件可以支持无限的颜色(unlimited colors),一个文件可以定义多个对象。
      OBJ文件中的对象由多边形面(它们本身由顶点或点定义)和法线、曲线、纹理映射和曲面(polygon faces(which themselves are defined by vertexes, or points) and normals, curves, texture maps, and surfaces)定义.OBJ是一个矢量文件,它使定义的对象具有可伸缩性。没有最大文件大小限制。
      OBJ文件格式由Wavefront Technologies创建,用于定义、存储几何对象和3D数据。文件扩展名OBJ全称为Wavefront OBJect。
      在Windows、Mac或Linux上需要一个CAD或3D图形/建模程序查看、打开或编辑OBJ文件,可用于处理OBJ文件的软件如:Adobe Photoshop CC、Autodesk Maya、Blender、MeshLab、Microsoft 3D Viewer(3D 查看器)等。
      OBJ文件是一种文本文件,可以使用编辑器直接打开进行查看和编辑修改
      与其它3D文件格式相比,OBJ文件具有一些优势:
      (1).OBJ拥有庞大的用户群和支持系统;
      (2).OBJ具有简单的文件结构;
      (3).OBJ是开源的;
      (4).OBJ文件可以导入和导出到3D和CAD程序;
      (5).OBJ文件可以近似复杂的表面几何形状,而不需要很大的文件大小;
      (6).OBJ文件支持多种颜色;
      (7).OBJ文件包括位置,法线(normals)和UV(vt)数据,并允许精确的表面细分(surface subdivisions).

      一个OBJ文件由几个语句类型组成,当它们组合在一起时,就定义了一个3D对象。这些语句描述了形状(shapes)并将它们彼此定位:
      1.注释语句以#开头,该语言忽略#之后的任何内容,直到下一行。
      2.Vertex(顶点) data:顶点是面或多边形的角相交的点。顶点语句以v开头,包含以下内容:
      (1).三个必需变量: x,y和z;
      (2).一个可选变量: w;
      (3).变量值的范围为0到1,默认值为1.
      注意:
      (1).某些应用程序支持颜色;如果可用,请在变量后添加RGB值,颜色值的范围为0到1
      (2).如果为形状中的一个顶点定义了UV(vt)或顶点法线(vn),则必须为所有顶点定义它们。
      UV定义如何将3D模型映射到2D表面(例如计算机显示器),并确定如何将纹理应用到3D对象;它们有时被称为纹理(贴图)顶点(texture vertexes)。UV语句以vt开头,包含以下内容:
      (1).一个必需变量:u;
      (2).两个可选变量:v和w;
      (3).变量值的范围为0到1,默认值为0.
      顶点法线(vertex normal)通过指示光源的方向来定义阴影和亮度(shading and brightness)。顶点法线语句以vn开头,包含以下内容:
      (1).三个必需变量:x、y和z.
      参数空间顶点(parameter space vertices)是自由形式的曲线或表面(surface)属性/控制点。参数空间顶点语句以vp开头,包含以下内容:
      (1).三个必需变量:u、v和w;
      (2).使用u表示曲线点(curve points);
      (3).用u和v表示曲面点和非合理裁剪曲线控制点(use u and v for surface points and non-rational trimming curve control points);
      (4).使用u、v和w进行合理裁剪曲线控制点(use u, v, and w for rational trimming curve control points).
      3.Surface(曲面) data:自由形式曲线(free-form curve)或曲面类型包括基矩阵、贝塞尔曲线、B样条、基数曲线和泰勒曲线。定义包含如下内容:
      (1).度数(用deg表示);
      (2).基矩阵(用bmat表示);
      (3).步长(用step表示);
      (4).曲线类型(用cstype表示);
      (5).自由曲面之间的连接(用con表示).
      曲线或曲面主体的定义包含以下内容:
      (1).参数值(用parm表示);
      (2).外饰(outer trimming)(用trim表示);
      (3).内部修剪环(inner trimming loop)(用hole表示);
      (4).特殊曲线(用scrv表示);
      (5).特殊点(用sp表示);
      (6).结束语句(用end表示).

      4.Element data:可以包括的其它元素包括点(p)、线(l)、面(f)、曲线和2d曲线(分别为curv和curv2D)以及曲面(surf)。
      注意:
      (1).每个面(f)可以包含三个或更多顶点;
      (2).可以使用三个以上的顶点/纹理/法线索引来定义多边形。
      在描述一个面(f)的时候:
      (1).纹理坐标索引作为可选项用于描述该顶点相关的纹理坐标。为了描述纹理坐标索引,必须在顶点坐标索引之后紧接着添加一根斜线(/),之后再紧接着添加纹理坐标索引。在斜线的前后都不能有空格。
      (2).要添加顶点法线索引,必须在纹理索引之后添加第二根斜线(/),然后在之后添加法线索引。斜线前后不能有空格。
      (3).可以在定义几何图元的时候忽略纹理坐标索引,但是必须在顶点坐标索引后加上两根斜线(//),然后添加法线索引。
      5.Grouping data:你可以使用分组语句连接各种元素。组使用以下指示符,后面跟着名称来定义每个组:
      (1).Group name: g;
      (2).Smoothing group: s;
      (3).Merging group: mg;
      (4).Object name: o;
      6.Material Template Library(MTL, 材质模版库)files: OBJ文件不包含可视(颜色)信息,但是你可以通过引用支持文件将这些信息添加到OBJ文件中的对象中。材质模板库(.mtl)是一种广泛使用的ASCII文件格式,它决定OBJ文件中定义的对象如何使用Phong反射模型反射光线。

      注:以上内容全部来自网络整理,主要参考:https://www.marxentlabs.com/obj-files/

      以下是instant-ngp中将mesh保存为obj时的部分内容:

mtllib nerf.mtl
v 1.02146 -8.25844 -8.53257 0.690 0.659 0.674
v 1.06285 -8.25844 -8.53257 0.722 0.706 0.722
# v ...
vn -1.00000 0.00000 -0.00000
vn 1.00000 0.00000 0.00000
# vn ...
vt 0.00007 0.99991
vt 0.00101 0.99859
# vt ...
g default
usemtl nerf
s 1
f 1974/3/1974 6320/2/6320 2452/1/2452
f 6320/6/6320 2358/5/2358 2452/4/2452
# f ...

      下图是使用MeshLab打开lego的obj文件时的结果:

猜你喜欢

转载自blog.csdn.net/fengbingchun/article/details/129907891