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

天行健 君子當自強而不息

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

評論

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

呵呵呵 大段的貼書本啊 有意思嗎 我還以為你寫的呢
  回復  更多評論   

公告

導航

統計

常用鏈接

隨筆分類(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>
            亚欧成人在线| 99pao成人国产永久免费视频| 久久综合国产精品| 久久激情视频| 免费中文字幕日韩欧美| 蜜桃av一区二区| 欧美日韩精品在线视频| 国产精品国产三级国产普通话99 | 亚洲伊人网站| 欧美一区二区免费| 久久久国产亚洲精品| 免费试看一区| 日韩一级大片在线| 中文亚洲欧美| 久久久噜噜噜久久| 欧美日韩天堂| 伊人久久婷婷色综合98网| 亚洲日本成人网| 欧美一区二区三区日韩视频| 久热这里只精品99re8久| 亚洲精品美女免费| 91久久久在线| 亚洲欧洲一区| 亚洲少妇中出一区| 久久婷婷国产综合国色天香| 亚洲人午夜精品| 欧美一区二区在线| 欧美日韩国产精品一区| 精品福利免费观看| 亚洲欧美日韩一区二区| 亚洲第一区在线观看| 亚洲欧美在线x视频| 欧美日韩国产系列| 亚洲国产精品一区二区尤物区| 亚洲欧美日韩国产一区| 亚洲高清资源| 久久久美女艺术照精彩视频福利播放| 欧美日韩情趣电影| 亚洲高清视频在线| 久久免费偷拍视频| 亚洲综合丁香| 欧美人与禽性xxxxx杂性| 在线成人激情视频| 久久久久久久一区二区| 国产一区二区三区直播精品电影 | 欧美sm重口味系列视频在线观看| 日韩亚洲在线观看| 免费人成精品欧美精品| 黄色一区二区在线| 久久久久久亚洲精品中文字幕| 一本色道久久综合狠狠躁篇怎么玩 | 中文一区在线| 欧美久久久久久久久| 亚洲高清毛片| 欧美成人亚洲| 久久综合图片| 亚洲二区视频在线| 美女网站在线免费欧美精品| 欧美一区二区三区在线看 | 国产精品人人做人人爽人人添| 日韩亚洲不卡在线| 亚洲成人在线视频播放 | 亚洲欧洲日本一区二区三区| 久久一区二区三区四区| 在线观看精品视频| 老妇喷水一区二区三区| 久久精品视频一| 黄色一区二区在线观看| 免费在线欧美视频| 久久亚洲私人国产精品va媚药| 黄色精品一区二区| 狂野欧美激情性xxxx欧美| 久久久久久免费| 91久久精品网| 亚洲毛片在线| 国产精品视频久久一区| 久久精品视频在线看| 欧美资源在线| 亚洲国产小视频在线观看| 欧美激情一区二区三区蜜桃视频| 欧美二区在线| 亚洲影视综合| 久久精品国产亚洲一区二区三区 | 欧美成人高清| 欧美成人午夜77777| 亚洲视频观看| 亚洲网站在线播放| 亚洲电影在线播放| 欧美三级在线视频| 久久国产福利| 美日韩精品视频免费看| 亚洲美女视频在线观看| 一区二区三区久久久| 国色天香一区二区| 亚洲精品美女在线观看播放| 国产精品美女主播| 欧美成人午夜激情| 国产精品久久久久毛片大屁完整版| 久久国产一区| 欧美精品18+| 久久亚洲私人国产精品va媚药| 欧美国产精品| 久久麻豆一区二区| 欧美性猛交xxxx乱大交蜜桃 | 一本色道久久综合亚洲精品按摩| 国产婷婷97碰碰久久人人蜜臀| 亚洲国产小视频| 国产日产欧产精品推荐色 | 欧美高清视频| 国产精品v片在线观看不卡| 久久久久成人精品免费播放动漫| 欧美成人精品不卡视频在线观看| 亚洲午夜精品福利| 浪潮色综合久久天堂| 销魂美女一区二区三区视频在线| 久久野战av| 欧美中文在线视频| 欧美日本三区| 蜜臀久久久99精品久久久久久| 欧美日韩视频专区在线播放 | 一区二区电影免费在线观看| 在线观看日韩一区| 亚洲欧美日本国产专区一区| av成人动漫| 欧美成人激情视频免费观看| 老司机成人在线视频| 国产香蕉久久精品综合网| 亚洲香蕉在线观看| 亚洲午夜国产一区99re久久 | 麻豆精品网站| 久久国产精品久久久久久| 亚洲美女少妇无套啪啪呻吟| 久久精品夜色噜噜亚洲a∨| 翔田千里一区二区| 国产精品一区二区在线| 亚洲午夜精品视频| 亚洲免费在线观看| 亚洲国产另类精品专区| 欧美母乳在线| 99国产精品| 亚洲视频免费看| 欧美日韩国产三区| 日韩一级欧洲| 亚洲欧美日韩区| 国产精品亚洲аv天堂网| 亚洲午夜高清视频| 亚洲综合三区| 国产麻豆日韩| 欧美专区在线播放| 免费看亚洲片| 日韩亚洲在线观看| 欧美性猛交xxxx乱大交蜜桃| 亚洲午夜久久久| 欧美在线免费观看亚洲| 国语自产精品视频在线看| 久久综合网色—综合色88| 亚洲国语精品自产拍在线观看| 日韩午夜在线播放| 国产精品成人免费| 久久av一区二区| 亚洲国产成人精品女人久久久| 亚洲最新视频在线播放| 国产精品中文字幕欧美| 久久精品国亚洲| 亚洲激情在线| 欧美一区二区三区精品电影| 狠狠色伊人亚洲综合网站色| 欧美aⅴ99久久黑人专区| 日韩性生活视频| 久久久欧美一区二区| 亚洲精品乱码久久久久久黑人| 欧美日韩国产一区| 欧美一区二区三区免费观看视频| 欧美ab在线视频| 亚洲欧美色婷婷| 亚洲国产精品国自产拍av秋霞| 欧美日韩视频在线观看一区二区三区| 香蕉视频成人在线观看| 亚洲激情在线观看| 久久精品一本| 国产精品99久久久久久有的能看| 国产午夜亚洲精品不卡| 欧美精品久久99| 久久国产精品久久久久久电车| 亚洲老司机av| 美女成人午夜| 久久岛国电影| 亚洲性感激情| 亚洲精品久久久久中文字幕欢迎你 | 国产精品亚发布| 欧美喷水视频| 麻豆视频一区二区| 欧美一区日韩一区| 中文一区二区| 亚洲精选视频免费看| 欧美成在线视频| 久久久久成人精品免费播放动漫| 亚洲午夜成aⅴ人片| 日韩亚洲欧美一区二区三区| 亚洲福利免费|