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

天行健 君子當自強而不息

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

評論

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

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


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


公告

導航

統計

常用鏈接

隨筆分類(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>
            久久全球大尺度高清视频| 亚洲欧美日韩天堂| 欧美激情亚洲激情| 久久精品三级| 久久精视频免费在线久久完整在线看| 99re热精品| 亚洲一区国产视频| 亚洲欧美日韩精品久久奇米色影视| 在线视频日本亚洲性| 中文一区二区| 久久激情一区| 欧美va亚洲va国产综合| 欧美精品一区二区蜜臀亚洲| 欧美日韩亚洲国产精品| 国产精品久久久久久久久久久久 | 亚洲欧美日韩另类精品一区二区三区| 国产一区二区福利| 影音先锋一区| 中文精品视频一区二区在线观看| 亚洲欧美日韩专区| 模特精品裸拍一区| 日韩视频国产视频| 久久精品午夜| 国产精品成人观看视频国产奇米| 国产欧美日韩综合一区在线播放| 狠狠88综合久久久久综合网| 日韩一级网站| 久久久免费精品| 99re6这里只有精品视频在线观看| 午夜在线观看欧美| 欧美日本中文字幕| 在线免费一区三区| 久久国产夜色精品鲁鲁99| 最新国产成人在线观看| 亚洲免费在线电影| 欧美精品99| 亚洲第一在线| 久久久久国产精品人| 一区二区免费在线视频| 免费视频亚洲| 精品91久久久久| 欧美亚洲一区二区在线| 亚洲免费观看在线视频| 欧美成人精品影院| **性色生活片久久毛片| 久久精品国产综合精品| 亚洲综合成人在线| 国产精品久久国产三级国电话系列| 亚洲精品欧美日韩专区| 免费观看成人鲁鲁鲁鲁鲁视频| 亚洲一区二区少妇| 国产精品久久久久影院色老大 | 妖精视频成人观看www| 美日韩精品免费| 欧美在线不卡| 国产日韩视频| 欧美在线视频一区二区三区| 中文av字幕一区| 国产精品v欧美精品v日韩精品| 日韩一区二区久久| 日韩午夜电影| 国产精品jizz在线观看美国 | 久久久免费av| 久久精品亚洲精品国产欧美kt∨| 国产欧美三级| 久久亚洲春色中文字幕久久久| 亚洲精品一区在线观看| 精品69视频一区二区三区| 日韩一二三区视频| 亚洲国产导航| 欧美区在线播放| 亚洲在线网站| 亚洲欧美日韩综合国产aⅴ| 国产麻豆视频精品| 久久九九全国免费精品观看| 久久国产精品99精品国产| 在线精品一区二区| 亚洲日本精品国产第一区| 欧美视频四区| 久久精品最新地址| 欧美 日韩 国产在线| 亚洲私人影吧| 欧美中文字幕在线| 亚洲免费高清视频| 亚洲小说欧美另类社区| 韩国欧美国产1区| 亚洲精品老司机| 国产欧美一区二区精品性色| 欧美va日韩va| 国产精品黄视频| 可以免费看不卡的av网站| 欧美黄网免费在线观看| 性久久久久久久| 蜜桃av一区二区| 亚洲欧美日韩直播| 麻豆精品国产91久久久久久| 亚洲视频在线视频| 久久久国产成人精品| 国产精品99久久久久久久女警 | 亚洲精品国产精品国产自| 国产精品久久久久91| 免费观看日韩av| 国产精品久久久久久亚洲调教 | 国内精品久久国产| 亚洲精品乱码久久久久久| 国模精品一区二区三区| 亚洲伦理网站| 亚洲电影免费在线观看| 午夜国产精品视频| 亚洲小说欧美另类社区| 免播放器亚洲| 久久久噜噜噜久久人人看| 国产精品福利久久久| 亚洲成人在线免费| 一区二区三区日韩在线观看| 欧美一区=区| 亚洲淫片在线视频| 欧美国产日本| 欧美成人精品福利| 韩国av一区二区三区四区| 亚洲欧美日韩精品| 亚洲一区国产视频| 欧美理论大片| 亚洲激情av在线| 亚洲免费视频网站| 欧美四级伦理在线| 美国成人直播| 国产亚洲a∨片在线观看| 99riav国产精品| aa成人免费视频| 欧美激情一区二区三区在线| 欧美国产日韩xxxxx| 亚洲电影免费观看高清| 久久亚洲春色中文字幕| 另类人畜视频在线| 一区二区在线视频| 久久免费视频在线| 欧美成人精品在线播放| 在线看欧美日韩| 久久这里只有精品视频首页| 美女黄网久久| 亚洲欧洲在线播放| 欧美久久久久久久久久| 亚洲人成免费| 在线一区二区三区四区五区| 欧美午夜女人视频在线| 一区二区三区www| 欧美一区二区高清| 国产一区二区在线观看免费| 久久精品在线观看| 欧美激情在线狂野欧美精品| 亚洲国产一区二区三区在线播| 免费在线看一区| 日韩视频在线免费| 亚洲一区二区三区高清不卡| 国产精品入口尤物| 久久疯狂做爰流白浆xx| 欧美搞黄网站| 在线视频一区观看| 国产精品一二三四| 久久久久久久91| 亚洲国产精品一区制服丝袜| 亚洲一卡久久| 精品69视频一区二区三区| 欧美激情第9页| 亚洲欧美在线x视频| 欧美 日韩 国产一区二区在线视频| 日韩视频免费观看高清完整版| 国产精品久久久久999| 久久久噜噜噜| 一区二区三区四区五区精品视频 | 亚洲伊人伊色伊影伊综合网| 国产欧美一区二区三区在线看蜜臀 | 国产精品白丝jk黑袜喷水| 亚洲欧美一区二区精品久久久| 久久综合久久久久88| 一本综合久久| 国内精品视频一区| 欧美日韩亚洲一区二区三区四区 | 午夜视频在线观看一区二区| 女生裸体视频一区二区三区| 亚洲一级影院| 亚洲精品日韩综合观看成人91| 国产精品免费一区二区三区在线观看 | 亚洲国产一区二区在线| 亚洲毛片在线免费观看| 国产精品久久国产三级国电话系列 | 欧美亚洲成人免费| 久久久美女艺术照精彩视频福利播放 | 欧美有码视频| av成人激情| 亚洲福利国产| 国产视频一区在线观看一区免费 | 在线观看日韩精品| 国产精品一区免费视频| 欧美激情精品久久久| 欧美中日韩免费视频| 99国产精品视频免费观看一公开| 欧美成人嫩草网站| 久久亚洲不卡|