1.动画类型
1.1 塞露露动画。以帧的方式对图片进行叠加。一连串的2d手绘产生的动画效果。
1.2 骨骼动画。又叫蒙皮动画,以骨骼运动带动蒙皮定点进行运动。对骨骼进行key帧,计算定点运动的动画方式。
1.3 定点动画。又叫定点变形动画,记录每个顶点的坐标偏移信息,定点位置通常为两个极端定点变形偏移的差值。这种方式在记录定点较多,记录变形信息量大的时候往往数据量庞大。所以通常只用在面部表情等小范围定点作用中。
动画按照制作方式又可以分为 动画片段、游戏内置电影(in-game cinematics, IGC)、非交互连续镜头(noninteractive sequence, NIS), 半互动方式 QTE(quick time event), 全动视频(full-motion video, FMV)。
通常全动视频先将动画片段预渲染为MP4、WMV等视频文件,其它方式都为游戏内实时渲染。
2.骨骼数据
struct Joint
{
Matrix4x3
const char * m_name; //骨骼名称
U8 m_iParent; //父关节索引
};
struct Skeleton
{
U32 m_jointCount; // 关节数目
Joint * m_AJoint; //关节数组
};
3.关节姿势
这里只写关节统一缩放的数据结构。
sturct JointPose
{
Quatornion m_rot; //Rotator
Vector3 m_Trans; //Location
Float32 m_scale; //Scale
};
此格式数据也称为SQT(Scale,Translation,Quaternion).
struct SkeletonPose
{
Skeleton * m_pSkeletion; // 骨骼 + 关节数量
JointPose * m_aLocalPose; //局部关节姿势
};
4.全局姿势
struct SkeletonPose
{
Skeleton * m_pSkeleton; //骨骼 + 关节
JointPose * m_aLocalPose; //局部关节姿势
Matrix44 * m_aGlobalPose; //全局关节姿势
};
5.动画数据
struct AnimationSample
{
JointPose * m_AJointPose;
};
struct AnimationClip
{
Skeleton * m_pSkeleton;
Float32 m_framesPerSecond;
U32 m_frameCount; //非循环动画的采样数量为帧 + 1
AnimationSample * m_aSamples;
bool m_isLooping;
};
6.蒙皮
每个绑定关节的顶点都会有一个权重因子。每个顶点的权重和都为1.
struct SkinnedVertex
{
float m_position[3];
float m_normal[3];
float m_u, m_v;
U8 m_jointIndex[4]; //这里限制一个定点最多只能由4个定点甲醛平均
float m_jointWeight[3]; //记录相对每个关节的权重,最后一个通过1-得到
};
蒙皮矩阵方程 计算诀窍就在于,单个关节的定点,其位置相对关节空间坐标是不变的。所以可以先将其变换转到关节空间,然后再返回模型空间。
待续。。。
7.动画混合
动作连续性
C0 连续性(C0 Continity): 位移的连续。
C1 连续性:位移的一次导数,速度、动量的连续。
C2 连续性:位移的二次导数,加速度的连续。