学习和研究3D打印技术,首先要理解什么叫做“3D”。3D,是英文Three Dimension的缩写,中文也翻译成“三维”,因此,3D打印技术也常被称作“三维打印技术”。简单来说,所谓“三维”,就是指“前后”、“左右”和“上下”三个维度。同样,“一维”则是仅有“前后”,“二维”则是加上了“左右”,“二维”一般就是指平面。“前后”、“左右”和“上下”都属于相对概念,不能够精确地量化定位空间中的位置,我们需要一个合适的数学工具——笛卡尔坐标系。下面将会简单介绍如何使用笛卡尔坐标系来定位空间位置。
有了空间位置的描述,接着介绍3D数字模型是如何使用点、线和面来表示的。
最后以3D打印中模型数据的通用储存格式STL为例子,简介3D数据格式。
【笛卡尔坐标系】
一个三维空间的笛卡尔坐标系如图所示,它由X轴、Y轴和Z轴三条在空间中互相垂直的直线来表示,而三轴的交点被称作“坐标原点”,一般记作O。而三条坐标轴直线往往都标示了箭头,这个箭头指向的是坐标值的正方向。
坐标轴示意图
在一般的右手坐标系中,直观地讲,X轴表示“前后”,正方向为向前的方向,即在坐标原点前面的为正值,在坐标原点后面则为负值;Y轴表示“左右”,正方向为向右的方向,即在坐标原点右边为正值,在坐标原点左边为负值;Z轴表示“上下”,正方向为向上的方向,即坐标原点上方为正值,坐标原点下方则为负值。
那么,坐标原点的坐标值为(0,0,0)。
坐标(5,-3,4)表示空间中的一个点,它在坐标原点的前面距离为5,左边距离为3,和上方距离为4的位置。而坐标(1,2,3)则表示空间中在坐标原点前面距离为1,右边距离为2和上方距离为3的点。
有了笛卡尔坐标系,我们就能够对空间中的位置做出准确地量化描述。笛卡尔坐标系的概念是高中立体几何的基本概念,也是所有3D技术的基础。在机械设计领域,笛卡尔坐标系也是最基本的概念,有一大类机械结构都被称作“笛卡尔机械”。 笛卡尔机械可以沿着三个互相垂直的方向作直线运动,即X轴、Y轴和Z轴,这三个轴构成了所谓的笛卡尔直角坐标系。3D打印机的机械定位装置和传统的数控机床(CNC)一样,都来源于笛卡尔机械。因此,笛卡尔坐标系是本书读者必须要掌握的概念。
【点、线、面】
点云(Point Cloud)。有了笛卡尔坐标系,我们就能够通过坐标来表示空间中任意点的位置。一般我们通过3D扫描仪直接获得的数据,是一系列的点,也被称作“点云”。
点云
三角网格(Mesh)。仅仅有“点”是不足以显示一个三维实体的,我们还需要有“面”的信息。空间中不重合的两点相连,会构成一个条直线段;空间中不重合且不共线的三个点依次相连,会形成一个三角形,而一个三角形就能确定一个平面,也称作“三角面片”。一个物体的表面,可以由一系列地三角面片来离散近似,这些三角面片组成的表面,又称作“三角网格”。也有用四边形来表示平面的四边形网格等数据结构,三角网格是最一般、应用最广的网格数据结构。
三角网格
法向。法向,从字面上理解,就是法线的方向;而法线,与当前点所在的平面垂直的直线。对一个三角面片中的点来说,它的法线就是该面的垂线,其方向指向“向外”的方向;对三角网格中的顶点来说,它可能属于多个三角面片,因此,它的方向由这些三角面片的法向累加后归一化而得。法向是三维模型中点最重要的属性之一,它通常指向模型的外部,在3D打印的切片过程需要依靠它来判断一个点是否属于模型的内部;模型的法向,能够反映模型的“凹凸”程度,即光顺的程度;在光照模型中,光线方向与点法向的夹角,能够反映改点的明暗程度,从而得到更真实的渲染效果。
加了平滑光照后模型更具有真实感
【常见3D模型数据格式简介】
3D数字模型至今没有统一标准文件格式,各个厂商、研究所都可能拥有属于自己的文件格式。目前,比较常见的3D数字模型的文件格式有: PLY (斯坦福大学的多边形网格格式)、 STL(3D打印数字标准文件格式)、 OBJ(Alias|Wavefront公司推出的模型文件格式)、OFF(普林斯顿大学实验室定义的模型文件格式)等等。
在这一系列文件格式中,STL文件格式作为3D打印数字标准文件格式,现在已成为全世界CAD/CAM系统接口文件格式的工业标准,也是3D打印机支持的最常见的格式。OBJ文件则由于其能保存更加丰富的材料、纹理信息,成为3D建模、处理领域最通用的接口文件格式之一。我们将主要介绍STL与OBJ这两种文件格式。
STL文件有两种:一种是ASCII文本格式;另一种则是二进制格式。它们储存的信息相同,各有优缺点:ASCII文本格式可以用文本阅读器直接阅读,可读性好;二进制格式则无法用文本阅读器阅读,可读性差,但它更节省磁盘空间,为ASCII文本格式的1/6左右,读写也更快。
STL三维模型由一系列的三角面片构成。每个三角面片(facet)则由法向坐标(facet normal)和三个顶点坐标(vertex)构成。
ASCII格式的STL文件结构如下:
solid objectname //首行,物体名(一般有solid开头)
facet normal x y z //三角面片法向量的 3个分量值
outer loop
vertex x y z //三角面片第一个顶点坐标
vertex x y z //三角面片第二个顶点坐标
vertex x y z //三角面片第三个顶点坐标
endloop
endfacet //一个三角面片定义结束
…….
endsolid objectname //整个 STL文件定义结束
二进制格式的STL文件结构如下:
UINT8[80] //文件头信息
UINT32 //面片数目N
REAL32[3] //第1个面片的法向量
REAL32[3] //第1个面片第1个顶点
REAL32[3] //第1个面片第2个顶点
REAL32[3] //第1个面片第3个顶点
UINT16 //第1面片的 16位整数型属性字,一般为0,无特别含义
…….
REAL32[3] //第N个面片的法向量
REAL32[3] //第N个面片第1个顶点
REAL32[3] //第N个面片第2个顶点
REAL32[3] //第N个面片第3个顶点
UINT16 //第N面片的 16位整数型属性字,一般为0,无特别含义
可以看出,STL文件还是十分简洁易懂,它通过保存三角网格每个三角面片的信息来保存整个三角网格。然而,STL文件还是丢失了一些信息,比如点与三角面片之间的拓扑关系等。对于三角网格中,一个顶点可能同时是多个三角面片的顶点,在STL文件中并没有直接保存,在一定程度上造成信息丢失和数据冗余。
与之对应,OBJ文件格式则保留了顶点与面之间的拓扑关系,同时还存有纹理坐标等信息,比STL文件有更加丰富的信息。
OBJ文件由顶点数据(顶点位置v,顶点法向vt,顶点纹理坐标vn)和元素数据构成,元素数据一般就是面(facet, f)。OBJ文件是ASCII文本格式,可以由文本阅读器打开,十分易读。
OBJ文件中,每行的数据信息由行首的关键字决定。
若行首仅是v, 说明该行表示的是顶点位置,后面跟着三个实数(x,y,z)表示该顶点的坐标;
若行首是vn, 说明该行表示的是顶点法向,后面跟着三个实数(x,y,z)表示该顶点方向的坐标;
若行首是vt,说明该行表示的是顶点纹理坐标,后面一般跟着两个实数(x,y)表示该顶点的纹理坐标。
顶点数据按顺序依次对应。
若行首是f,说明该行表示的是面的信息。后面会跟着一些索引,一般索引的数量是三个;每个索引可能会有顶点索引,法线索引,纹理坐标索引,以/分隔。法线索引和纹理坐标索引并不是必要的,一般也会省去。f i1 i2 i3 表示第i1个顶点、第i2个顶点和第i3个顶点构成了一个三角面片。
一般来说,如无渲染方面的要求,OBJ文件仅保存顶点位置v和面f的信息即可。一个三角形的数据可保存如下:
v 0 0 0
v 1 0 0
v 0 1 0
f 1 2 3
其保存成obj文件,其可在模型显示软件中,显示如下图所示。

简单三角形的OBJ文件显示结果
(转自阿巴赛3D教育)