Cast 的目標是為模型、動畫、材質和遊戲世界創造出易於使用的格式。此外,演員應該能夠在任何 3D 軟體中產生相同的場景。

Autodesk Maya (2012+):版本
Blender (3.0+):發布
.NET Framework(參考):庫/DotNet
.NET Framework(由 Scobalula 編寫):Cast.NET
Python:庫/Python
CastModelViewer(由 echo000 提供):Github
SECast,無損轉換轉換器:SECast
注意:如果您的工具支援匯出直接轉換,那就更好了。
常見問題:FAQ
所有檔案都以強制轉換標頭開頭:
結構體 CastHeader{ uint32_t Magic; // char[4] 強制轉換 (0x74736163)uint32_t Version; // 0x1uint32_t 根節點; // 根節點數量,必要時包含各種子節點uint32_t Flags; // 保留用於標誌或填充,無論需要哪一個};轉換檔案基本上是一組通用節點。節點被賦予一個唯一的註冊id,它可以告訴載入器資料是什麼,以及如何處理它。
Cast 標頭後面是節點集合,其型別必須為 CastId::Root。
一個節點看起來像:
結構體 CastNodeHeader{
CastId 識別碼; // 用來表示該節點使用哪個類別suint32_t NodeSize; // nodeuint64_t NodeHash之後的所有資料和子資料的大小; // 唯一的雜湊值,如 id,用於將節點連結在一起uint32_t PropertyCount; // 屬性的計數 uint32_t ChildCount; // 直接子節點的計數 // 我們必須讀取直到達到節點大小,這表示我們完成了。 // 節點採用堆疊佈局,因此很容易加載,FILO 順序。有幾個可用的註冊演員 ID:
枚舉類別 CastId : uint32_t{
根=0x746F6F72,
型號 = 0x6C646F6D,
網格=0x6873656D,
混合形狀 = 0x68736C62,
骨架=0x6C656B73,
骨頭=0x656E6F62,
IKHandle = 0x64686B69,
約束=0x74736E63,
動畫=0x6D696E61,
曲線=0x76727563,
曲線模式覆蓋 = 0x564F4D43,
通知軌道 = 0x6669746E,
材質=0x6C74616D,
文件=0x656C6966,
實例=0x74736E69,
元資料 = 0x6174656D,
};節點後面是屬性列表 [Node.PropertyCount],屬性如下圖所示:
結構 CastPropertyHeader{
CastPropertyId 識別碼; // 該屬性的元素類型uint16_t NameSize; // 該屬性名稱的大小uint32_t ArrayLength; // 此屬性包含的元素數量(1 表示單一)// 以下是小寫 UTF-8 字串,namesize 的大小,不以 null 結尾 //cast_property[ArrayLength] 資料數組};對於屬性,cast 有幾種內建類型:
枚舉類別 CastPropertyId : uint16_t{ Byte = 'b', // <uint8_t>
Short = 'h', // <uint16_t>
Integer32 = 'i', // <uint32_t>
Integer64 = 'l', // <uint64_t>
浮點 = 'f', // <浮點>
雙精度 = 'd', // <雙精度>
String = 's', // 空終止的 UTF-8 字串
Vector2 = 'v2', // 浮點精確度向量 XY
Vector3 = 'v3', // 浮點精確度向量 XYZ
Vector4 = 'v4'//浮點精確度向量 XYZW};要讀取轉換文件,只需遍歷根節點及其子節點即可。屬性始終位於子節點之前。每個節點都有其自身和所有子節點的總大小,因此如果處理器不理解節點 ID,它可以跳過整個節點並繼續讀取。
Cast id 以整數形式存儲,以加快序列化和反序列化的速度。
| 場地 | 類型 | 是數組 | 必需的 |
|---|---|---|---|
| 孩子們 | 骨架、網格、材質 | 真的 | 錯誤的 |
| 家長 | 根 | 錯誤的 | 真的 |
| 屬性(ID) | 類型 | 是數組 | 必需的 |
|---|---|---|---|
| 姓名(n) | 字串 | 錯誤的 | 錯誤的 |
| 場地 | 類型 | 是數組 | 必需的 |
|---|---|---|---|
| 孩子們 | 沒有任何 | 真的 | 錯誤的 |
| 家長 | 模型 | 錯誤的 | 真的 |
| 屬性(ID) | 類型 | 是數組 | 必需的 |
|---|---|---|---|
| 姓名(n) | 字串 | 錯誤的 | 錯誤的 |
| 頂點位置緩衝區 (vp) | 向量 3 (v3) | 真的 | 真的 |
| 頂點法線緩衝區 (vn) | 向量 3 (v3) | 真的 | 錯誤的 |
| 頂點切線緩衝區 (vt) | 向量 3 (v3) | 真的 | 錯誤的 |
| 頂點顏色緩衝區 (c%d) | 整數 32 (i) | 真的 | 錯誤的 |
| 頂點 UV 緩衝區 (u%d) | 向量 2 (v2) | 真的 | 錯誤的 |
| 頂點權重骨緩衝區 (wb) | 整數 32 (i)、短整數 (h)、位元組 (b) | 真的 | 錯誤的 |
| 頂點權重值緩衝區 (wv) | 浮動 (f) | 真的 | 錯誤的 |
| 面緩衝區 (f) | 整數 32 (i)、短整數 (h)、位元組 (b) | 真的 | 真的 |
| 顏色層數 (cl) | 整數 32 (i)、短整數 (h)、位元組 (b) | 錯誤的 | 如果有顏色層則為 True,否則為 False |
| UV 層數 (ul) | 整數 32 (i)、短整數 (h)、位元組 (b) | 錯誤的 | 如果有 uv 層則為 True,否則為 False |
| 最大重量影響 (mi) | 整數 32 (i)、短整數 (h)、位元組 (b) | 錯誤的 | 若有權重則為 True,否則為 False |
| 剝皮方法(sm) | 字串(s)[線性,四元數] | 錯誤的 | 錯誤的 |
| 材質(CastNode 的雜湊值:材質)(m) | 整數 64 (l) | 錯誤的 | 錯誤的 |
注意事項:
Face Buffer是目前網格頂點資料緩衝區的索引,其中 (0, 1, 2) 是該網格的前三個頂點。
Face Buffer遵循 CCW(右手)纏繞順序,這在其他 api 中可能有所不同,您可能需要重新映射索引。
如果一個人臉包含無效的索引組合(0, 1, 1), (0, 1, 0), (0, 0, 0)其中兩個或多個索引相同,則處理這些人臉的使用者可以接受忽略它們以便正確渲染網格。明智的做法是向使用者發出警告,說明發生了這種情況。
每個頂點描述符緩衝區必須包含相同數量的元素,例如:如果有 16 個頂點,則必須有 16 條法線(如果存在),如果緩衝區存在則必須有 16 種顏色。否則,假設它們是預設的/被跳過的。
權重是相加的,這意味著具有0.5和0.5的相同骨骼最終會使該骨骼影響1.0 。
預設的蒙皮方法是linear 。設定為quaternion時,使用雙四元數蒙皮。
新 8/18/2024 :頂點顏色規格已更改,為了支援多個顏色層,新增了一個新的Color Layer Count (cl) ,它模仿UV Layer Count (ul)屬性。
為了向後相容,強制轉換處理器應檢查cl ,並預設與新的c%d圖層屬性一起使用。
如果cl屬性不存在,則處理器應檢查遺留vc屬性,該屬性是唯一的顏色層(如果存在)。
| 場地 | 類型 | 是數組 | 必需的 |
|---|---|---|---|
| 孩子們 | 沒有任何 | 真的 | 錯誤的 |
| 家長 | 模型 | 錯誤的 | 真的 |
| 屬性(ID) | 類型 | 是數組 | 必需的 |
|---|---|---|---|
| 姓名(n) | 字串 | 錯誤的 | 真的 |
| 基礎形狀(CastNode 的哈希值:Mesh)(b) | 整數 64 (l) | 錯誤的 | 真的 |
| 目標形狀頂點索引 (vi) | 位元組 (b)、短整型 (h)、整數 32 (i) | 真的 | 真的 |
| 目標形狀頂點位置 (vp) | 向量 3 (v3) | 真的 | 真的 |
| 目標體重計(ts) | 浮動 (f) | 真的 | 錯誤的 |
注意事項:
Base Shape必須是現有的鑄造網格。
Target Shape Vertex Indices和Target Shape Vertex Positions在配對時必須具有相同的長度。
Target Shape Vertex Positions是每個變更的頂點位置的最終值,忽略Base Shape的對應頂點。
Target Weight Scale表示目標形狀可以變形的最大值,應預設為1.0 。
| 場地 | 類型 | 是數組 | 必需的 |
|---|---|---|---|
| 孩子們 | 骨骼、IKHandle、約束 | 真的 | 錯誤的 |
| 家長 | 模型 | 錯誤的 | 真的 |
| 場地 | 類型 | 是數組 | 必需的 |
|---|---|---|---|
| 孩子們 | 沒有任何 | 真的 | 錯誤的 |
| 家長 | 骨骼 | 錯誤的 | 真的 |
| 屬性(ID) | 類型 | 是數組 | 必需的 |
|---|---|---|---|
| 姓名(n) | 字串 | 錯誤的 | 真的 |
| 父索引 (p) | 整數 32 (i) | 錯誤的 | 錯誤的 |
| 段比例補償 (ssc) | 位元組 (b) [真、假] | 錯誤的 | 錯誤的 |
| 本地位置 (lp) | 向量 3 (v3) | 錯誤的 | 錯誤的 |
| 局部旋轉 (lr) | 向量 4 (v4) | 錯誤的 | 錯誤的 |
| 世界排名 (wp) | 向量 3 (v3) | 錯誤的 | 錯誤的 |
| 世界自轉 (wr) | 向量 4 (v4) | 錯誤的 | 錯誤的 |
| 規模 | 向量 3 (v3) | 錯誤的 | 錯誤的 |
注意事項:
未指定時, Segment Scale Compensate應預設為True 。
Scale始終是目前骨骼的局部比例。
| 場地 | 類型 | 是數組 | 必需的 |
|---|---|---|---|
| 孩子們 | 沒有任何 | 真的 | 錯誤的 |
| 家長 | 骨骼 | 錯誤的 | 真的 |
| 屬性(ID) | 類型 | 是數組 | 必需的 |
|---|---|---|---|
| 姓名(n) | 字串 | 錯誤的 | 錯誤的 |
| 起始骨散列 (sb) | 整數 64 (l) | 錯誤的 | 真的 |
| 結束骨散列 (eb) | 整數 64 (l) | 錯誤的 | 真的 |
| 目標骨哈希 (tb) | 整數 64 (l) | 錯誤的 | 錯誤的 |
| 極向量骨哈希 (pv) | 整數 64 (l) | 錯誤的 | 錯誤的 |
| 極骨雜湊 (pb) | 整數 64 (l) | 錯誤的 | 錯誤的 |
| 使用目標旋轉 (tr) | 位元組 (b) [真、假] | 錯誤的 | 錯誤的 |
注意事項:
未指定時, Use Target Rotation應預設為False 。
Pole Bone必須只影響鏈條的扭曲,一般來說,您要么有Pole Bone ,要么有Pole Vector Bone 。
| 場地 | 類型 | 是數組 | 必需的 |
|---|---|---|---|
| 孩子們 | 沒有任何 | 真的 | 錯誤的 |
| 家長 | 骨骼 | 錯誤的 | 真的 |
| 屬性(ID) | 類型 | 是數組 | 必需的 |
|---|---|---|---|
| 姓名(n) | 字串 | 錯誤的 | 錯誤的 |
| 約束類型 (ct) | 字串 [pt, 或, sc] | 錯誤的 | 真的 |
| 約束骨骼哈希 (cb) | 整數 64 (l) | 錯誤的 | 真的 |
| 目標骨哈希 (tb) | 整數 64 (l) | 錯誤的 | 真的 |
| 維持偏移量(月) | 位元組 (b) [真、假] | 錯誤的 | 錯誤的 |
| 跳過 X (sx) | 位元組 (b) [真、假] | 錯誤的 | 錯誤的 |
| 跳過 Y (sy) | 位元組 (b) [真、假] | 錯誤的 | 錯誤的 |
| 跳過 Z (sz) | 位元組 (b) [真、假] | 錯誤的 | 錯誤的 |
注意事項:
約束類型值對應於:
pt點約束,適用於翻譯。
or方向約束,適用於旋轉。
sc尺度約束,適用於尺度。
未指定時,維護偏移量應預設為False 。
未指定時,跳過 X、跳過 Y 和跳過 Z 應預設為False ,並指忽略約束中的該軸。
| 場地 | 類型 | 是數組 | 必需的 |
|---|---|---|---|
| 孩子們 | 文件 | 真的 | 錯誤的 |
| 家長 | 模型 | 錯誤的 | 真的 |
| 屬性(ID) | 類型 | 是數組 | 必需的 |
|---|---|---|---|
| 姓名(n) | 字串 | 錯誤的 | 真的 |
| 類型(噸) | 字串 | 錯誤的 | 真的 |
| 反照率檔案哈希(反照率) | 整數 64 (l) | 錯誤的 | 錯誤的 |
| 擴散文件哈希(擴散) | 整數 64 (l) | 錯誤的 | 錯誤的 |
| 普通文件哈希(普通) | 整數 64 (l) | 錯誤的 | 錯誤的 |
| 鏡面文件哈希(鏡面) | 整數 64 (l) | 錯誤的 | 錯誤的 |
| 發射文件哈希(發射) | 整數 64 (l) | 錯誤的 | 錯誤的 |
| 光澤文件哈希(光澤) | 整數 64 (l) | 錯誤的 | 錯誤的 |
| 粗糙度文件哈希(粗糙度) | 整數 64 (l) | 錯誤的 | 錯誤的 |
| 環境光遮擋檔案雜湊 (ao) | 整數 64 (l) | 錯誤的 | 錯誤的 |
| Cavity 檔案哈希(cavity) | 整數 64 (l) | 錯誤的 | 錯誤的 |
| 各向異性文件哈希 (aniso) | 整數 64 (l) | 錯誤的 | 錯誤的 |
| 額外 (x) 個檔案雜湊(額外%d) | 整數 64 (l) | 錯誤的 | 錯誤的 |
| 場地 | 類型 | 是數組 | 必需的 |
|---|---|---|---|
| 孩子們 | 沒有任何 | 真的 | 錯誤的 |
| 家長 | 演員節點 | 錯誤的 | 真的 |
| 屬性(ID) | 類型 | 是數組 | 必需的 |
|---|---|---|---|
| 路徑(p) | 字串 | 錯誤的 | 真的 |
| 場地 | 類型 | 是數組 | 必需的 |
|---|---|---|---|
| 孩子們 | 骨架、曲線、CurveModeOverride、NotificationTrack | 真的 | 真的 |
| 家長 | 根 | 錯誤的 | 真的 |
| 屬性(ID) | 類型 | 是數組 | 必需的 |
|---|---|---|---|
| 姓名(n) | 字串 | 錯誤的 | 錯誤的 |
| 幀率(fr) | 浮動 (f) | 錯誤的 | 真的 |
| 循環(lo) | 位元組 (b) [真、假] | 錯誤的 | 錯誤的 |
| 場地 | 類型 | 是數組 | 必需的 |
|---|---|---|---|
| 孩子們 | 沒有任何 | 真的 | 錯誤的 |
| 家長 | 卡通 | 錯誤的 | 真的 |
| 屬性(ID) | 類型 | 是數組 | 必需的 |
|---|---|---|---|
| 節點名稱 (nn) | 字串 | 錯誤的 | 真的 |
| 主要屬性名稱 (kp) | 字串 (s) [rq、tx、ty、tz、sx、sy、sz、bs、vb] | 錯誤的 | 真的 |
| 關鍵影格緩衝區 (kb) | 位元組 (b)、短整型 (h)、整數 32 (i) | 真的 | 真的 |
| 鍵值緩衝器 (kv) | 位元組 (b)、短整型 (h)、整數 32 (i)、浮點型 (f)、向量 4 (v4) | 真的 | 真的 |
| 數據機) | 字串 [累加、絕對、相對] | 錯誤的 | 真的 |
| 添加劑混合重量 (ab) | 浮動 (f) | 錯誤的 | 錯誤的 |
注意事項:
所有曲線關鍵影格都位於物件/節點空間。
Mode決定每個曲線關鍵影格如何應用於節點。
additive :將關鍵影格新增至節點屬性的目前場景幀值。
absolute :關鍵影格是給定影格的精確值。
relative :關鍵影格新增到節點屬性的其餘位置值。
屬性值對應:
=0 = 隱藏。
>=1 = 可見。
rq旋轉四元數並期望v4值。
tx翻譯“X”並期望f值。
ty翻譯“Y”並期望f值。
tz翻譯“Z”並期望f值。
sx縮放“X”並期望f值。
sy縮放“Y”並期望f值。
sz縮放“Z”並期望f值。
bs BlendShape 權重並期望f值。
vb可見性並需要b 、 h或i值。
屬性tx 、 ty 、 tz 、 sx 、 sy 、 sz 、 bs 、 vb應線性內插。
屬性rq應使用四元數 slerp 進行內插。
| 場地 | 類型 | 是數組 | 必需的 |
|---|---|---|---|
| 孩子們 | 沒有任何 | 真的 | 錯誤的 |
| 家長 | 卡通 | 錯誤的 | 真的 |
| 屬性(ID) | 類型 | 是數組 | 必需的 |
|---|---|---|---|
| 節點名稱 (nn) | 字串 | 錯誤的 | 真的 |
| 數據機) | 字串 [累加、絕對、相對] | 錯誤的 | 真的 |
| 覆蓋平移曲線 (ot) | 位元組 (b) [真、假] | 錯誤的 | 錯誤的 |
| 覆蓋旋轉曲線(或) | 位元組 (b) [真、假] | 錯誤的 | 錯誤的 |
| 覆蓋比例曲線 (os) | 位元組 (b) [真、假] | 錯誤的 | 錯誤的 |
筆記:
有關每個Mode值的定義,請參閱上面的Curve註釋。
未指定時, Override Translation Curves應預設為False 。
未指定時, Override Rotation Curves應預設為False 。
未指定時, Override Scale Curves應預設為False 。
覆蓋節點及其所有子節點應將其曲線模式覆寫為新模式。
處理時必須存在覆蓋節點,以便確定子骨骼是否為後代骨骼。
| 場地 | 類型 | 是數組 | 必需的 |
|---|---|---|---|
| 孩子們 | 沒有任何 | 真的 | 錯誤的 |
| 家長 | 卡通 | 錯誤的 | 真的 |
| 屬性(ID) | 類型 | 是數組 | 必需的 |
|---|---|---|---|
| 姓名(n) | 字串 | 錯誤的 | 真的 |
| 關鍵影格緩衝區 (kb) | 位元組 (b)、短整型 (h)、整數 32 (i) | 真的 | 真的 |
| 場地 | 類型 | 是數組 | 必需的 |
|---|---|---|---|
| 孩子們 | 文件 | 真的 | 錯誤的 |
| 家長 | 根 | 錯誤的 | 真的 |
| 屬性(ID) | 類型 | 是數組 | 必需的 |
|---|---|---|---|
| 姓名(n) | 字串 | 錯誤的 | 錯誤的 |
| 參考檔案(CastNode 的哈希值:檔案)(rf) | 整數 64 (l) | 錯誤的 | 真的 |
| 位置 (p) | 向量 3 (v3) | 錯誤的 | 真的 |
| 旋轉(r) | 向量 4 (v4) | 錯誤的 | 真的 |
| 規模 | 向量 3 (v3) | 錯誤的 | 真的 |
| 場地 | 類型 | 是數組 | 必需的 |
|---|---|---|---|
| 孩子們 | 沒有任何 | 真的 | 錯誤的 |
| 家長 | 根 | 錯誤的 | 真的 |
| 屬性(ID) | 類型 | 是數組 | 必需的 |
|---|---|---|---|
| 作者(一) | 字串 | 錯誤的 | 錯誤的 |
| 軟體 | 字串 | 錯誤的 | 錯誤的 |
| 上軸(上) | 字串 (s) [x, y, z] | 錯誤的 | 錯誤的 |
筆記:
Author和Software僅用於標記演員文件,在元資料之外沒有任何用途。
Up Axis可用作軟體的提示,以調整場景以匹配特定的上軸。
轉換檔案可以具有任意數量的元節點,但設計用於提示的屬性應僅使用第一個元資料節點實例。
由 DTZxPorter 根據社區的意見設計的格式。
圖示由 Smashicons 設計