跳轉到內容

Wings 3D/使用者手冊/Wings 檔案格式

來自華夏公益教科書

Wings3D 檔案格式(版本 2)。

[編輯 | 編輯原始碼]

檢視 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 語法中如何呈現(在解壓縮後;手動縮排和添加註釋/連結以強調結構並提供幫助)

一個四面體,頂點在面模式下用 RGB 著色,下表面未分配,渲染為白色
 { 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 個元素

  1. 原子 'wings',標識這是一個 wings 檔案。
  2. 整數 (2),表示檔案版本。
  3. 另一個元組,包含 3 個元素,分別是形狀材質道具

符合規範的載入器應該檢查前 2 個元素的存在,並驗證第 3 個元素是一個 3 元組。

形狀部分包含一個列表,每個列表包含一個四元組(4 元組),用於描述每個獨立的物件。物件四元組具有以下格式

  1. 標籤原子 'object'。
  2. 一個包含物件名稱的字串,例如 "tetrahedron1"
  3. 另一個包含物件實際資料的四元組,由原子 'winged'(如帶翼邊資料結構)標記。此元組將在下一節中介紹。
  4. 一個列表,包含有關此物件的外掛狀態和選擇模式的資訊。通常,這在匯入器/匯出器中不會使用。

帶翼邊資料結構

[編輯 | 編輯原始碼]

Wings3D 使用 帶翼邊資料結構,使其在涉及鄰域操作(例如邊迴圈)的所有操作中速度都非常快。*.wings 檔案格式直接儲存這些帶翼邊資料結構,因此大部分資料儲存在邊本身中,而不是在表中(如 *.3ds 或 *.X 檔案格式)。

帶標籤的元組 'winged' 包含定義物件幾何形狀所需的所有資料。它採用以下格式

  1. 原子 'winged'(標籤)
  2. 一個列表,包含一系列列表,每個列表定義一條邊。
  3. 一個列表,包含一系列列表,每個列表定義面與材質之間的對映關係。
  4. 一個列表,包含一系列列表,每個列表定義一個頂點。
  5. 一個列表,目前用途未知 - 在示例中為 nil。

在第一個列表(邊資料)中,找到一系列列表,每個列表定義一條邊。在每個邊的列表中,可能會出現以下元組。請注意,一個元組在每個邊的列表中最多隻能出現一次,否則 Wings 將無法載入它,並且它們的出現順序無關緊要。

  • 帶標籤的 9 元組 'edge':定義帶翼邊資料結構,必須存在。格式如下
    1. 原子 'edge'(標籤)
    2. 起始頂點
    3. 結束頂點
    4. 左側面
    5. 右側面
    6. 左側前驅
    7. 左側後繼
    8. 右側前驅
    9. 右側後繼
  • 帶標籤的 2 元組 'color_rt':定義右側頂點邊顏色。格式如下
    1. 原子 'color_rt'(標籤)
    2. 12 位元組二進位制塊,表示 RGB 表示法中的顏色值。每個分量都儲存為 32 位單精度浮點數。
  • 帶標籤的 2 元組 'color_lt':定義左側頂點邊顏色。格式如下
    1. 原子 'color_lt'(標籤)
    2. 12 位元組二進位制塊,表示 RGB 表示法中的顏色值。每個分量都儲存為 32 位單精度浮點數。
  • 帶標籤的 2 元組 'uv_rt':定義右側頂點 UV 座標。格式如下
    1. 原子 'uv_rt'(標籤)
    2. 16 位元組二進位制塊,表示 UV 座標,每個數字使用 8 位元組浮點數。
  • 帶標籤的 2 元組 'uv_lt':定義左側頂點 UV 座標。格式如下
    1. 原子 'uv_lt'(標籤)
    2. 16 位元組二進位制塊,表示 UV 座標,每個數字使用 8 位元組浮點數。

從 Wings 1.1.15 開始,此列表中可能包含 UV 和頂點顏色。之前,只能找到其中之一。

在第二個列表(材質資料)中,為由之前讀取的帶翼邊結構定義的每個面提供一個條目。

  • 如果面沒有材質(預設材質),則列表中的項為 nil。
  • 如果面有材質,則條目是一個列表,其中包含一個帶標籤的 2 元組,格式如下
    1. 原子 'material'(標籤)
    2. 材質名稱的原子,例如 '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. */
                       ]
                   ]
               ]
           ]
       ]
   ]
華夏公益教科書