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', //Short = 'h', // Integer32 = 'i', // Integer64 = 'l', // 浮點 = '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) | 字串[線性、四元數] | 錯誤的 | 錯誤的 |
材質(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 設計