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

天行健 君子當自強而不息

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>
            久久另类ts人妖一区二区| 亚洲精品一区二区在线观看| 亚洲伊人第一页| 国产精品美女久久| 午夜激情亚洲| 久久国产精品黑丝| 亚洲高清资源| 亚洲黄色成人久久久| 免费在线观看日韩欧美| 制服诱惑一区二区| 亚洲欧美亚洲| 亚洲激情成人网| 中文一区字幕| 国产在线观看91精品一区| 欧美国产91| 国产精品尤物福利片在线观看| 欧美中文在线免费| 欧美激情一区二区三区成人| 亚洲欧美综合国产精品一区| 久久久999| 亚洲深夜影院| 久久亚洲影院| 亚洲视屏在线播放| 久久精品国产在热久久| 99综合电影在线视频| 欧美一区二区久久久| 亚洲人成在线影院| 性欧美video另类hd性玩具| 亚洲国产va精品久久久不卡综合| 中文国产亚洲喷潮| 亚洲精品久久| 久久不见久久见免费视频1| 亚洲人成小说网站色在线| 欧美亚洲日本一区| av成人免费观看| 久久综合九色综合欧美就去吻| 亚洲欧美久久久久一区二区三区| 美女在线一区二区| 久久成人精品电影| 国产精品成人一区二区艾草| 欧美高清视频一区二区三区在线观看| 国产精品网曝门| 亚洲精品女av网站| 国产日韩一区二区| 亚洲一区二区在线观看视频| 最近看过的日韩成人| 久久九九久久九九| 久久久久中文| 国产欧美日本在线| 亚洲一区视频在线| 亚洲一区二区免费| 欧美日本高清一区| 欧美激情一区二区久久久| 国产一区99| 欧美一区二区播放| 久久精品国产成人| 国产免费成人av| 中文精品99久久国产香蕉| 日韩一级大片| 美女精品在线观看| 免费观看久久久4p| 黄色成人91| 久久久久综合| 可以免费看不卡的av网站| 国产欧美综合一区二区三区| 亚洲女性裸体视频| 亚洲欧美激情四射在线日| 欧美日韩中文字幕日韩欧美| 亚洲国产精品美女| 一区二区三区www| 欧美巨乳波霸| 亚洲在线成人| 久久婷婷丁香| 国产一区二区三区在线观看网站| 亚洲一区二区视频在线| 午夜精品福利视频| 国产精品v欧美精品v日韩| 亚洲国产免费| 日韩午夜三级在线| 欧美成人免费视频| 免费在线播放第一区高清av| 亚洲国产精品欧美一二99| 免费亚洲婷婷| aa级大片欧美三级| 欧美一级精品大片| 亚洲经典一区| 国产精品理论片| 久久精品电影| 亚洲国产精品久久| 在线亚洲欧美视频| 国产精品区免费视频| 久久国产日韩欧美| 亚洲第一福利社区| 亚洲网站在线观看| 国产一区二区久久久| 美女尤物久久精品| 一本久久青青| 久久资源av| 中文在线不卡视频| 国产在线观看精品一区二区三区| 欧美 亚欧 日韩视频在线| 亚洲欧美日韩国产成人| 欧美护士18xxxxhd| 欧美伊人久久大香线蕉综合69| 亚洲高清不卡av| 国产精品亚洲综合一区在线观看| 久久视频在线视频| 亚洲桃花岛网站| 欧美黄网免费在线观看| 亚洲欧美日韩久久精品| 亚洲高清不卡在线| 国产精品你懂的在线| 久久亚洲影院| 午夜精品一区二区三区在线| 亚洲国产综合在线| 亚洲欧美另类在线| 夜夜嗨一区二区| 国产在线乱码一区二区三区| 欧美日韩国产色视频| 久久九九精品| 午夜激情综合网| 亚洲一区二区三区四区五区午夜| 亚洲欧洲在线观看| 欧美成人国产va精品日本一级| 久久av在线| 亚洲欧美日韩国产一区| 亚洲人www| 亚洲国产精品久久久久婷婷884| 国产日韩视频| 国产精品女主播一区二区三区| 免费不卡亚洲欧美| 久久精品成人一区二区三区蜜臀| 亚洲欧美日韩国产综合精品二区| 日韩视频免费在线| 欧美福利一区| 欧美成人免费播放| 鲁大师成人一区二区三区| 久久久九九九九| 久久九九免费视频| 玖玖综合伊人| 美女脱光内衣内裤视频久久影院 | 久久综合综合久久综合| 久久九九免费视频| 久久亚洲欧美国产精品乐播| 欧美在线关看| 久久精品一本| 久久精品视频一| 久久久久久久久久久久久9999| 久久久综合网站| 欧美 日韩 国产一区二区在线视频| 女人色偷偷aa久久天堂| 蜜臀av国产精品久久久久| 你懂的视频一区二区| 欧美福利电影网| 亚洲精品偷拍| 亚洲一二三级电影| 欧美一区影院| 久久频这里精品99香蕉| 美日韩精品免费| 免费不卡欧美自拍视频| 欧美视频一区在线| 国产精品国产a级| 好看的av在线不卡观看| 亚洲美女中文字幕| 亚洲欧美国产77777| 久久久久.com| 亚洲欧洲综合另类| 亚洲与欧洲av电影| 另类人畜视频在线| 欧美三级欧美一级| 韩国精品一区二区三区| 亚洲另类黄色| 久久av一区二区三区漫画| 欧美激情精品| 亚洲一区视频在线| 免费欧美电影| 国产精品免费看片| 91久久精品www人人做人人爽| 一区二区高清视频| 久久精品1区| 亚洲国产精品综合| 亚洲欧美国产一区二区三区| 欧美成人精品在线观看| 欧美精品一区二区三| 国模套图日韩精品一区二区| 一区二区三区精品| 欧美成人一区二区在线| 亚洲永久精品大片| 欧美日韩美女| 1000部精品久久久久久久久| 亚洲女优在线| 日韩亚洲欧美精品| 久久综合网络一区二区| 国产色婷婷国产综合在线理论片a| 日韩一级在线| 蜜桃av久久久亚洲精品| 亚洲一区三区视频在线观看 | 老司机久久99久久精品播放免费| 国产精品激情偷乱一区二区∴| 亚洲区一区二区三区|