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

天行健 君子當(dāng)自強(qiáng)而不息

Working with skeletal animation(3)

Modifying Bone Orientation

After you have loaded the bone hierarchy, you can manipulate it. To modify the orientation of a bone, you first need to locate its respective frame structure by creating a function that recursively searches the frames for a specific bone name. Once it is found, a pointer to the frame is provided so you can directly access the frame's transformation matrix. The recursive search function might look something like this:

Note You can apply any transformation to any bone in the hierarchy, but it's recommended that you only work with rotations. Why only rotations? Think of it this way−when you bend your elbow, it rotates. How would you explain it if you translated your elbow instead? That would make your elbow pop off your arm−something you definitely don't want!

If you are trying to move the entire mesh through the world, just translate the root bone; all other bones will inherit that transformation. Better yet, use the world transformation to move the skinned mesh object through the 3D world.

D3DXFRAME_EX *FindFrame(D3DXFRAME_EX *Frame, char *Name)
{
// Only match non−NULL names
if(Frame && Frame−>Name && Name)
{
// Return frame pointer if matching name found
if(!strcmp(Frame−>Name, Name))
return Frame;
}
	// Try to find matching name in sibling frames
if(Frame && Frame−>pFrameSibling)
{
D3DXFRAME_EX *FramePtr = FindFrame((D3DXFRAME_EX*)Frame−>pFrameSibling, Name);
		if(FramePtr)
return FramePtr;
}
	// Try to find matching name in child frames
if(Frame && Frame−>pFrameFirstChild)
{
D3DXFRAME_EX *FramePtr = FindFrame((D3DXFRAME_EX*)Frame−>pFrameFirstChild, Name);
		if(FramePtr)
return FramePtr;
}
	// No matches found, return NULL
return NULL;
}

Suppose you want to find a bone called "Leg" using the FindFrame function. You simply provide the name of the bone to find and a pointer to your root frame, as shown here:

// pRootframe = D3DXFRAME_EX root frame pointer
D3DXFRAME_EX *Frame = FindFrame(pRootFrame, "Leg");

if(Frame) {
  // Do something with frame, like changing the D3DXFRAME_EX::TransformationMatrix to something
  // you want. For here, let's rotate the bone a little
  D3DXMatrixRotationY(&Frame−>TransformationMatrix, 1.57f);
}

 

Updating the Hierarchy

Once you've modified the bone transformations, you need to update the entire hierarchy so you can use it later for rendering. Even if you haven't modified the bone transformations, you still need to update the hierarchy because you need to set certain variables before rendering.

During the hierarchy update, you must combine each successive transformation down through the hierarchy. Starting at the root, you apply the bone's transformation matrix to the frame's combined transformation matrix. The bone's transformation matrix is passed to any siblings of the root to be combined as well. From there, the combined transformation matrix you just calculated is passed to each child of the root. This process propagates itself throughout the hierarchy.

Although it is hard to understand at first, you can think of the process this way: Take the skeletal structure in Figure 4.2, start at the root, and multiply it by a transformation matrix that positions the root in the world.

As you can see in Figure 4.2, the combined transformation from the root is passed to all of its child bones, which in turn are combined. The results are passed to the child bones of those bones. However, trying to compute the transformation matrices in the manner shown is very difficult, so other means are necessary.

The easiest way to update your frame hierarchy is to create a recursive function that combines the frame's transformation with a provided transformation matrix. From there, the transformation matrix is passed to the frame's siblings, and the combined matrix is passed to the frame's child frames. Take a look at the function in question.

void UpdateHierarchy(D3DXFRAME_EX *Frame, D3DXMATRIX matTransformation = NULL)
{
D3DXFRAME_EX *pFramePtr;
D3DXMATRIX matIdentity;
	// Use an identity matrix if none passed
if(!matTransformation)
{
D3DXMatrixIdentity(&matIdentity);
matTransformation = &matIdentity;
}
	// Combine matrices with supplied transformation matrix
matCombined = TransformationMatrix * (*matTransformation);
	// Combine with sibling frames
if((pFramePtr = (D3DXFRAME_EX*)pFrameSibling))
pFramePtr−>UpdateHierarchy(matTransformation);
	// Combine with child frames
if((pFramePtr = (D3DXFRAME_EX*)pFrameFirstChild))
pFramePtr−>UpdateHierarchy(&matCombined);
}

As you can see, the UpdateHierarchy function takes a D3DXFRAME_EX object as the first parameter−this is the current frame being processed. You only need to call UpdateHierarchy once, to provide a pointer to your root frame; the function will recursively call itself for each frame.

Notice the second parameter of UpdateHierarchy−matTransformation. The matTransformation parameter is the transformation matrix to apply to the frame's transformation. By default, the matTransformation pointer is NULL, meaning that an identity matrix is used during the call to UpdateHierarchy. After a frame's matrix is combined with the provided transformation, the resulting transformation is passed to the child frames by setting matTransformation during the next call.

As I just mentioned, you only need to call the UpdateHierarchy function using your root frame. Don't provide a transformation matrix as the second parameter−this should be left up to the recursive calls. If you do provide a transformation matrix with the root frame, you'll be moving the entire mesh using that transformation matrix. That's the same as setting the world transformation matrix to position and orient the mesh to render.

// pRootFrame = D3DXFRAME_EX root frame object
UpdateHierarchy(pRootFrame);

Now that you have a little understanding of the skeletal structure and how to work with bone hierarchies, it's time to move on to the second piece of the animation puzzle−the overlaid skinned mesh that deforms to match the orientation of the bone hierarchy.


posted on 2008-04-23 18:06 lovedday 閱讀(431) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


公告

導(dǎo)航

統(tǒng)計

常用鏈接

隨筆分類(178)

3D游戲編程相關(guān)鏈接

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲日本在线观看| 久久精品网址| 99视频精品全部免费在线| 国产乱码精品1区2区3区| 性欧美在线看片a免费观看| 亚洲国产裸拍裸体视频在线观看乱了 | 99成人在线| 激情视频一区二区| 亚洲风情在线资源站| 在线视频你懂得一区| 亚洲三级免费| 免费91麻豆精品国产自产在线观看| 在线观看视频一区二区| 国产亚洲精品久久久久久| 午夜欧美不卡精品aaaaa| 另类图片国产| 亚洲欧美日韩精品久久久| 亚洲美女中文字幕| 久久视频一区二区| 久久久久久久成人| 亚洲精品久久久久中文字幕欢迎你| 亚洲日本黄色| 国产农村妇女毛片精品久久莱园子| 国产综合自拍| 亚洲国产视频a| 国产欧美日韩亚州综合| 亚洲综合成人在线| 欧美成人精品一区| 亚洲一二三四区| 欧美激情2020午夜免费观看| 欧美二区在线观看| 欧美电影免费观看高清完整版| 国产精品久久久久国产精品日日 | 久久视频这里只有精品| 亚洲精品日韩在线观看| 亚洲国产精品一区二区www| 最新成人av网站| 亚洲盗摄视频| 亚洲美女毛片| 亚洲一区二区精品| 欧美亚洲综合在线| 国产偷国产偷精品高清尤物| 亚洲午夜精品网| 久久久精品一区二区三区| 一区二区亚洲精品| 日韩午夜精品| 午夜精品久久久久| 午夜精品999| 免费欧美日韩| 久久高清国产| 国产精品免费福利| 亚洲伦理自拍| 亚洲性色视频| 亚洲国产成人tv| 欧美成人免费大片| 久久夜色精品一区| 亚洲欧洲另类国产综合| 免费在线观看日韩欧美| 亚洲午夜视频在线观看| 久久综合免费视频影院| 亚洲欧洲美洲综合色网| 亚洲免费一在线| 亚洲免费视频观看| 另类天堂av| 奶水喷射视频一区| 亚洲小少妇裸体bbw| 妖精成人www高清在线观看| 欧美天堂在线观看| 久久久xxx| 欧美一区二区高清| 国产精品福利在线| 欧美在线视频播放| 你懂的国产精品永久在线| 中文国产一区| 久久激情视频免费观看| 91久久久久久久久久久久久| 99精品久久久| 午夜精品视频在线| 亚洲久久在线| 亚洲欧美日韩成人| 亚洲欧洲午夜| 欧美亚洲在线观看| 99在线热播精品免费99热| 欧美国产第一页| 国产精品一区免费观看| 欧美国产视频日韩| 国产日韩1区| 亚洲日韩中文字幕在线播放| 国产精品一区免费在线观看| 欧美福利视频在线| 国产精品二区在线观看| 欧美激情一级片一区二区| 欧美三级电影网| 欧美丰满高潮xxxx喷水动漫| 欧美一区国产在线| 欧美韩日视频| 性欧美1819sex性高清| 国产美女精品视频| 久久一区二区三区超碰国产精品| 亚洲国产精品女人久久久| 欧美专区福利在线| 国产一区二区精品久久99| 亚洲黄色一区二区三区| 在线一区二区视频| 国产主播精品在线| 中日韩美女免费视频网址在线观看 | 国产精品久久久久久久电影| 亚洲福利视频网站| 国内精品美女av在线播放| 亚洲一区欧美一区| 亚洲免费视频中文字幕| 欧美日韩高清免费| 亚洲激情校园春色| 亚洲精品在线视频| 嫩草成人www欧美| 亚洲国产高清aⅴ视频| 亚洲国产欧美在线人成| 久久这里有精品视频| 亚洲影视在线播放| 欧美日韩综合在线免费观看| 亚洲精品日韩久久| 亚洲一区二区三区四区中文| 欧美视频日韩| 中文一区二区| 欧美在线关看| 亚洲国产欧美在线| 国产精品久久久久三级| 久久精品在线视频| av不卡在线| 欧美jizz19性欧美| 欧美一区二区三区免费视| 在线免费一区三区| 国产精品九色蝌蚪自拍| 久久精品一区二区| 一区二区三区.www| 欧美黄色aa电影| 欧美专区日韩专区| 夜夜夜精品看看| 国产曰批免费观看久久久| 欧美大色视频| 欧美一区二区观看视频| 一本色道久久综合亚洲精品婷婷| 久久九九国产| 亚洲夜间福利| 亚洲精品在线视频| 黄色小说综合网站| 国产精品欧美久久久久无广告| 久久视频这里只有精品| 一区二区三区欧美激情| 欧美高清不卡在线| 久久精品视频亚洲| 亚洲欧美日韩国产一区二区三区| 亚洲风情在线资源站| 国产欧美一区二区精品秋霞影院 | 欧美一级片久久久久久久| 欧美二区不卡| 欧美人与性动交cc0o| 亚洲精品在线视频观看| 亚洲精品免费在线| 欧美日韩久久精品| 久热成人在线视频| 欧美精品日韩一区| 免费亚洲一区| 久久国产一区| 亚洲专区一二三| 一区二区三区av| 在线看片一区| 一区久久精品| 国内一区二区三区| 国产亚洲精品一区二区| 欧美亚韩一区| 欧美午夜三级| 国产精品扒开腿爽爽爽视频 | 国产精品久久久久久久app| 欧美精品尤物在线| 欧美国产91| 久久伊伊香蕉| 久久久久综合网| 久久久久久穴| 久久免费高清视频| 欧美中文字幕视频| 午夜国产不卡在线观看视频| 99精品视频免费观看视频| 亚洲精品日产精品乱码不卡| 亚洲精品视频在线观看免费| 亚洲国产精品专区久久| 国产精品久久久爽爽爽麻豆色哟哟 | 久久狠狠一本精品综合网| 亚洲精品一区二区三区四区高清| 亚洲精选大片| 亚洲国产精品综合| 亚洲在线中文字幕| 99pao成人国产永久免费视频| 欧美一区二区视频在线| 亚洲欧美日本视频在线观看| 国产精品av一区二区| 欧美日韩国产精品一卡| 久久精品一区蜜桃臀影院| 亚洲黄色影院| 欧美日韩亚洲网|