游戏引擎中的动画

一.动画

    帧(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.帧渲染插值优化(将不同的帧进行插值优化得到实际动画)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

霸王奉先

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值