Wings 3D/使用者手冊/Wings 檔案格式
檢視 http://wings3d.com/ 獲取用 Erlang 編寫的開源建模器。
需要檢視的重要原始檔:.../src/wings.hrl 和 .../src/wings_ff_wings.erl。
另一個參考是 用 Perl 實現的匯出器,它已過時。
請注意,Wings 目前正在開發中,包括檔案格式的更改,因此建議暫停此文件的工作,直到檔案格式再次穩定。
一個 *.wings 檔案包含 3 個主要部分
- 1. 頭部
- 頭部長度為 15 位元組,本質上是 ASCII,由人類可讀的字串 "#!WINGS-1.0" 以及十六進位制位元組 0x0D、0x0A、0x1A、0x04 組成,即 "\r\n^Z^D",即 CR、LF、SUB 和 EOT(Ctrl-Z 在 Windows 中是“輸入結束”字元,Ctrl-D 在 UNIX 中也是如此)。
- 2. 資料長度
- 一個 4 位元組無符號整數,以大端格式儲存整個檔案的大小。此值應與磁碟上的檔案大小匹配,否則檔案丟失資料。
- 3. 資料
- 檔案主體,以 Erlang 的 外部項格式 儲存,如第 8.1 節所示;具體來說,它是一個Zlib 壓縮的項,由前兩個位元組 131、80 指示。接下來的 4 個位元組是一個無符號整數,表示未壓縮資料的長度。檔案的其餘部分是實際的壓縮資料/項。
- 當使用 Erlang 或具有完整介面的語言處理 *.wings 檔案時(在 Erlang 分發版中存在一個 C 介面 和一個 Java 介面,還有 Python 介面 在其他地方),只需將整個資料部分饋送到相應的函式/方法即可。
- 但是,當在其他語言中處理 *.wings 檔案時,這 6 個位元組可能被視為額外的頭部資訊,其餘部分必須解壓縮,然後進一步處理以重建項的巢狀結構。
為了瞭解簡單的 Wings 模型在 Erlang 語法中如何呈現(在解壓縮後;手動縮排和添加註釋/連結以強調結構並提供幫助)

{ wings, 2, % The Topmost Tuple
{
[ % Shapes
{ object, "tetrahedron1",
{ winged,
[
[
{ color_rt, <<0,0,0,0,0,0,0,0,63,128,0,0>> },
{ color_lt, <<63,128,0,0,0,0,0,0,0,0,0,0>> },
{ edge, 0,1,2,0,4,2,1,3 }
],
[
{ color_rt, <<0,0,0,0,63,128,0,0,0,0,0,0>> },
{ color_lt, <<0,0,0,0,0,0,0,0,63,128,0,0>> },
{ edge, 0,2,0,3,3,0,2,5 }
],
[
{ color_rt, <<63,128,0,0,0,0,0,0,0,0,0,0>> },
{ color_lt, <<0,0,0,0,63,128,0,0,0,0,0,0>> },
{ edge, 0,3,3,2,5,1,0,4 }
],
[
{ color_rt, <<0,0,0,0,0,0,0,0,63,128,0,0>> },
{ edge, 1,2,1,0,5,4,0,1 }
],
[
{ color_lt, <<63,128,0,0,0,0,0,0,0,0,0,...>> },
{ edge, 1,3,2,1,2,0,3,5 }
],
[
{ color_rt, <<0,0,0,0,63,128,0,0,0,0,...>> },
{ edge, 2,3,1,3,4,3,1,2 }
]
],
[ [], [], [], [] ],
[
[ <<0,0,0,0,0,0,0,0,63,241,107,40,245,93,114,...>> ],
[ <<0,0,0,0,0,0,0,0,191,225,107,40,245,93,...>> ],
[ <<191,240,0,0,0,0,0,0,191,225,107,40,245,...>> ],
[ <<63,240,0,0,0,0,0,0,191,225,107,40,...>> ]
],
[]
},
[
{ plugin_states, [] },
{ mode, vertex}
]
}
], % Shapes end
[ % Materials
{ default,
[
{ maps, [] },
{ opengl,
[
{ ambient, { 1.0,1.0,1.0,1.0 } },
{ diffuse, { 1.0,1.0,1.0,1.0 } },
{ emission, { 0.0,0.0,0.0,0.0 } },
{ shininess, 1.0 },
{ specular, { 1.0,1.0,1.0,1.0 } }
]
}
]
}
], % Materials end
[ % Props
{ scene_prefs, [] },
{ plugin_states, [] }
] % Props end
}
}
您將發現兩個基本的複合 Erlang 資料型別元組(用大括號表示,如 {something,someother,somemore})和列表(用方括號表示 [elem1,elem2,...], 還有原子(在本示例中不帶引號的所有小寫字串,例如 wings、edge、plugin_states)、一個字串("tetrahedron1")、一些二進位制資料(用雙尖括號表示,尖括號之間是位元組值,如 <<0,1,2,3>>)以及一些整數和浮點數。您會看到,這些都是高度巢狀的(例如,一個列表包含列表,列表包含元組)。
當您無法使用現有的介面(或想要編寫新的介面)時,您需要了解 Erlang 項的外部格式,該格式在 這裡有很好的說明。請注意,您需要處理位元組流並以某種方式自行重建巢狀結構。作為參考,Erlang/OTP 原始碼有一個名為“jinterface”的模組,它提供了一組類來實現 Java 中的讀取此格式的功能。
要處理 *.wings 檔案,您至少應該準備處理以下內容
- 8.4 SMALL_INTEGER_EXT
- 8.5 INTEGER_EXT
- 8.6 FLOAT_EXT
- 8.7 ATOM_EXT
- 8.11 SMALL_TUPLE_EXT
- 8.13 NIL_EXT
- 8.14 STRING_EXT
- 8.15 LIST_EXT
- 8.16 BINARY_EXT
擴充套件後的最頂層資料結構是一個帶標籤的元組,包含 3 個元素
符合規範的載入器應該檢查前 2 個元素的存在,並驗證第 3 個元素是一個 3 元組。
形狀部分包含一個列表,每個列表包含一個四元組(4 元組),用於描述每個獨立的物件。物件四元組具有以下格式
- 標籤原子 'object'。
- 一個包含物件名稱的字串,例如 "tetrahedron1"
- 另一個包含物件實際資料的四元組,由原子 'winged'(如帶翼邊資料結構)標記。此元組將在下一節中介紹。
- 一個列表,包含有關此物件的外掛狀態和選擇模式的資訊。通常,這在匯入器/匯出器中不會使用。
Wings3D 使用 帶翼邊資料結構,使其在涉及鄰域操作(例如邊迴圈)的所有操作中速度都非常快。*.wings 檔案格式直接儲存這些帶翼邊資料結構,因此大部分資料儲存在邊本身中,而不是在表中(如 *.3ds 或 *.X 檔案格式)。
帶標籤的元組 'winged' 包含定義物件幾何形狀所需的所有資料。它採用以下格式
- 原子 'winged'(標籤)
- 一個列表,包含一系列列表,每個列表定義一條邊。
- 一個列表,包含一系列列表,每個列表定義面與材質之間的對映關係。
- 一個列表,包含一系列列表,每個列表定義一個頂點。
- 一個列表,目前用途未知 - 在示例中為 nil。
在第一個列表(邊資料)中,找到一系列列表,每個列表定義一條邊。在每個邊的列表中,可能會出現以下元組。請注意,一個元組在每個邊的列表中最多隻能出現一次,否則 Wings 將無法載入它,並且它們的出現順序無關緊要。
- 帶標籤的 9 元組 'edge':定義帶翼邊資料結構,必須存在。格式如下
- 原子 'edge'(標籤)
- 起始頂點
- 結束頂點
- 左側面
- 右側面
- 左側前驅
- 左側後繼
- 右側前驅
- 右側後繼
- 帶標籤的 2 元組 'color_rt':定義右側頂點邊顏色。格式如下
- 原子 'color_rt'(標籤)
- 12 位元組二進位制塊,表示 RGB 表示法中的顏色值。每個分量都儲存為 32 位單精度浮點數。
- 帶標籤的 2 元組 'color_lt':定義左側頂點邊顏色。格式如下
- 原子 'color_lt'(標籤)
- 12 位元組二進位制塊,表示 RGB 表示法中的顏色值。每個分量都儲存為 32 位單精度浮點數。
- 帶標籤的 2 元組 'uv_rt':定義右側頂點 UV 座標。格式如下
- 原子 'uv_rt'(標籤)
- 16 位元組二進位制塊,表示 UV 座標,每個數字使用 8 位元組浮點數。
- 帶標籤的 2 元組 'uv_lt':定義左側頂點 UV 座標。格式如下
- 原子 'uv_lt'(標籤)
- 16 位元組二進位制塊,表示 UV 座標,每個數字使用 8 位元組浮點數。
從 Wings 1.1.15 開始,此列表中可能包含 UV 和頂點顏色。之前,只能找到其中之一。
在第二個列表(材質資料)中,為由之前讀取的帶翼邊結構定義的每個面提供一個條目。
- 如果面沒有材質(預設材質),則列表中的項為 nil。
- 如果面有材質,則條目是一個列表,其中包含一個帶標籤的 2 元組,格式如下
- 原子 'material'(標籤)
- 材質名稱的原子,例如 'tetrahedron1_auv'。這是對材質部分的引用。
示例材質結構
[
[
"Cylinder1_auv",
[
[
"maps",
[
[
"diffuse",
3
]
]
],
[
"opengl",
[
[
"ambient",
[
1,1,1,1
]
],
[
"diffuse",
[
1,1,1,1
]
],
[
"emission",
[
0,0,0,0
]
],
[
"shininess",
1
],
[
"specular",
[
1,1,1,1
]
],
[
"vertex_colors",
"ignore"
]
]
]
]
],
[
"default",
[
[
"maps"
],
[
"opengl",
[
[
"ambient",
[
0.789853807692308,0.813333333333333,0.694044444444444,1
]
],
[
"diffuse",
[
0.789853807692308,0.813333333333333,0.694044444444444,1
]
],
[
"emission",
[
0,0,0,1
]
],
[
"shininess",
0
],
[
"specular",
[
0,0,0,1
]
],
[
"vertex_colors",
"set"
]
]
]
]
]
]
示例道具資料
[
[
"scene_prefs"
],
[
"plugin_states",
[
[
"wings_shape",
[
"no_folder",
[
[
"no_folder",
[
"open",
[
1,
[
1,"nil","nil"
]
]
]
]
]
]
]
]
],
[
"current_view",
0
],
[
"views",
[
[
"view",
[
[
"name",
"current_view"
],
[
"aim",
[
0,0,0
]
],
[
"distance_to_aim",
3.14266478310898
],
[
"azimuth",
-284.25
],
[
"elevation",
78.5
],
[
"tracking",
[
0,0
]
],
[
"fov",
45
],
[
"hither",
0.1
],
[
"yon",
10000
]
]
]
]
],
[
"images",
[
[
3,
[
[
"name",
"auvBG"
],
[
"width",
256
],
[
"height",
256
],
[
"samples_per_pixel",
3
],
[
"mask_size",
0
],
[
"pixels",
/* BinaryNode of 196608 bytes. */
]
]
]
]
]
]