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