青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

天行健 君子當自強而不息

Using Key?Framed Skeletal Animation(1)

Using Key−Framed Skeletal Animation Sets

If you have explored the DirectX SDK samples, you might have come across a little demo called SkinnedMesh, which shows you how to use a pre−calculated key−frame animation stored in an .X file to animate an on−screen character. The problem is, that sample's code is so convoluted and hard to understand that it'll make your head spin. With no real documentation of how to use .X file animation data, the skinned mesh animation sample remains full of mystery.

You have saw how to work with skeletal−based meshes, called skinned meshes, which adhere to an underlying hierarchy of bones (a skeletal structure). The vertices of the skinned mesh are attached to those bones, and they move as the bones do. Basically, animation is achieved by slowly applying a set of transformations to the hierarchy of bones and letting the vertices follow along with the movements.

The sequence of these animation transformations is called a key frame. You use key frames to define both the transformation and the time of the transformation to use in the animation sequence. Where do you get the transformations you use to apply the movements to those bones? There are many file formats at your disposal, but to keep on the DirectX route, I'll be concentrating on using .X files.

If you take a look at the SkinnedMesh demo's .X file (Tiny.x) from the DirectX SDK, you'll notice that along with the typical Frame and Mesh templates, there is an AnimationSet template with a number of embedded Animation and AnimationKey objects. It's from these animation data objects that you obtain the transformations used to animate your skinned mesh's bone hierarchy. Take a closer look at some of these animation objects within an .X file to see what I mean.

AnimationSet Walk {
	Animation {
{Bip01}
		AnimationKey {
4;
3;
0; 16; 1.00000, 0.00000, 0.00000, 0.00000,
0.00000, 1.00000, 0.00000, 0.00000,
0.00000, 0.00000, 1.00000, 0.00000,
0.00000, 0.00000, 0.00000, 1.00000;;,
1000; 16; 1.00000, 0.00000, 0.00000, 0.00000,
0.00000, 1.00000, 0.00000, 0.00000,
0.00000, 0.00000, 1.00000, 0.00000,
0.00000, 0.00000, 0.00000, 1.00000;;,
2000; 16; 1.00000, 0.00000, 0.00000, 0.00000,
0.00000, 1.00000, 0.00000, 0.00000,
0.00000, 0.00000, 1.00000, 0.00000,
0.00000, 0.00000, 0.00000, 1.00000;;;
}
	}
	Animation {
{Bip01_LeftArm}
		AnimationKey {
0;
1;
0; 4; 1.00000, 0.000000, 0.00000, 0.000000;;;
}
		AnimationKey {
1;
1;
0; 4; 1.000000, 1.00000, 1.000000;;;
}
		AnimationKey {
2;
1;
0; 3; 0.000000, 0.00000, 0.000000;;;
}
}

}

What you're looking at is a simple animation that works with two bones. Each animation is defined inside an AnimationSet data object; in the previous instance, this animation has been assigned the name Walk. Two Animation objects that contain the various keys of animation for each bone are embedded in this AnimationSet object. Keys?! What the heck am I talking about? Well, my friend, let me take a moment to explain the concept of keys in animation.

 

Using Keys in Animation

A key, short for an animation key, is a timeline marker that signifies a change in a bone's position and/or orientation. An animation that uses keys is called a key−framed animation. The reasons for using keys are quite significant, with the most important one being memory conservation.

You see, an animation is a series of movements (bone movements, in this case) over a set period of time. During this animation, your bone hierarchy is modified to convey the motion in the animation. Trying to store every bone's position and orientation for every millisecond of animation is impossible; there's just too much data to store it effectively. Instead, you can space out the movements over a longer period of time (every second or two)or better yet, whenever a major change in each bone's position or orientation takes place. For example, imagine your armrather, imagine the arm illustrated in Figure 5.1 .

The bones that construct the arm in Figure 5.1 are pointing straight out at the start of the animation. Over time, the bones bend at the imaginary elbow, come to a rest, and then bend at a different angle. So there are three major changes in the bones' orientationstraight (the default position), slightly bent, and a major bend in the joint. These three changes are the three keys in the animation.

Now, instead of storing the orientation of the bones every millisecond, store those three keys and the exact time (in milliseconds) that the bones would reach the appropriate orientation. In this example, suppose the arm animation starts at 0 milliseconds, reaches the first key (half−bent) at 500 milliseconds, and reaches the last key (fully bent) at 1,200 milliseconds.

Here's where using key frames comes in handy. Suppose you want to calculate the orientation of the bones at a specific timesay, at 648 milliseconds. That time just so happens to fall between the second and third keys (148 milliseconds past the second key). Now, assume that the two transformation matrices represent the orientations of each bone in the animation.

D3DXMATRIX matKey1, matKey2;

By taking each key and interpolating the values between them, you can come up with a transformation to use at any time between the keys. In this example, at 648 milliseconds in the animation, you can interpolate the transformations as follows:

// Get the difference in the matrices
D3DXMATRIX matTransformation = matKey2 − MatKey1;

// Get keys' times
float Key1Time = 500.0f;
float Key2Time = 1200.0f;

// Get the time difference of the keys
float TimeDiff = Key2Time − Key1Time;

// Get the scalar from animation time and time difference
float Scalar = (648.0f − Key1Time) / TimeDiff;

// Calculate the interpolated transformation matrix
matTransformation *= Scalar;
matTransformation += matKey1;

And there you have it! The matTransformation matrix now holds the interpolated transformation that you would apply to the bone in question to perfectly synchronize it to the animation! To increase precision, you can use translation, rotation, and scaling values instead of transformation matrices during the interpolation. I'll get back to doing just that in a bit, but for now let's get back to the Animation template with which you'll be dealing.

For every bone in your hierarchy, there should be a matching Animation object. Immediately following the Animation object declaration, you'll see a referenced data object name. This is the name of the bone that has its animation data defined using the preceding AnimationKey objects. This means that in the previous example, the two bones, Bip01 and Bip01_LeftArm, are being animated.

One or more AnimationKey objects follow the data object reference. The AnimationKey objects define the keys of the animation a bone uses, which can include translation, rotation, scale, or transformation keys. Take a closer look at each key type and how you store its information in the objects.


posted on 2008-04-24 18:13 lovedday 閱讀(580) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


公告

導航

統計

常用鏈接

隨筆分類(178)

3D游戲編程相關鏈接

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            野花国产精品入口| 亚洲免费观看视频| 亚洲一级片在线看| 国产精品久久久久久久电影| 亚洲免费一在线| 亚洲永久精品大片| 亚洲国产成人一区| 99re66热这里只有精品3直播 | 国产精品国产三级国产普通话蜜臀| 一区二区三区四区五区精品| 亚洲深夜福利在线| 怡红院av一区二区三区| 亚洲伦伦在线| 亚洲精品亚洲人成人网| 欧美一级免费视频| 一区二区欧美日韩| 狂野欧美激情性xxxx欧美| 亚洲一区在线视频| 欧美激情第9页| 欧美jizz19性欧美| 国语精品一区| 亚洲一区久久| 中日韩在线视频| 欧美精品videossex性护士| 久久精品国产亚洲aⅴ| 国产精品卡一卡二卡三| 99精品视频免费观看视频| 亚洲午夜精品一区二区| 亚洲欧洲三级电影| 裸体歌舞表演一区二区| 欧美成人黑人xx视频免费观看| 国产欧美在线观看一区| 午夜精品理论片| 亚洲欧美日韩另类| 国产精品va在线播放| 日韩亚洲一区二区| 午夜亚洲福利| 一色屋精品亚洲香蕉网站| 性xx色xx综合久久久xx| 久久久亚洲国产天美传媒修理工| 黑人一区二区三区四区五区| 久久免费的精品国产v∧| 欧美激情一区二区| 可以看av的网站久久看| 亚洲国产1区| 一区二区国产日产| 国产亚洲欧美一区二区三区| 久久婷婷综合激情| 在线视频日韩精品| 欧美激情第一页xxx| 亚洲午夜精品久久久久久app| 久久久久国产精品www| 亚洲精品久久久久久下一站 | 久久久www成人免费无遮挡大片| 永久555www成人免费| 欧美片在线播放| 欧美在线免费观看视频| 亚洲人永久免费| 欧美jizz19性欧美| 久久精品亚洲| 午夜精品久久久久久久99樱桃| 在线精品观看| 黄色欧美成人| 国内不卡一区二区三区| 国产精品一区二区三区乱码| 欧美不卡视频| 亚洲欧美精品| 午夜电影亚洲| 午夜视频在线观看一区二区| 一本综合精品| 亚洲一区免费视频| av成人国产| 亚洲视频欧美视频| 亚洲一二三四久久| 亚洲小说欧美另类社区| 中文亚洲欧美| 欧美在线免费播放| 久久精品视频一| 欧美福利视频| 亚洲二区在线视频| 99国产精品久久久久老师| 亚洲综合视频网| 亚洲欧美激情在线视频| 欧美一区日韩一区| 美日韩精品免费| 99精品99| 欧美专区第一页| 欧美日韩国产一区精品一区| 欧美性猛交xxxx免费看久久久| 国产精品亚洲精品| 亚洲国产精彩中文乱码av在线播放| 亚洲丁香婷深爱综合| 99国产精品国产精品久久| 欧美在线二区| 欧美激情久久久久久| 亚洲视频一二三| 蜜月aⅴ免费一区二区三区| 国产精品劲爆视频| 亚洲国产精品久久| 欧美在线关看| 宅男噜噜噜66一区二区| 久热精品视频在线观看一区| 欧美视频精品在线| 99视频在线观看一区三区| 久热精品在线| 欧美在线免费视屏| 国产精品久久久久91| 亚洲三级视频在线观看| 久久天堂精品| 久久精品国产99| 国产欧美精品在线播放| 午夜精品久久一牛影视| av成人免费在线观看| 欧美日韩美女在线| 亚洲午夜精品网| 最近中文字幕日韩精品 | 午夜精品久久久久久久99水蜜桃 | 久久久欧美一区二区| 欧美小视频在线| 国产精品视频网| 一区二区成人精品| 亚洲视频一区| 国产伦精品一区二区三区视频黑人| 亚洲在线视频免费观看| 亚洲一区综合| 在线看片欧美| 99精品免费| 韩国av一区二区三区四区| 激情文学一区| 日韩一级裸体免费视频| 国产日韩欧美综合精品| 久久久久成人精品| 欧美1区免费| 午夜视频一区在线观看| 老司机亚洲精品| 亚洲综合导航| 久久婷婷丁香| 欧美在线视频不卡| 欧美不卡高清| 免费日韩av| 国产精品无码永久免费888| 欧美国产一区二区三区激情无套| 欧美激情黄色片| 久久最新视频| 国产精品视屏| 亚洲私人影院| aaa亚洲精品一二三区| 久久视频在线看| 欧美在线视频一区二区三区| 欧美国产视频日韩| 欧美成在线视频| 一区在线免费| 欧美专区中文字幕| 欧美伊人久久| 国产麻豆午夜三级精品| 亚洲制服欧美中文字幕中文字幕| 亚洲视频在线一区| 亚洲视频你懂的| 国产精品一区二区久久久久| 亚洲素人在线| 久久久久国产精品人| 国产一区二区中文| 久久综合一区二区三区| 免费成人av在线| 免费在线视频一区| 亚洲福利视频一区| 99精品视频网| 欧美日韩在线三级| 亚洲欧美一区二区三区极速播放| 亚洲一区久久久| 激情文学综合丁香| 久热精品在线视频| 99视频在线精品国自产拍免费观看 | 能在线观看的日韩av| 亚洲国产日韩欧美综合久久| 欧美黄色一区二区| 亚洲在线免费观看| 久久亚洲欧美国产精品乐播| 91久久精品日日躁夜夜躁国产| 欧美精品v日韩精品v国产精品| 亚洲综合色在线| 亚洲国产精品久久久久婷婷884 | 亚洲第一在线视频| 欧美亚洲一区在线| 亚洲精品日本| 在线播放中文字幕一区| 国产精品国码视频| 欧美成人资源| 久热精品在线视频| 欧美资源在线观看| 亚洲欧美卡通另类91av| 亚洲午夜精品一区二区| 99国产精品视频免费观看一公开| 欧美大胆人体视频| 嫩草影视亚洲| 亚洲国产精品悠悠久久琪琪| 欧美a级在线| 亚洲第一视频网站| 欧美激情免费在线| 亚洲精品老司机|