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

天行健 君子當自強而不息

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>
            欧美成人免费一级人片100| 国产精品第13页| 亚洲在线免费视频| 中文在线资源观看视频网站免费不卡| 欧美黄网免费在线观看| 亚洲国产精品小视频| 欧美www在线| 91久久国产精品91久久性色| 日韩一区二区精品在线观看| 中文精品视频一区二区在线观看| 午夜精品久久久久久久99黑人| 欧美尤物巨大精品爽| 麻豆成人在线| 国产精品欧美久久| 在线观看亚洲专区| 在线视频精品| 久久综合狠狠综合久久综合88| 亚洲国产小视频在线观看| 亚洲天堂男人| 免费久久99精品国产自| 国产精品久久久久毛片软件| 在线免费一区三区| 亚洲欧美国产高清| 欧美第一黄色网| 亚洲欧美日韩精品久久奇米色影视| 久热国产精品| 国产精品免费看| 亚洲欧美日本日韩| 欧美成人伊人久久综合网| 国产精品一区久久| 一区二区福利| 欧美电影免费网站| 欧美一区二区在线观看| 欧美日韩中文字幕日韩欧美| 在线欧美视频| 久久精品亚洲一区| 中文欧美在线视频| 欧美激情一区二区| 亚洲国产精品视频一区| 久久国产99| 亚洲午夜一区二区| 欧美日韩一区视频| 一区二区免费在线播放| 欧美激情1区2区3区| 久久riav二区三区| 国产精品视频xxxx| 亚洲一区网站| 一本久道综合久久精品| 欧美大尺度在线| 亚洲国产欧美不卡在线观看| 久久久综合免费视频| 亚洲欧美一区二区精品久久久| 欧美人妖另类| 一区二区av在线| 99av国产精品欲麻豆| 欧美日韩第一区日日骚| 夜夜爽av福利精品导航| 亚洲精品女人| 欧美wwwwww| 99精品热视频只有精品10| 亚洲激情视频网站| 欧美国产一区二区在线观看| 亚洲日本一区二区| 亚洲人www| 欧美无砖砖区免费| 性感少妇一区| 欧美在线视频导航| 亚洲第一页在线| 欧美成人免费观看| 欧美激情综合在线| 亚洲一区二区三区久久| 亚洲已满18点击进入久久| 国产欧美一区二区在线观看| 久久精品成人欧美大片古装| 午夜精品国产更新| 亚洲成色777777女色窝| 亚洲国产一区二区视频| 欧美日韩精品一区二区在线播放 | 欧美电影免费网站| 欧美国产亚洲另类动漫| 亚洲一区二区在线播放| 羞羞漫画18久久大片| 精品999成人| 正在播放欧美一区| 一区二区高清| 狠狠久久亚洲欧美| 亚洲激情在线激情| 国产精品美女久久久免费| 亚洲欧美亚洲| 久热精品视频在线| 亚洲专区欧美专区| 久久精品一区二区三区不卡牛牛| 亚洲国产精品第一区二区三区| 亚洲精品系列| 好吊视频一区二区三区四区| 亚洲精品日韩在线观看| 国产精品久久久久999| 欧美fxxxxxx另类| 国产精品久久久久久久久免费樱桃| 久久xxxx精品视频| 欧美精品一区二区蜜臀亚洲| 久久狠狠亚洲综合| 欧美日韩在线观看一区二区| 麻豆精品视频在线观看| 国产精品久久久久国产精品日日 | 欧美一区二区三区四区视频| 久久综合国产精品| 亚洲欧美激情在线视频| 麻豆成人在线| 久久综合中文| 国产欧美精品一区二区色综合 | 久久久人成影片一区二区三区| 夜夜精品视频一区二区| 久久久亚洲精品一区二区三区| 亚洲伊人伊色伊影伊综合网| 欧美v亚洲v综合ⅴ国产v| 久久久最新网址| 国产欧美一区二区精品忘忧草| 亚洲精品国偷自产在线99热| 亚洲高清久久| 久久免费精品视频| 久久久久久免费| 国产午夜亚洲精品不卡| 亚洲性感激情| 亚洲欧美国产另类| 欧美视频在线看| av成人国产| 亚洲午夜一区二区| 欧美亚一区二区| 一区二区欧美日韩视频| 亚洲天堂网在线观看| 欧美日韩在线高清| 一区二区三区国产精品| 亚洲无亚洲人成网站77777| 欧美片第一页| 一区二区三区国产盗摄| 亚洲已满18点击进入久久| 国产精品爱啪在线线免费观看| 夜夜狂射影院欧美极品| 亚洲一区二区三区高清不卡| 欧美午夜精品久久久久久浪潮 | 免费日韩成人| 在线观看亚洲视频| 麻豆91精品| 91久久一区二区| aa级大片欧美三级| 99re亚洲国产精品| 亚洲免费在线视频一区 二区| 国产精品v欧美精品v日韩精品| 一区二区高清视频| 午夜在线精品| 狠狠久久亚洲欧美专区| 免费在线观看一区二区| 91久久精品国产91久久性色tv| 一区二区三区高清不卡| 国产精品九九久久久久久久| 亚洲欧美在线免费| 奶水喷射视频一区| 99视频国产精品免费观看| 国产精品美女久久久久久久| 久久黄金**| 亚洲精品视频一区| 久久www成人_看片免费不卡| 亚洲人成在线播放| 国产精品女主播一区二区三区| 欧美在线观看视频一区二区三区| 女人天堂亚洲aⅴ在线观看| 一区二区三区久久精品| 国产揄拍国内精品对白| 欧美久久久久久久久久| 欧美一区二区成人6969| 亚洲激情影院| 久久婷婷国产综合国色天香| 一区二区三区欧美日韩| 狠狠综合久久av一区二区小说| 欧美区在线播放| 久久先锋影音av| 亚洲女同在线| 亚洲另类自拍| 女同性一区二区三区人了人一| 亚洲女女女同性video| 亚洲黄色精品| 黄色精品一区二区| 国产精品免费一区豆花| 欧美劲爆第一页| 久久久爽爽爽美女图片| 亚洲女人小视频在线观看| 最新国产成人在线观看| 老鸭窝毛片一区二区三区| 亚洲影院色在线观看免费| 亚洲激情成人网| 国内精品视频666| 国产精品大片| 欧美日韩国产成人精品| 麻豆精品国产91久久久久久| 性欧美videos另类喷潮| 亚洲视频图片小说| 亚洲精品乱码久久久久| 亚洲高清视频的网址| 欧美a级片网|