UDN
Search public documentation:

BinaryFormatSpecificationsCH
English Translation
日本語訳
한국어

Interested in the Unreal Engine?
Visit the Unreal Technology site.

Looking for jobs and company info?
Check out the Epic games site.

Questions about support via UDN?
Contact the UDN Staff

UE3 主页 > 技术美工 > 骨架动画源文件的二进制格式说明

骨架动画源文件的二进制格式说明


骨架动画和网格物体源二进制文件


当通过 ActorX 从 Max 或 Maya 导出文件时,PSA 和 PSK 文件包含了用于把骨架动画美术导入到虚幻引擎中的原始动画和网格物体信息。这里给出了一些说明来帮助那些有兴趣为它扩展格式或书写第三方工具的人(皮肤描画程序、其它 3d 包的导出器等等)。

PSK 格式:


这包含了网格物体、每个顶点的影响点索引及权重、骨骼名称、骨骼层次以及骨架默认姿势。

PSK 格式,版本 1.0(注意:所有的标题都是 VChunkHeader 类型)。一般,文件由成对的标题和数据组成。标题指出了(在 Datacount 字段中)跟随着的数据项的数量。

出现顺序 描述
General Header(一般标题) Typeflag 的值小于等于十进制数 1999801 时,它表明 PSK 文件是版本 1.0 布局。
Points Header(点的标题) 指出了点的数量,定义在 Datacount 中。
Points Data(点数据) VPoint 组成的数组。
Wedges Header(控件标题) 指定控件数量。
Wedges Data(控件数据) VVertex 控件数组(一个控件有一个具有到 3d 点数组的索引的 UV 对组成)。
Faces Header(面标题) 指定面的数量。
Faces Data(面数据) VTriangle 面数组。
Materials Header(材质标题) 指定材质数量。
Materials Data(材质数据) VMaterial 材质数组。
Bones Header(骨骼标题) 标题指出了骨骼的数量。
Bones Data(骨骼数据) VBone 骨骼数组。
Influences Header(影响点标题) 标题指出了影响点数量。
Influences Data(影响点数据) 影响点的VRawBoneInfluence 数组。

PSA 格式:


PSA 文件包含了骨骼名称、一个或多个序列名称以及每个序列的帧数量 N、每个骨骼的 N 个旋转和 N 个变换轨迹。

PSA 格式,版本 1.0。(注意:所有的标题都是 VChunkHeader 类型)。和 PSK 文件一样,PSA 文件由成对的标题和数据组成。

出现顺序 描述
General Header(一般标题) Typeflag 值大于等于 20090127 (对 Maya 来说) 2003321 (对 3dsMax 来说)时,它表明这是 PSA 文件版本 1.0 的布局。
Bones Header(骨骼标题) 标题指出了骨骼的数量。
Bones Data(骨骼数据) FNamedBoneBinary 骨骼名称数组。
Animations Header(动画标题) 标题指出了动画序列信息块的数量。
Animations Data(动画数据) 动画序列信息块的数组 AniminfoBinary。
Raw keys Header(原始关键帧标题) 指出了原始关键帧数量的标题。
Raw keys Data(原始关键帧数据) VQuatAnimKey 数组。
Scale keys Header(缩放关键帧标题) 指出了缩放关键帧的数量。
Scale keys Data(缩放关键帧数据) VScaleAnimKey 数组。
Curve keys Header(曲线关键帧标题) 指出了曲线关键帧的数量(blendshapes 的数量)。(仅支持从 Maya 导出的文件)
Curve keys Data(曲线关键帧数据) VBlendCurve 数组。(仅支持从 Maya 导出的文件)

原始关键帧数组包含了在所有特定序列中的所有骨骼的关键帧,按照以下方式进行组织:

对于每个 AnimInfoBinary 的序列,在 VQuatAnimKey 中有 [Number of bones] 乘以 [Number of frames keys] 个关键帧,按照在 PSA 的FnamedBoneBinary 数组中定义的骨骼的顺序,把每个骨骼的 [numframes] 个关键帧排列成轨迹。

每个 VBlendCurve 包括BlendCurveName[128] 和权重值浮点数组(等于 [关键帧的数量] )。

引擎中的动画数据


只要 PSK 中的数据(更深层次的讲是 native 骨架网格物体)和 PSA(更深层层次将是包含一个或多个序列的 native 动画对象)在运行时结合到一起时,骨骼将会根据名称进行连接。如果骨架中的任何骨骼(来自 PSK)在动画序列(来自 PSA)中找不到配对,那么将会假设它是参考姿势(正如在组成 PSK 中的参考骨架的 VBones 中的 offset(偏移值) & rotation(旋转值)所定义的那样)。

在将 native 动画和网格物体数据导入到编辑器的 Animation Browser(动画浏览器)时,它将会采用 UKX 包文件的形式。

使用的 C++ 结构体


在这个头文件中列出了相关的结构体和类:

https://udn.epicgames.com/pub/Three/BinaryFormatSpecificationsCH/UnrealAnimDataStructs.h

注意,VC++ 假设所有的结构体都占有量都是DoubleWord(32 位)大小的倍数- 当书写自定义代码时,在定义的周围放置 #pragma pack(push,1) 将会破坏 psa/psk 二进制文件的兼容性。可以使用 #pragma pack(push,4) 进行强制的默认的打包。幸运的是,浪费的空间并不是问题,因为这仅用于原始数据。同时在编辑器的导入代码以及 Max/Maya 导出器中也进行了同样假设这些数据的占有量是DoubleWord(32 位)大小的倍数。