• <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>

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

            Working with skeletal animation(6)

            Mapping Bones to Frames

            If you peruse an .X file, you might notice some similarities between the Frame data objects and the SkinWeights objects. For every bone in your skeletal structure, there is a matching SkinWeights object embedded inside a Mesh object that contains the name of a Frame object (or a reference to a Frame object). That's right−each bone is named after its corresponding Frame data object!

            After you load your skinned mesh, you need to connect each bone to its corresponding frame. This is simply a matter of iterating all bones, getting the name of each, and searching the list of frames for a match. Each matching frame pointer is stored in a special bone structure of your design.

            I embedded the bone−mapping data in the D3DXMESHCONTAINER_EX structure. The D3DXMESHCONTAINER_EX structure adds an array of texture objects, a secondary mesh container object, and the bone−mapping data to the D3DXMESHCONTAINER structure.

            struct D3DXMESHCONTAINER_EX : D3DXMESHCONTAINER
            {
              IDirect3DTexture9 **pTextures;
              ID3DXMesh *pSkinMesh;
              D3DXMATRIX **ppFrameMatrices;
              D3DXMATRIX *pBoneMatrices;

              // .. extra data and functions to follow
            };

            For this chapter, the important variables are ppFrameMatrices and pBoneMatrices. The pBoneMatrices array contains the transformations from your bone hierarchy; one transformation matrix is applied to each vertex belonging to the appropriate bone. The only problem is, the transformations from your bones are not stored in an array; they're stored as a hodgepodge of single transformations spread throughout the hierarchy.

            The D3DXMESHCONTAINER_EX structure provides a pointer to each bone transformation matrix contained within the hierarchy of D3DXFRAME_EX objects inside an array of pointers (ppFrameMatrices). Using these pointers, you can pull each bone transformation and place it into the pBoneMatrices array you'll create and use during the call to update your skinned mesh.

            You can create the array of pointers and the array of matrices after you load the bone hierarchy by taking the number of bones from the hierarchy and allocating an array of D3DXMATRIX pointers and D3DXMATRIX objects, like this:

            // pSkinInfo = skinned mesh object

            // Get the number of bones in the hierarchy
            DWORD NumBones = pSkinInfo−>GetNumBones();

            // Allocate an array of D3DXMATRIX pointers to point to each bones' transformation.
            D3DXMATRIX *ppFrameMatrices = new D3DXMATRIX*[NumBones];

            // Allocate an array of D3DXMATRIX matrix objects to contain the actual transformations
            // used to update the skinned mesh.
            D3DXMATRIX *pBoneMatrices = new D3DXMATRIX[NumBones];

            After you load your skinned mesh, you can set up the pointers to each bone transformation by querying the skinned mesh info object for each bone name. Using that, you can scan the list of frames for a match. For each matched bone, set the pointer to that frame's transformation matrix. When all bones and frames are matched up, you can then iterate the entire list and copy the matrices to the pBoneMatrices array.

            First let me show you how to match up the bones and frames. Remember that earlier in this chapter I mentioned that the bones are named after the frames. Using the ID3DXSkinInfo::GetBoneName function, you can obtain the name of the bone and frame to match.

            // Go through each bone and grab the name of each to work with
            for(DWORD i=0;i<pSkinInfo−>GetNumBones();i++) {
              // Get the bone name
              const char *BoneName = pSkinInfo−>GetBoneName(i);

            When you have the bone's name, you can scan through the list of frames in the hierarchy to look for a match. To do so, you use the recursive FindFrame function developed in the "Modifying Bone Orientation" section earlier in this chapter, as follows.

            // pRootFrame = D3DXFRAME_EX root frame object

            // Find matching name in frames
            D3DXFRAME_EX *pFrame = pRootFrame−>Find(BoneName);

            If a frame with the name provided by the bone is found, you can link to the frame's combined transformation matrix. If no match is found, then the link is set to NULL.

            // Match frame to bone
            if(pFrame)
              pMesh−>ppFrameMatrices[i] = &pFrame−>matCombined;
            else
              pMesh−>ppFrameMatrices[i] = NULL;
            }

            You might not understand the exact reasons for mapping the bones to the frame at this moment, but it will make more sense when you get into manipulating the skinned mesh and rebuilding the mesh to render it. For now, take each step in stride, and start by learning how to manipulate the skinned mesh.

             

            Manipulating the Skinned Mesh

            Now nothing is stopping you from twisting up that skeletal structure and going crazy. Just make sure it's your mesh's imaginary skeletal structure you're manipulating and not your own−I just hate it when I accidentally manipulate my bones into a pose I can't get out of for an hour! Kidding aside, you can now alter the frame orientations in your frame hierarchy. It's those frames that represent your bones.

            Speaking of altering the frame orientations, be aware that you should only rotate your bones; you should never translate them. Scaling is acceptable, but be careful−remember that all transformations propagate throughout the hierarchy. If you were to scale your character's upper arm, the lower arm would be scaled as well.

            I covered changing the orientations of the various bones earlier in this chapter, in the "Modifying Bone Orientation" section, so I won't rehash anything here. After you've loaded the skeletal structure and skinned mesh, feel free to start working with the bone transformations using those techniques covered earlier. When you're ready, you can update the skinned mesh and prepare it for rendering.


            posted on 2008-04-23 19:39 lovedday 閱讀(265) 評(píng)論(0)  編輯 收藏 引用


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


            公告

            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            隨筆分類(178)

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

            搜索

            最新評(píng)論

            国产A级毛片久久久精品毛片| 久久免费的精品国产V∧| 久久精品国产69国产精品亚洲| 国产精品美女久久久久久2018 | 99久久99这里只有免费的精品| 97久久精品人妻人人搡人人玩| 91精品婷婷国产综合久久| 亚洲伊人久久综合中文成人网| 亚洲级αV无码毛片久久精品| 99国产精品久久| 久久综合鬼色88久久精品综合自在自线噜噜 | 久久人人爽人人爽人人爽 | 欧美一区二区三区久久综合| 日本福利片国产午夜久久| 久久久久久久91精品免费观看| 国产V亚洲V天堂无码久久久| 久久只有这里有精品4| 久久综合九色综合欧美狠狠| 97久久婷婷五月综合色d啪蜜芽| 亚洲国产成人久久综合碰碰动漫3d| 综合久久精品色| 国产一区二区精品久久凹凸| A狠狠久久蜜臀婷色中文网| 97视频久久久| 一个色综合久久| 久久有码中文字幕| 久久久噜噜噜久久| 国产综合精品久久亚洲| 久久久久久狠狠丁香| 久久电影网一区| 久久99精品久久久久久hb无码 | 精品国产乱码久久久久久郑州公司| 亚洲日韩欧美一区久久久久我| 99久久国产免费福利| 国产V综合V亚洲欧美久久| 国产成人久久AV免费| 久久久久久亚洲AV无码专区| 午夜欧美精品久久久久久久| 日韩乱码人妻无码中文字幕久久| 亚洲中文字幕无码久久精品1| 99精品国产99久久久久久97|