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

天行健 君子當自強而不息

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 閱讀(687) 評論(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>
            久久成人久久爱| 免费成人激情视频| 亚洲一本视频| 午夜久久久久久| 久久夜色精品国产噜噜av| 老色鬼久久亚洲一区二区| 欧美日韩亚洲精品内裤| 国产精品国产三级国产aⅴ浪潮 | av成人老司机| 亚洲一区区二区| 久久久夜夜夜| 国产精品扒开腿爽爽爽视频| 在线观看福利一区| 夜夜嗨av一区二区三区四区| 欧美亚洲免费电影| 欧美国产成人精品| 99热免费精品| 国产一区二区毛片| 亚洲精品免费在线播放| 亚洲免费一级电影| 欧美高清一区二区| 欧美日韩八区| 亚洲人成在线观看| 久久久国产精品亚洲一区| 亚洲国产天堂久久国产91| 亚洲黄色性网站| 午夜亚洲精品| 99视频超级精品| 国产一区二区三区在线观看免费视频 | 国内综合精品午夜久久资源| 亚洲少妇一区| 欧美jizzhd精品欧美喷水 | 亚洲高清自拍| 久久深夜福利| 午夜精品久久久久久久男人的天堂| 久久福利精品| 国产一区二区看久久| 亚洲第一主播视频| 国产精品日韩欧美| 一区二区三区|亚洲午夜| 亚洲国产精品久久久久秋霞不卡 | 欧美成人精品| 一区二区三区在线视频免费观看| 久久亚洲国产成人| 亚洲欧美日韩高清| 国产欧美精品国产国产专区| 久久成人免费日本黄色| 欧美日本一道本在线视频| 一区二区不卡在线视频 午夜欧美不卡在 | 性做久久久久久| 欧美精品一区二区三区一线天视频| 久久精品免费电影| 欧美在线国产| 在线观看中文字幕亚洲| 欧美大片免费观看在线观看网站推荐 | 亚洲精品午夜精品| 欧美日韩网址| 亚洲人成艺术| 国产精品羞羞答答| 亚洲免费av片| 韩国一区二区在线观看| 亚洲一区二区三区在线看| 99国产精品自拍| 亚洲欧美日本日韩| 亚洲一区免费在线观看| 欧美一级黄色录像| 亚洲国产婷婷| 久久综合网络一区二区| 久久亚洲私人国产精品va媚药| 国产拍揄自揄精品视频麻豆| 亚洲一区二区在线免费观看视频 | 久久成人免费网| 国产老肥熟一区二区三区| 久久久激情视频| 国产亚洲精久久久久久| 亚洲欧美在线播放| 久久精品日韩欧美| 国产一区二区三区网站| 久久久久久久综合| 免费成人美女女| 国产精品国产一区二区| 中文久久乱码一区二区| 一区二区三区在线观看视频| 久久久久久欧美| 亚洲福利视频在线| 夜夜爽www精品| 国产精品视频免费| 欧美亚洲综合网| 欧美大秀在线观看| 99国产精品99久久久久久| 欧美性开放视频| 欧美在线免费观看| 欧美高清视频免费观看| 日韩天堂在线观看| 国产精品久久久久影院色老大| 亚洲国产国产亚洲一二三| 一区二区三区久久| 国产香蕉97碰碰久久人人| 亚洲美女毛片| 久久精品99国产精品酒店日本| 黄色日韩网站| 欧美日韩免费在线观看| 欧美在线观看你懂的| 亚洲国产午夜| 久久久精品国产免大香伊| 亚洲人成网站影音先锋播放| 国产精品视频第一区| 另类天堂av| 亚洲一区二区三区在线观看视频 | 亚洲人成网站在线播| 小处雏高清一区二区三区| 在线看国产一区| 国产精品视频久久| 欧美大尺度在线观看| 亚洲欧美日韩视频二区| 亚洲黑丝一区二区| 久久综合给合| 先锋影音国产精品| 亚洲理伦电影| 欧美日韩国产在线一区| 久久福利影视| 亚洲综合视频1区| 久久国产精品久久久| 99国内精品| 亚洲丰满在线| 午夜亚洲视频| 亚洲精品国精品久久99热| 国产麻豆精品久久一二三| 欧美日韩中文精品| 亚洲一区二区三区在线观看视频| 欧美国产专区| aⅴ色国产欧美| 海角社区69精品视频| 欧美日韩在线亚洲一区蜜芽| 欧美91精品| 亚洲免费播放| 亚洲欧洲偷拍精品| 亚洲一区黄色| 国产精品99久久久久久久久久久久| 亚洲国产aⅴ天堂久久| 国内成人自拍视频| 欧美aⅴ99久久黑人专区| 久久久久高清| 噜噜噜91成人网| 农村妇女精品| 男女激情视频一区| 蜜臀99久久精品久久久久久软件 | 欧美一区二区三区免费大片| 亚洲一区二区三区四区在线观看| 中文日韩电影网站| 正在播放亚洲| 亚洲欧美www| 亚洲欧美视频在线| 性欧美精品高清| 久久不射中文字幕| 欧美综合国产| 久久色在线播放| 欧美极品色图| 久久国产主播| 久久夜色精品| 欧美日韩1区| 国产精品捆绑调教| 国产免费成人| 影音先锋日韩资源| 亚洲美女在线国产| 中文欧美在线视频| 午夜国产精品影院在线观看| 久久久蜜桃一区二区人| 国产精品99久久久久久宅男| 亚洲欧美三级在线| 久久久精品免费视频| 欧美电影免费观看高清完整版| 91久久精品日日躁夜夜躁欧美| 一区二区三区免费观看| 亚洲高清久久| 亚洲午夜视频| 另类尿喷潮videofree| 欧美日韩中文字幕在线视频| 国产精品嫩草久久久久| 国内精品模特av私拍在线观看 | 欧美激情第六页| 女女同性精品视频| 国产精品wwwwww| 亚洲国产成人精品久久| 亚洲一区影音先锋| 久久综合五月天婷婷伊人| 欧美在线观看天堂一区二区三区| 中日韩在线视频| 久久午夜精品一区二区| 亚洲美女在线观看| 久久aⅴ国产紧身牛仔裤| 欧美激情一区在线| 国产无一区二区| 这里只有精品电影| 久久精品国产第一区二区三区最新章节| 欧美国产三级| 久久精品国产96久久久香蕉| 欧美日韩在线观看一区二区三区| 曰韩精品一区二区| 欧美一区二区三区在|