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, or, 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 设计