• <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(1)

            Taking on Skeletal Animation

            Skeletal animation−two words that bring to mind thoughts of B−rate horror movies in which the dead have risen from the grave to stalk the living. However, those two words mean something entirely different to programmers. If you're like me, this topic gives you more tingles down your spine than any cheesy horror movie ever could.

            Skeletal animation is quickly becoming the animation technique of choice for programmers because it is quick to process and it produces incredible results. You can animate every detail of a character using skeletal animation. It gives you control of every aspect of the character's body, from the wrinkles in his skin to the bulges in his muscles. You can use every joint, bone, and muscle to deform the shape of your character's meshes.

            Think of skeletal animation like this: Your body (or at least your skin) is a mesh, complete with an underlying set of bones. As your muscles push, pull, and twist your bones, your body changes shape to match. Instead of thinking of the muscles changing the shape of your body, think of the bones altering the rotation of each body part.

            If you lift your arm your shoulder rotates, which in turn causes your entire arm to rotate and your skin to change shape. Your body (the mesh) changes shape to accommodate the changes in the bones. Skeletal animation works the same way. As the underlying skeletal structure changes orientation from the rotating of the joints, the overlaid mesh (appropriately called a skinned mesh) changes form to match.

            As you can see, there are two separate entities to deal with when you are working with skeletal animation−the skeletal structure and the skinned mesh. Take a closer look at each entity in more detail to see how they work in unison, starting with the skeletal structure.

             

            Using Skeletal Structures and Bone Hierarchies

            The skeletal structure, as you can imagine, is a series of connected bones that form a hierarchy (a bone hierarchy, to be exact). One bone, called the root bone, forms the pivotal point for the entire skeletal structure. All other bones are attached to the root bone, either as child or sibling bones.

            The word "bone" refers to a frame−of−reference object (a frame object, which is represented in DirectX by the D3DXFRAME structure or a Frame template inside .X files). If you were to examine the D3DXFRAME structure, you would indeed find the linked list pointers (D3DXFRAME::pFrameSibling and D3DXFRAME::pFrameFirstChild) that form the hierarchy. The pFrameSibling pointer links one bone to another on the same level in the hierarchy, whereas the pFrameFirstChild pointer links one bone to another as a child bone, which is one level lower in the hierarchy.

            Generally, you would use a 3D−modeling package to create these skeletal structures for your projects. Exporting the bone hierarchy in the form of an .X file is a perfect example. Microsoft has released exporters for 3D Studio Max and Maya that allow you to export skeletal and animation data into .X files, and many modeling programs have the same exporting capabilities. I'll assume you have a program that will export these hierarchies to an .X file for you.

            You'll find a number of things inside an .X file that contains skeletal animation data. First (and most important at this point), you'll find a hierarchy of Frame templates, which is your bone hierarchy in disguise.

            Now let me show you some contents from .x file named with tiniy.x:

            xof 0303txt 0032

            template Mesh
            {
                
            <3D82AB44-62DA-11CF-AB39-0020AF71E433>
                DWORD nVertices;
                array Vector vertices[nVertices];
                DWORD nFaces;
                array MeshFace faces[nFaces];
                []
            }

            template MeshFace
            {
                
            < 3D82AB5F-62DA-11cf-AB39-0020AF71E433 >
                DWORD nFaceVertexIndices;
                array DWORD faceVertexIndices[nFaceVertexIndices];


            template MeshNormals
            {
                
            < F6F23F43-7686-11cf-8F52-0040333594A3 >
                DWORD nNormals;
                array Vector normals[nNormals];
                DWORD nFaceNormals;
                array MeshFace faceNormals[nFaceNormals];


            template MeshTextureCoords
            {
                
            < F6F23F40-7686-11cf-8F52-0040333594A3 >
                DWORD nTextureCoords;
                array Coords2d textureCoords[nTextureCoords] ;


            template Coords2d
            {
                
            < F6F23F44-7686-11cf-8F52-0040333594A3 >
                
            float u;
                
            float v;
            }

            template VertexDuplicationIndices {
             
            <b8d65549-d7c9-4995-89cf-53a9a8b031e3>
             DWORD nIndices;
             DWORD nOriginalVertices;
             array DWORD indices[nIndices];
            }

            template MeshMaterialList
            {
                
            < F6F23F42-7686-11CF-8F52-0040333594A3 >
                DWORD nMaterials;
                DWORD nFaceIndexes;
                array DWORD faceIndexes[nFaceIndexes];
                [Material 
            <3D82AB4D-62DA-11CF-AB39-0020AF71E433>]


            template Material
            {
                
            < 3D82AB4D-62DA-11CF-AB39-0020AF71E433 >
                ColorRGBA faceColor;
                FLOAT power;
                ColorRGB specularColor;
                ColorRGB emissiveColor;
                []


            template ColorRGBA
            {
                
            < 35FF44E0-6C7C-11cf-8F52-0040333594A3 >
                
            float red;
                
            float green;
                
            float blue;
                
            float alpha;


            template XSkinMeshHeader {
             
            <3cf169ce-ff7c-44ab-93c0-f78f62d172e2>
             WORD nMaxSkinWeightsPerVertex;
             WORD nMaxSkinWeightsPerFace;
             WORD nBones;
            }

            template SkinWeights {
             
            <6f0d123b-bad2-4167-a0d0-80224f25fabb>
             STRING transformNodeName;
             DWORD nWeights;
             array DWORD vertexIndices[nWeights];
             array FLOAT weights[nWeights];
             Matrix4x4 matrixOffset;
            }

            ////////////////////////////////////////////////////////////////////////////////////////////////////

            Frame Scene_Root {
             
             FrameTransformMatrix {
              
            1.000000,0.000000,0.000000,0.000000,
              
            0.000000,1.000000,0.000000,0.000000,
              
            0.000000,0.000000,1.000000,0.000000,
              
            0.000000,0.000000,0.000000,1.000000;;
             }

             Frame body {
              
              FrameTransformMatrix {
               
            1.278853,0.000000,-0.000000,0.000000,
               
            0.000000,0.000000,1.123165,0.000000,
               
            0.000000,-1.470235,0.000000,0.000000,
               
            0.135977,2.027985,133.967667,1.000000;;
              }

              Frame {

               FrameTransformMatrix {
                
            1.000000,-0.000000,-0.000000,0.000000,
                
            -0.000000,1.000000,0.000000,0.000000,
                
            -0.000000,0.000000,1.000000,0.000000,
                
            -0.142114,0.000023,-49.556850,1.000000;;
               }

               Mesh {
                
            4432;            // nVertices: Number of vertices.
                
                
            -34.720058;-12.484819;48.088928;,  // vertices[nVertices]: Array of vertices  
             
                
            6841;            // nFaces: Number of faces
                
                
            3;61,0,4431;;    // faces[nFaces]: Array of faces, each of type MeshFace

                MeshNormals {
                 
            4432;            // nNormals: Number of normals  
                 
                 
            -0.914875;-0.152402;-0.373869;;    // normals[nNormals]: Array of normals
                 
                 
            6841;            // nFaceNormals: Number of face normals, equal to nFaces in Mesh.
                 
                 
            3;61,0,4431;;    // MeshFace faceNormals[nFaceNormals]:  Array of mesh face normals
                }

                MeshTextureCoords {
                 
            4432;                    // nTextureCoords: Number of texture coordinates
                 
                 
            0.551922;0.238188;;    // Coords2d textureCoords[nTextureCoords]: Array of 2D texture coordinates
                }

                VertexDuplicationIndices {
                 
            4432;        // nIndices: Number of vertex indices. This is the number of vertices in the mesh. 
                 3420;        // nOriginalVertices: Number of vertices in the mesh before any duplication occurs. 
                 
                 
            0,            // The value indices[n] holds the vertex index that vertex[n] in the vertex array for the mesh 
                 1,            // would have had if no duplication had occurred. Indices in this array that are the same, 
                 2,            // therefore, indicate duplicate vertices. 
                 
                 
            3418,
                 
            3419,
                 
                 
            1,
                 
            62,
                 
            11,
                 
                 
            3419;
                }

                MeshMaterialList {
                 
            1;            // nMaterials: A DWORD. The number of materials     
                 6841;        // nFaceIndexes: A DWORD. The number of indices.
                 
                 
            0,            // faceIndexes[nFaceIndexes]: An arrray of DWORDs containing the face indices
                 
                 
            0;

                 Material {
                  
            1.000000;1.000000;1.000000;1.000000;;    // faceColor: Face color. A ColorRGBA template.
                  0.000000;                                // power: Material specular color exponent.
                  1.000000;1.000000;1.000000;;            // specularColor: Material specular color. A ColorRGB template. 
                  0.000000;0.000000;0.000000;;            // emissiveColor: Material emissive color. A ColorRGB template.

                  TextureFilename {
                     
            "Tiny_skin.bmp";
                  }
                 }
                }

                XSkinMeshHeader {
                 
            2;        // nMaxSkinWeightsPerVertex: Maximum number of transforms that affect a vertex in the mesh
                 4;        // nMaxSkinWeightsPerFace: Maximum number of unique transforms that affect the three vertices of any face
                 35;    // nBones: Number of bones that affect vertices in this mesh
                }

                SkinWeights {
                 
            "Bip01_R_UpperArm";    // transformNodeName
                 156;                    // nWeights: the number of vertices affected by this bone
                 
                 
            0,                        // vertexIndices[nWeights]: the vertices influenced by this bone
                 3449,
                 
                 
            1738;
                 
                 
            0.605239,                // weights[nWeights]: the weights for each of the vertices influenced by this bone
                 
                 
            0.979129;
                 
                 
            // matrixOffset: The matrix matrixOffset transforms the mesh vertices to the space of the bone. 
                 
            // When concatenated to the bone's transform, this provides the world space coordinates of the mesh 
                 
            // as affected by the bone. 
                 -0.941743,-0.646748,0.574719,0.000000,    
                 
            -0.283133,-0.461979,-0.983825,0.000000,
                 
            0.923060,-1.114919,0.257891,0.000000,
                 
            -65.499557,30.497688,12.852692,1.000000;;
                }   

                

                SkinWeights {
                 
            "Bip01_Head";    // transformNodeName
                 1955;            // nWeights: the number of vertices affected by this bone

                 
            1746,            // vertexIndices[nWeights]: the vertices influenced by this bone
                 
                 
            3417;

                 
            1.000000,        // weights[nWeights]: the weights for each of the vertices influenced by this bone
                 
                 
            1.000000;

                 
            // matrixOffset: The matrix matrixOffset transforms the mesh vertices to the space of the bone. 
                 
            // When concatenated to the bone's transform, this provides the world space coordinates of the mesh 
                 
            // as affected by the bone. 
                 0.000000,-0.000002,1.278853,0.000000,
                 
            1.112235,-0.156313,-0.000000,0.000000,
                 
            0.204616,1.455927,0.000002,0.000000,
                 
            -61.950306,-62.105236,-0.142288,1.000000;;
                }
               }    
            // Mesh
              }        // frame
             }        // Body


             Frame Box01 {  

              FrameTransformMatrix {
               
            -1.000000,0.000000,-0.000000,0.000000,
               
            -0.000000,0.000000,1.000000,0.000000,
               
            0.000000,1.000000,0.000000,0.000000,
               
            -88.696747,-246.341751,858.815247,1.000000;;
              }

              Frame Bip01 {
               
               FrameTransformMatrix {
                
            0.186552,-0.974653,0.123489,0.000000,
                
            0.982171,0.187991,0.000000,0.000000,
                
            -0.023215,0.121288,0.992346,0.000000,
                
            -88.977890,-857.346008,247.541595,1.000000;;
               }
             }
             
             
            }

             

            You should find a standard Mesh data object embedded in the Frame data object hierarchy. The Mesh data object contains information about your skeletal animation object and the bones used in your skeletal structure. That's right−the Frame data object and the Mesh object both contain information about your skeletal structure! Whereas the Frame objects define the actual hierarchy, the Mesh object defines which frames represent the bones.

            For now, however, the importance of the bone data is irrelevant. Because the bones depend on the frame hierarchy, it's important to concentrate solely on the frames at this point. You simply need to load the hierarchy (from an .X file, for example) and set it up for later use. Read on to see how to load hierarchies from .X.


            posted on 2008-04-23 16:52 lovedday 閱讀(679) 評(píng)論(1)  編輯 收藏 引用

            評(píng)論

            # re: Working with skeletal animation(1) 2008-10-11 01:00 sky11811

            呵呵呵 大段的貼書本啊 有意思嗎 我還以為你寫的呢
              回復(fù)  更多評(píng)論   


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


            公告

            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            隨筆分類(178)

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

            搜索

            最新評(píng)論

            欧美久久久久久午夜精品| 综合网日日天干夜夜久久| 韩国免费A级毛片久久| 久久亚洲私人国产精品vA| 国产婷婷成人久久Av免费高清| 久久精品国产亚洲av日韩| 麻豆精品久久精品色综合| 久久综合偷偷噜噜噜色| 91视频国产91久久久| 精品人妻伦九区久久AAA片69| 99国产精品久久| 久久精品亚洲欧美日韩久久| 久久亚洲精品中文字幕| 7国产欧美日韩综合天堂中文久久久久| 人人狠狠综合久久亚洲高清| 精品久久久久久成人AV| 中文字幕精品久久久久人妻| AV无码久久久久不卡蜜桃| 亚洲国产成人乱码精品女人久久久不卡| 亚洲国产精品成人久久| 久久这里只有精品视频99| 久久久久久国产精品无码超碰| 久久av免费天堂小草播放| 9久久9久久精品| 狠狠精品久久久无码中文字幕| AA级片免费看视频久久| 久久99久久99精品免视看动漫| 综合久久一区二区三区 | 思思久久99热只有频精品66| 国产综合久久久久| 亚洲色婷婷综合久久| 久久久久亚洲AV无码专区桃色| 精品999久久久久久中文字幕| 99久久精品国产一区二区| 无码国内精品久久综合88| 久久精品无码av| 久久高清一级毛片| 亚洲精品第一综合99久久| 一本大道久久香蕉成人网| 狠狠色丁香婷婷久久综合| 国产成人综合久久精品红|