三維模型檔案格式解讀

GShang發表於2024-12-02

最近接觸到三維模型檔案,發現格式五花八門的,這裡做一個彙總和解讀。

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

參考資料

  • 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軟體格式及轉換

相關文章