Overview
binvox 檔案格式是一種體積像素(volumn pixel, voxel)格式,簡稱體素。體素能以較省空間的形式來表示一個 3D 模型,常應用在 minecraft、樂高積木上。

Introduction
- 體素格式會描述一個立方體區域內$N^{3\times3\times3}$,哪些區域是有物體的。
- 體素類似點雲的稀疏矩陣。
- 點雲描述了物體的表面(似乎較少在點內部的),體素則可以同時描述物體的內部(但也不常使用)。
- 換句話說,體素也就類似 3D 列印常用的 STL 等格式,可透過將物體切片,看到物體內部每一層的特徵,不同的點在於描述方法一個是體素,另一個是網格。
為何較省空間?
- 從一個相同物體,但用不同格式呈現的模型來看,用 obj 格式的檔案較 binvox 格式大。推測的原因可能與檔案格式有關,obj 格式使用 ascii 碼敘述每一行資料,但 binvox 將大部分資料以 binary 儲存,有壓縮成一行的效果。
- 但如果體素不以 binary 格式儲存,則可能不一定會比較小,因為體素格式會描述一個立方體範圍內的所有體素為 0 或 1,意思就是如果一個 256x256x256 的體素內只有一個點為 1,也還是會使用相同大小的大小。但若是改用點雲等格式則是只描述物體相對於原點上的特徵,如果只有一個點就只需要一行就可以描述完畢。
Structure
#binvox 1
// 1 代表對應的版本,#binvox 代表該檔案格式是 binvox
dim 256 256 256
// 分別代表體素網格的高度、寬度和長度,三個維度應該是相等的
translate -0.241359 -0.319687 -0.241206
scale 7.30682
// 上面兩行主要是用來正規化從網格到體素的變換,分別是平移和縮放。
data
// 檔案最後一項代表體素的資料,全部以二進制格式儲存。
translate
和 scale
的目的是要對其他格式的檔案(例如 mesh)進行正規化。使體素模型可以擬合到一個 1x1x1 的立方體上,並且其原點位於 (0, 0, 0),這是透過平移和縮放來達成的。步驟依序如下:
- 平移:將網格模型的原點平移到 (0, 0, 0)。
- 縮放:將網格模型的尺度大小縮放至可以擬合體素模型所要求的維度大小。
- 接著就可以依據座標決定體素是否為 0 或 1。

Tools