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

天行健 君子當自強而不息

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 閱讀(686) 評論(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>
            欧美精品一区三区| 欧美日韩一区二区三区在线看| 国产精品丝袜xxxxxxx| 亚洲欧美日韩天堂| 亚洲中字在线| 国产又爽又黄的激情精品视频 | 国产精品久久久久三级| 亚洲少妇最新在线视频| 亚洲天堂黄色| 国产一区二区三区自拍| 老司机免费视频久久| 免费一区二区三区| 一本色道久久加勒比88综合| 99视频精品免费观看| 国产日韩欧美亚洲一区| 久久久久女教师免费一区| 久久中文欧美| 亚洲视频一区二区免费在线观看| 亚洲资源av| 亚洲第一页中文字幕| 亚洲乱码国产乱码精品精| 国产精品免费小视频| 免费不卡在线观看| 欧美三级中文字幕在线观看| 久久精品综合一区| 欧美激情亚洲精品| 久久黄金**| 欧美精品www在线观看| 欧美一区二区网站| 欧美美女日韩| 久久久久久噜噜噜久久久精品| 欧美二区在线观看| 久久精品国产亚洲一区二区| 欧美福利一区二区| 久久久久久高潮国产精品视| 欧美精品一区二区三区高清aⅴ| 久久爱www久久做| 欧美日韩国产首页在线观看| 久久精品日韩一区二区三区| 欧美日本国产精品| 欧美77777| 国产女人aaa级久久久级| 亚洲欧洲日本一区二区三区| 国产模特精品视频久久久久| 亚洲精品国产精品国自产在线| 狠狠色综合日日| 亚洲香蕉伊综合在人在线视看| 亚洲免费不卡| 久久中文在线| 玖玖玖国产精品| 国产精品久久二区| 亚洲精品在线一区二区| 亚洲国产精品va在线看黑人动漫| 亚洲欧美综合网| 午夜精品福利在线| 欧美午夜美女看片| 亚洲美女区一区| 日韩五码在线| 欧美aⅴ99久久黑人专区| 久久午夜激情| 国产一区二区中文| 午夜日韩在线观看| 香蕉久久精品日日躁夜夜躁| 国产精品久久久久久久久免费 | 亚洲网站在线| 欧美日韩国产一区二区三区| 91久久午夜| 一区二区三区日韩欧美精品| 欧美精品偷拍| 亚洲最黄网站| 亚洲一区二区三区在线看| 欧美视频不卡中文| 在线综合亚洲欧美在线视频| 午夜在线观看欧美| 国产美女扒开尿口久久久| 香蕉国产精品偷在线观看不卡| 久久国产精品第一页| 黑人操亚洲美女惩罚| 久久精品女人| 亚洲电影中文字幕| 日韩一区二区免费看| 欧美午夜寂寞影院| 亚洲欧美在线高清| 美女福利精品视频| 亚洲麻豆视频| 国产精品系列在线| 久久精品人人做人人爽| 亚洲国产成人不卡| 亚洲欧美成人在线| 国产在线国偷精品产拍免费yy| 久久先锋资源| 日韩手机在线导航| 久久久久国产精品一区二区| 亚洲第一色在线| 欧美日韩在线播放三区四区| 亚洲一区免费网站| 欧美福利视频一区| 亚洲一区二区高清视频| 国内揄拍国内精品久久| 欧美激情综合五月色丁香小说| 亚洲一区二区三区四区五区午夜| 麻豆亚洲精品| 亚洲欧美日韩另类精品一区二区三区 | 免费观看30秒视频久久| 日韩视频一区二区在线观看| 国产女主播一区二区| 欧美大片免费观看| 亚洲综合日本| 亚洲欧洲精品一区| 久久久久久精| 亚洲自拍偷拍一区| 亚洲国产日韩精品| 国产日韩在线一区二区三区| 欧美激情精品久久久久久黑人 | 欧美大香线蕉线伊人久久国产精品| 亚洲少妇一区| 91久久久在线| 精品成人a区在线观看| 国产精品视频99| 欧美激情亚洲综合一区| 久久精品国产欧美激情| 中文精品99久久国产香蕉| 亚洲高清不卡在线观看| 久久人人97超碰国产公开结果| 亚洲图片欧洲图片av| 最近中文字幕日韩精品| 红桃视频国产精品| 国产精品影视天天线| 欧美日韩一区二区视频在线| 欧美激情2020午夜免费观看| 久久麻豆一区二区| 欧美在线一区二区三区| 中文日韩在线视频| 夜夜精品视频一区二区| 亚洲欧洲在线视频| 亚洲国产精品嫩草影院| 欧美成人性网| 免费在线一区二区| 免费亚洲电影在线| 另类春色校园亚洲| 久久最新视频| 免费在线一区二区| 免费在线成人| 欧美韩国日本一区| 亚洲成人在线视频网站| 女人色偷偷aa久久天堂| 欧美www视频在线观看| 毛片基地黄久久久久久天堂| 鲁大师成人一区二区三区| 久久这里有精品视频| 免费在线成人av| 欧美电影专区| 亚洲日本中文字幕免费在线不卡| 亚洲国产精品久久精品怡红院| 亚洲高清资源| 99精品黄色片免费大全| 亚洲小说欧美另类社区| 亚洲一区二区在| 欧美在线亚洲综合一区| 久久久噜噜噜久久中文字免| 看片网站欧美日韩| 欧美日韩国产一区| 国产欧美精品一区二区色综合 | 国产精品女主播| 国产午夜精品福利| 在线观看欧美亚洲| aaa亚洲精品一二三区| 一区二区三区四区五区视频| 亚洲欧美精品在线观看| 久久精品视频免费| 欧美暴力喷水在线| 99国产精品久久久久老师 | 亚洲高清视频在线观看| 亚洲精品五月天| 午夜精品在线观看| 女仆av观看一区| 国产精品久久久久av| 在线精品观看| 亚洲欧美激情四射在线日| 久久一区视频| 一本大道av伊人久久综合| 欧美亚洲在线| 欧美日韩国产成人在线观看| 国产日韩欧美视频| 亚洲精品久久久久中文字幕欢迎你| 亚洲欧美成aⅴ人在线观看| 免费观看国产成人| 亚洲色诱最新| 欧美成年人网站| 国产亚洲人成网站在线观看| 一区二区高清在线| 免费观看在线综合| 亚洲主播在线播放| 欧美久久久久久| 在线日韩欧美视频| 久久成人一区| 一区二区三区|亚洲午夜| 欧美1区视频| 韩国精品在线观看| 香蕉久久国产|