一.动画
帧(Frame):GPU渲染管线完成3D→2D获得的2D图像即为帧
帧时刻(FrameTime):帧当前所处时间
帧率:FPS(Frame Per Second) = 在1s内动画使用的帧数量
动画:多个帧的集合组成动画,
二.Direct3D渲染动画
使用Direct3D-API接口可调用显卡生成帧和渲染帧,通过统计帧数和帧时刻完成FPS的计算
int frameCount = 0;
while(true){
long startTime = getTime();
D3DDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);//清理GPU渲染管线
d3dDevice->BeginScene();
D3DDevice->EndScene();
D3DDevice->Present(NULL, NULL, NULL, NULL); //写入GPU渲染管线
long endTime = getTime();
frameCount++;
}
FPS = frameCount/(endTime - startTime)
三.骨骼动画
通过定义骨架,骨骼,模型绑骨等基础操作后,在每一帧调整骨骼位置实现模型形变实现例如人类跳跃,动物奔跑等动画即为骨骼动画。
<1.定义骨架&骨骼
public class Skeleton
{
public string skeletonName;
public List<Bone> bones;
}
public class Bone
{
public int boneIndex;
public int boneParentIndex; //维护父骨骼Index
public string boneName;
public Matrix4×4 localFrame; //使用4×4矩阵保存相对于父骨骼的坐标变换
}
<2.创建骨骼动画帧序列
public class SkeletonAnimation
{
public List<SkeletonAnimationFrame> frames;
public int frameCount; //动画帧数
public float duration; //动画使用总时间
}
public class SkeletonAnimationFrame
{
public float time; //帧时刻
public List<BoneFrame> boneFrames;
}
public class BoneFrame
{
public int boneIndex;
public Matrix4×4 frame; //相对父骨骼的变换矩阵
}
<3.模型绑骨
public class Mesh
{
public List<VertexFvf> vertexFvfs;
}
public class VertexFvf
{
public int index;
public int bone1Index;
public int bone2Index;
public int bone1Weight; //通过权重计算顶点最后渲染坐标
public int bone2Weight;
}
四.顶点动画/形变动画
动画过程中顶点数,UV不变,顶点坐标变化的动画即为形变动画,例如人物脸部表情,变形的盒子,飘扬的旗帜等。
形变动画数据构成 = 网格MorphKey + 特性参数
1.制作形变动画/顶点动画(构建每个帧时刻的MorphKey, MorphKeyBase)
MorphAnimation = MorphKeyBase + MorphKey1(Frame1) + MorphKey2(Frame2)
2.帧渲染(去除MorphKey中对应顶点坐标)
MetaMeshPosition = MorphKey
3.帧渲染插值优化(将不同的帧进行插值优化得到实际动画)
Animation = MetaMeshPosition1(Frame1) + MetaMeshPosition2(Frame2)
五.自定义动画
动画过程中,MetaMesh的顶点,UV,材质都可能发生变化,随自定义程序逻辑变化而变化
1.获取MetaMesh的顶点,UV,材质
MetaMesh.GetVertices()
2.帧渲染(根据自定义逻辑动态构建MetaMesh)
MetaMesh.AddFace()
MetaMesh.AddTriangle()
3.帧渲染插值优化(将不同的帧进行插值优化得到实际动画)