三维模型文件格式解读

最近接触到三维模型文件,发现格式五花八门的,这里做一个汇总和解读。

STL

简介

STL,全称为STereoLithography,译作:立体光刻,由3D System软件公司创立。但因三角网格形式的其特点,又可以翻译为“标准三角语言(Standard Triangle Language)”,“标准曲面细分语言(Standard Tessellation Language)”。

STL文件使用若干个非结构化的三角网格来记录三维实体信息。在笛卡尔坐标系中,每一个三角网格由三个顶点按照右手定则排序方式构成,同时按照右手定则记录一个与之对应的表面单位法线信息。文件记录的坐标信息是没有尺度的,计量单位为任意的。

文件格式

solid name
facet normal ni nj nk
outer loop
vertex v1x v1y v1z
vertex v2x v2y v2z
vertex v3x v3y v3z
endloop
endfacet
endsolid name

在stl中,允许存在多个实体对象。通过 solid nameendsolid name 这一对关键词来描述一个实体对象。其中 name 是实体对象的名称,可以省略,因为通常一个stl文件只存一个实体对象。

solid name
……
endsolid name

在实体对象中,一般存在若干个面片(facet),通过facetendfacet 这一对关键词来描述一个面片。而面片描述信息包括法向量(normal)信息,以及构成面片的三个顶点(vertex)。其中法向量使用 facet normal ,后接 nj nj nk 三个浮点数,表示法向量(\(n_i\), \(n_j\), \(n_k\))。面片的三个顶点通常要成组出现,使用outer loopendloop 这对关键词来分割。顶点的坐标使用vertex来描述,后接v1x v1y v1z 三个浮点数,表示坐标(\(v_{1x},v_{1y},v_{1z}\)) 。

facet normal ni nj nk
outer loop
vertex v1x v1y v1z
vertex v2x v2y v2z
vertex v3x v3y v3z
endloop
endfacet

值得注意的是,在stl文件中,相邻的三角面片必须共享两个公共顶点。

430f22fd17fbf4f2831392fc3efafa1f_stl1

上图左侧这种情形则违反了上述原则,应该表示为右侧这种。

PLY

简介

PLY, 全称为 Polygon file format,即使用多边形来记录三维模型的一种文件格式。其主要存储的是构成面片的多边形顶点三维坐标。可以存储颜色、透明度、表面法向量、材质等信息。

文件格式

 ply
 format ascii 1.0
 comment这是一个正四面体
 element vertex 4
 property float x
 property float y
 property float z
 element face 4
 property list uchar int vertex_index
 end_header
 0 3 0
 2.449 -1.0 -1.414
 0 -1 2.828
 -2.449 -1.0 -1.414
 3 0 1 3
 3 0 2 1
 3 0 3 2
 3 1 2 3

在ply文件中,内容可以分为档头和内容两部分,在档头中描述了当前文件所使用的格式、自定义元素类型和数量等信息。在内容中则根据档头所描述的类型进行数据记录。通常ply分成三部分:

  • 档头
  • 顶点元素列表
  • 面元素列表

首先,以ply作为识别ply文件的标识

ply

然后,声明当前文件格式,以下三种都可以

 format ascii 1.0
 format binary_little_endian 1.0
 format binary_big_endian 1.0

档头还支持一些注解,通过关键词 comment 定义:

comment This is a comment!

接着定义内容区中的元素。格式如下,即先通过element关键词声明元素名称和数量,然后定义元素中各成员变量的类型和名称。

 element <element name> <number in file>
 property <data_type> <property name 1>
 property <data_type> <property name 2>
 property <data_type> <property name 3>

内定的成员变量类型包括:

  • char、uchar
  • short、ushort
  • int、uint
  • float、double
  • list

如,定义一个包含12个顶点的物体,每个顶点使用3个单精度浮点数 (x,y,z)代表点的座标,使用3个unsigned char代表顶点颜色,颜色顺序为 (B, G, R),则档头的写法为:

 element vertex 12
 property float x
 property float y
 property float z
 property uchar blue
 property uchar green
 property uchar red

再如,定义一个具有10个面的物体,写法为:

 element face 10
 property list uchar int vertex_indices

最后结束档头:

end_header

STP

to be continued ……

IGS

OBJ

DXF

参考资料

posted @ 2024-12-02 00:44  GShang  阅读(31)  评论(0编辑  收藏  举报