分享
 
 
 

动画技术-关键帧(keyFrame)

王朝other·作者佚名  2006-03-10
窄屏简体版  字體: |||超大  

动画技术-关键帧(keyFrame)

关键帧是一种常用的动画技术,其基本原理是将动画序列中比较关键的帧提取出来,而其他帧根据时间用这些关键帧插值计算得到。

一个简单的关键帧结构:

typedef struct sKeyframe {

DWORD Time ;

D3DMATRIX matTransformation ;

}sKeyframe

这是一个非常简化的结构,只包含时间和矩阵。但从这个结构可以看出keyFrame技术最根本的含义。假设我们要创建一个正方形旋转并移动的动画。

如图,这个正方形在3个位置间旋转着移动。我们需要定义4个关键帧,每个关键帧都通过矩阵设定正方形相对于初始位置的偏转和偏移。

sKeyframe Keyframes[4] = {

{ 0, 1.00000f, 0.00000f, 0.00000f, 0.00000f,

0.00000f, 1.00000f, 0.00000f, 0.00000f,

0.00000f, 0.00000f, 1.00000f, 0.00000f,

0.00000f, 0.00000f, 0.00000f, 1.00000f; },

{ 400, 0.000796f, 1.00000f, 0.00000f, 0.00000f,

-1.00000f, 0.000796f, 0.00000f, 0.00000f,

0.00000f, 0.00000f, 1.00000f, 0.00000f,

50.00000f, 0.00000f, 0.00000f, 1.00000f; },

{ 800, -0.99999f, 0.001593f, 0.00000f, 0.00000f,

-0.001593f, -0.99999f, 0.00000f, 0.00000f,

0.00000f, 0.00000f, 1.00000f, 0.00000f,

25.00000f, 25.00000f, 0.00000f, 1.00000f; },

{ 1200, 1.00000f, 0.00000f, 0.00000f, 0.00000f,

0.00000f, 1.00000f, 0.00000f, 0.00000f,

0.00000f, 0.00000f, 1.00000f, 0.00000f,

0.00000f, 0.00000f, 0.00000f, 1.00000f; }

};

keyFrame4虽然与keyFrame1动画完全一样,但时间不同,所以要定义keyFrame4。

更新动画时首先要根据动画已经播放的时间计算出当前帧处于哪两个关键帧之间。

DWORD Keyframe = 0; // Start at 1st keyframe

for(DWORD i=0;i<4;i++) {

// If time is greater or equal to a

// key-frame's time then update the

// keyframe to use

if(Time >= Keyframes[i].Time)

Keyframe = i;

}

如果当前时间>=某个关键帧设定的时间,那么该关键帧就是当前帧的前一个关键帧。而下一帧就是后一个关键帧。如果前一个关键帧已经是最后一个关键帧,那么后一个关键帧也使用该帧。

DWORD keyframe2 = (Keyframe==LAST_KEYFRAME_ID)?Keyframe:Keyframe+1 ;

计算出两个关键帧后,根据当前时间和两个关键帧的时间进行插值计算,得到当前帧。

DWORD TimeDiff = Keyframes[Keyframe2].Time -

Keyframes[Keyframe].Time;

// Make sure there's a time difference to

// avoid divide-by-zero errors later on.

if(!TimeDiff)

TimeDiff=1;

float Scalar = (Time - Keyframes[Keyframe].Time)/TimeDiff;

// Calculate the difference in transformations

D3DXMATRIX matInt = D3DXMATRIX(Keyframes[Keyframe2].matTransformation) - D3DXMATRIX(Keyframes[Keyframe].matTransformation);

matInt *= Scalar; // Scale the difference

// Add scaled transformation matrix back to 1st keyframe matrix

matInt += D3DXMATRIX(Keyframes[Keyframe].matTransformation);

matInt就是计算出的当前帧的转换矩阵,用这个矩阵可以得到当前帧动画的位置。

这个例子是一个最简单的关键帧动画,因为这个动画的Frame只包含一个正方型而以,也就是说该动画每一帧的Mesh是一样的。在稍微复杂些的情况中,比如一个人走动的动画。可以选取几个动作作为关键帧,如果使用简单的动画,每个关键帧要记录一套mesh信息;如果使用骨骼动画,每个关键帧要记录骨骼的变换。这些情况中,需要插值计算的内容就复杂多了。不过根据时间,插值计算出当前帧仍是基础。

关键帧技术除了用于播放动画,还可以用于物体的运动。特别是固定路线的物体运动。

虽然我们谈到关键帧技术都是在3D动画中,不过2D游戏中也可以很好的使用。其实这个简单的例子就可以看成是一个2D动画关键帧的例子,只不过我们要使用2D转换矩阵。

参考资料: <Advanced Animation with DirectX> Chapter2

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有