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

天行健 君子當自強而不息

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 閱讀(575) 評論(0)  編輯 收藏 引用

公告

導航

統(tǒng)計

常用鏈接

隨筆分類(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>
            9人人澡人人爽人人精品| 激情另类综合| 午夜影院日韩| 亚洲欧美文学| 午夜精品久久久久久久蜜桃app| 亚洲视频在线看| 亚洲一区二区三区欧美| 亚洲小说欧美另类社区| 欧美日韩日韩| 一本久久a久久精品亚洲| 一本色道久久综合亚洲91| 一区二区电影免费观看| 亚洲一区二区三区在线视频| 亚洲欧美日韩在线综合| 久久露脸国产精品| 欧美激情精品久久久久久免费印度 | 亚洲欧美一级二级三级| 欧美一乱一性一交一视频| 欧美在线观看一二区| 玖玖综合伊人| 欧美三级电影网| 国产综合色产| 亚洲视频1区2区| 巨乳诱惑日韩免费av| 亚洲精品色图| 久久国产高清| 欧美日韩四区| 亚洲第一页中文字幕| 亚洲一区二区三区久久| 麻豆av一区二区三区| 99re国产精品| 久久字幕精品一区| 国产精品一区二区在线| 亚洲欧洲日韩在线| 久久成人18免费网站| 亚洲国产精品高清久久久| 亚洲精品国产精品乱码不99| 香蕉久久夜色| 欧美日韩国产亚洲一区| 伊人成年综合电影网| 亚洲深夜福利| 免费人成网站在线观看欧美高清| 日韩亚洲综合在线| 久久躁日日躁aaaaxxxx| 国产日韩欧美二区| 亚洲午夜电影| 欧美激情成人在线| 久久精品视频在线观看| 欧美午夜精品理论片a级按摩| 亚洲福利电影| 久久婷婷麻豆| 欧美一区二粉嫩精品国产一线天| 欧美日韩中文字幕精品| 亚洲精品专区| 老司机午夜免费精品视频| 午夜精品久久久久久99热| 国产精品看片你懂得| 亚洲午夜国产一区99re久久| 久久久午夜电影| 日韩一级片网址| 欧美日韩高清不卡| 最新日韩av| 亚洲第一伊人| 欧美大秀在线观看| 亚洲精品美女在线观看| 亚洲高清资源综合久久精品| 麻豆精品一区二区av白丝在线| 国内视频精品| 麻豆亚洲精品| 欧美电影免费观看高清完整版| 91久久精品国产91久久性色tv| 欧美高清在线| 免费成人av| 麻豆av一区二区三区久久| 国内精品嫩模av私拍在线观看 | 亚洲精品中文字幕在线| 欧美91大片| 日韩一区二区免费看| 亚洲黄色成人网| 欧美精品亚洲一区二区在线播放| 日韩图片一区| 亚洲丝袜av一区| 国产一区视频网站| 欧美激情亚洲综合一区| 欧美日韩视频专区在线播放 | 中文无字幕一区二区三区| 欧美视频一区二区三区| 欧美一区二区三区成人| 日韩视频免费观看| 欧美午夜视频在线| 久久国产黑丝| 欧美aⅴ99久久黑人专区| 亚洲欧洲另类国产综合| 一个人看的www久久| 国产日韩三区| 美女免费视频一区| 欧美日韩亚洲国产精品| 久久九九免费视频| 欧美日本亚洲| 久久精品理论片| 欧美国产视频一区二区| 亚洲欧美日韩视频一区| 久久久国际精品| 亚洲视频一区二区| 久久国产毛片| 亚洲国产一区二区三区高清 | 日韩一级大片| 韩国女主播一区二区三区| 亚洲人成网站色ww在线| 国产午夜精品久久久| 亚洲毛片av| 亚洲国内精品在线| 午夜一区二区三区不卡视频| 亚洲伦理精品| 久久免费黄色| 欧美在线一区二区三区| 欧美日韩精品二区| 美女国产精品| 国产精品视频网站| 日韩视频在线观看国产| 亚洲国产欧美在线人成| 欧美一区二区在线视频| 亚洲欧美韩国| 欧美日韩精品伦理作品在线免费观看| 久久亚洲精品中文字幕冲田杏梨| 国产精品家庭影院| 欧美私人啪啪vps| 欧美一区综合| 欧美激情一区二区三区蜜桃视频 | 亚洲欧美日韩一区二区| 一本一本久久| 免费美女久久99| 老司机久久99久久精品播放免费| 国产精品美女久久久久久2018| 亚洲人精品午夜| 亚洲激情精品| 久久久一区二区三区| 久久一区二区三区四区| 国产午夜精品全部视频在线播放| 一本一道久久综合狠狠老精东影业 | 99riav1国产精品视频| 亚洲毛片一区| 欧美成人精品不卡视频在线观看| 免费亚洲一区| 亚洲成人在线观看视频| 久久久久久久精| 久久伊人一区二区| 在线成人欧美| 浪潮色综合久久天堂| 你懂的成人av| 亚洲毛片在线观看| 欧美视频在线观看视频极品| 一区二区三区 在线观看视频| 午夜精品久久久久久久久久久久久| 欧美亚洲不卡| 欧美一级久久| 欧美成年人视频网站| 亚洲精品国产视频| 欧美日韩在线视频观看| 亚洲综合成人在线| 久久久久久久高潮| 亚洲黄色免费| 欧美视频久久| 欧美在线三区| 亚洲国产欧美久久| 午夜精品久久久久久久久久久| 狠狠色狠狠色综合系列| 欧美精品xxxxbbbb| 亚洲女同在线| 美日韩精品视频免费看| 亚洲美女黄网| 国产精品久久久久一区| 久久青草欧美一区二区三区| 亚洲精品欧美精品| 久久精品1区| 99riav久久精品riav| 国产片一区二区| 欧美顶级少妇做爰| 亚洲欧美日韩精品久久久久| 亚洲国产精品www| 午夜精品电影| 亚洲精品在线视频| 国产九九精品视频| 免费中文日韩| 欧美在线一区二区| 亚洲最新在线视频| 免费观看一区| 欧美一区二区大片| 99热这里只有精品8| 国产一区二区三区久久| 欧美日韩国产va另类| 久久日韩粉嫩一区二区三区| 欧美激情影音先锋| 欧美一站二站| 亚洲视频一二三| 亚洲欧洲一区二区三区| 久久久国产91| 亚洲欧美视频| 中文一区字幕| 亚洲人成毛片在线播放|