最近接觸到三維模型檔案,發現格式五花八門的,這裡做一個彙總和解讀。
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 name
和 endsolid name
這一對關鍵詞來描述一個實體物件。其中 name
是實體物件的名稱,可以省略,因為通常一個stl檔案只存一個實體物件。
solid name
……
endsolid name
在實體物件中,一般存在若干個面片(facet),透過facet
和 endfacet
這一對關鍵詞來描述一個面片。而面片描述資訊包括法向量(normal)資訊,以及構成面片的三個頂點(vertex)。其中法向量使用 facet normal
,後接 nj nj nk
三個浮點數,表示法向量(\(n_i\), \(n_j\), \(n_k\))。面片的三個頂點通常要成組出現,使用outer loop
和 endloop
這對關鍵詞來分割。頂點的座標使用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檔案中,相鄰的三角面片必須共享兩個公共頂點。
上圖左側這種情形則違反了上述原則,應該表示為右側這種。
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
參考資料
-
https://zh.wikipedia.org/wiki/STL_(檔案格式)
-
https://windsong.top/STL與蒙特卡羅/#stl檔案
-
https://zh.wikipedia.org/wiki/PLY
-
https://en.wikipedia.org/wiki/ISO_10303-21
-
如何理解STP格式和STL格式?
-
3D軟體格式及轉換