• <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>

            天行健 君子當自強而不息

            網格模型高級技術(4)

            為了使一個.x文件產生動畫,必須至少提供一個動畫集,每個動畫集都應具有一個對某個框架的引用。模板 AnimationSet用來定義動畫集:

            Contains one or more Animation objects. Each animation within an animation set has the same time at any given point. Increasing the animation set's time increases the time for all the animations it contains.

            template AnimationSet
            {
            < 3D82AB50-62DA-11cf-AB39-0020AF71E433 >
            [ Animation < 3D82AB4F-62DA-11cf-AB39-0020AF71E433 > ]
            }

            Where:

            • [ Animation < 3D82AB4F-62DA-11cf-AB39-0020AF71E433 > ] - Optional animation template.

            模板Animation的定義如下:

            Contains one or more Animation objects. Each animation within an animation set has the same time at any given point. Increasing the animation set's time increases the time for all the animations it contains.

            template AnimationSet
            {
            < 3D82AB50-62DA-11cf-AB39-0020AF71E433 >
            [ Animation < 3D82AB4F-62DA-11cf-AB39-0020AF71E433 > ]
            }

            Where:

            • [ Animation < 3D82AB4F-62DA-11cf-AB39-0020AF71E433 > ] - Optional animation template.

            很顯然,Animation是一個完全開放的模板,一般情況下,用模板AnimationKey來填充它,模板AnimationKey的定義如下:

            Defines a set of animation keys. A matrix key is useful for sets of animation data that need to be represented as transformation matrices.

            template AnimationKey
            {
            < 10DD46A8-775B-11CF-8F52-0040333594A3 >
            DWORD keyType;
            DWORD nKeys;
            array TimedFloatKeys keys[nKeys];
            }

            Where:

            • keyType - Specifies whether the keys are rotation, scale, position, or matrix keys (using the integers 0, 1, 2, or 4, respectively).
            • nKeys - Number of keys.
            • keys - An array of keys.

            在模板AnimationKey中,keyType可取的值是0、1、2、4。

            0表示旋轉鍵,在.x文件中,用一個四元數來實現模型的旋轉,旋轉值使用4個分量w、x、y、z來存儲,也就是說,此時變換數組的大小是4,它依次存儲四元數的4個分量。

            1表示縮放鍵,可以使用這種類型的關鍵幀實現模型的縮放,此時變換數組的大小是3,它們分別對應x、y、z軸的縮放值。

            2表示平移鍵,使用3個分量實現模型的平移,此時變換數組的大小是3,它們分別對應沿x、y、z軸的平移值。

            4表示變換矩陣鍵,此時關鍵幀的變換數組使用16個浮點數來實現該模型的各種變換。因為矩陣可以實現模型的平移、旋轉、縮放以及它們的組合變換。

            模板AnimationKey用來定義一組動畫關鍵幀,而模板TimeFloatKeys用來定義每個動畫關鍵幀:

            Defines a set of floats and a positive time used in animations.

            template TimedFloatKeys 
            {
            < F406B180-7B3B-11cf-8F52-0040333594A3 >
            DWORD time;
            FloatKeys tfkeys;
            }

            Where:

            • tfkeys - See FloatKeys.

            Defines an array of floating-point numbers (floats) and the number of floats in that array. This is used for defining sets of animation keys.

            template FloatKeys
            {
            < 10DD46A9-775B-11cf-8F52-0040333594A3 >
            DWORD nValues;
            array float values[nValues];
            }
            • nValues - Number of floats.
            • values[nValues] - Array of float values.

            我們在cube_3.x的基礎上添加動畫部分形成cube_4.x,該動畫集定義了立方體繞y軸旋轉,增加部分如下:

            AnimationSet AnimationSet0 {  //動畫集
            Animation Animation0 { //動畫
            {CubeFrame} //引用上面的立方體框架,表示下面的動畫是針對立方體框架的
            		AnimationKey {                //動畫鍵   沿Y軸旋轉網格
            0; // Rotation keys
            10; // 9 keys
            			1000; 4; 0.000000, 0.15643448, 0.000000, 0.98768836;;,
            2000; 4; 0.000000, 0.30901700, 0.000000, 0.95105654;;,
            3000; 4; 0.000000, 0.45399046, 0.000000, 0.89100653;;,
            4000; 4; 0.000000, 0.58778530, 0.000000, 0.80901694;;,
            5000; 4; 0.000000, 0.70710671, 0.000000, 0.70710683;;,
            6000; 4; 0.000000, 0.80901694, 0.000000, 0.58778530;;,
            7000; 4; 0.000000, 0.89100653, 0.000000, 0.45399052;;,
            8000; 4; 0.000000, 0.95105654, 0.000000, 0.30901697;;,
            9000; 4; 0.000000, 0.98768836, 0.000000, 0.15643449;;,
            10000; 4; 0.000000, 1.0000000, 0.000000, 0.00000000;;;
            }
            }
            }

            這里一共定義了10個關鍵幀,在第10個關鍵幀時回到初始位置開始新一輪的動畫。{CubeFrame}表示該動畫集是對框架CubeFrame進行的操作。

            我們在cube_3.x的基礎上添加縮放動畫形成cube_5.x:

            AnimationSet AnimationSet0 {   //動畫集
            Animation Animation0 { //動畫
            {CubeFrame} // Use the frame containing the cube.
            		AnimationKey {                 //動畫鍵, 放大和縮小網格
            1; // Scaling keys
            9; // 9 keys
            			1000; 3; 1.000000, 1.000000, 1.000000;;,
            2000; 3; 0.800000, 0.800000, 0.800000;;,
            3000; 3; 0.600000, 0.600000, 0.600000;;,
            4000; 3; 0.400000, 0.400000, 0.400000;;,
            5000; 3; 0.200000, 0.200000, 0.200000;;,
            6000; 3; 0.400000, 0.400000, 0.400000;;,
            7000; 3; 0.600000, 0.600000, 0.600000;;,
            8000; 3; 0.800000, 0.800000, 0.800000;;,
            9000; 3; 1.000000, 1.000000, 1.000000;;;
            }
            }
            }

            效果圖:

             

            我們也可以在cube_3.x的基礎上添加一個沿y軸移動的動畫形成cube_6.x:

            AnimationSet AnimationSet0 {   //動畫集
            Animation Animation0 { //動畫
            {CubeFrame} // Use the frame containing the cube.
            		AnimationKey {                 //動畫鍵   沿Y軸方向移動網格
            2; // Position keys
            19; // 9 keys
            1000; 3; 0.000000, -5.000000, 0.000000;;,
            2000; 3; 0.000000, -4.000000, 0.000000;;,
            3000; 3; 0.000000, -3.000000, 0.000000;;,
            4000; 3; 0.000000, -2.000000, 0.000000;;,
            5000; 3; 0.000000, -1.000000, 0.000000;;,
            6000; 3; 0.000000, 0.000000, 0.000000;;,
            7000; 3; 0.000000, 1.000000, 0.000000;;,
            8000; 3; 0.000000, 2.000000, 0.000000;;,
            9000; 3; 0.000000, 3.000000, 0.000000;;,
            10000; 3; 0.000000, 4.000000, 0.000000;;,
            11000; 3; 0.000000, 5.000000, 0.000000;;,
            12000; 3; 0.000000, 4.000000, 0.000000;;,
            12000; 3; 0.000000, 3.000000, 0.000000;;,
            13000; 3; 0.000000, 2.000000, 0.000000;;,
            14000; 3; 0.000000, 1.000000, 0.000000;;,
            15000; 3; 0.000000, 0.000000, 0.000000;;,
            16000; 3; 0.000000, -1.000000, 0.000000;;,
            17000; 3; 0.000000, -2.000000, 0.000000;;,
            18000; 3; 0.000000, -3.000000, 0.000000;;,
            19000; 3; 0.000000, -4.000000, 0.000000;;,
            }
            }
            }

            效果圖:

             

            包含在.x文件中的動畫通常用來實現模型不同部分之間的相對運動,對于一個模型整體上的運動,應該是在程序中通過其世界變換矩陣來實現。

             

            蒙皮信息

            一個動畫網格模型很多情況下可能涉及到蒙皮信息,模板XSkinMeshHeader僅對于具有蒙皮信息的網格模型有效,它用來記錄網格模型的蒙皮信息,該模板的定義如下:

            This template is instantiated on a per-mesh basis only in meshes that contain exported skinning information. The purpose of this template is to provide information about the nature of the skinning information that was exported.

            template XSkinMeshHeader 
            {
            < 3CF169CE-FF7C-44ab-93C0-F78F62D172E2 >
            WORD nMaxSkinWeightsPerVertex;
            WORD nMaxSkinWeightsPerFace;
            WORD nBones;
            }

            Where:

            • nMaxSkinWeightsPerVertex - Maximum number of transforms that affect a vertex in the mesh.
            • nMaxSkinWeightsPerFace - Maximum number of unique transforms that affect the three vertices of any face.
            • nBones - Number of bones that affect vertices in this mesh.

            在一個具有蒙皮信息的網格模型中,可能出現模板SkinWeights的n個實例,n等于該網格模型中骨骼的數量。該模板的每個實例都定義了一個具體的骨骼對于相應頂點的影響權重,該模板的具體定義如下:

            This template is instantiated on a per-mesh basis. Within a mesh, a sequence of n instances of this template will appear, where n is the number of bones (X file frames) that influence the vertices in the mesh. Each instance of the template basically defines the influence of a particular bone on the mesh. There is a list of vertex indices, and a corresponding list of weights.

            template SkinWeights 
            {
            < 6F0D123B-BAD2-4167-A0D0-80224F25FABB >
            STRING transformNodeName;
            DWORD nWeights;
            array DWORD vertexIndices[nWeights];
            array float weights[nWeights];
            Matrix4x4 matrixOffset;
            }

            Where:

            • The name of the bone whose influence is being defined is transformNodeName, and nWeights is the number of vertices affected by this bone.
            • The vertices influenced by this bone are contained in vertexIndices, and the weights for each of the vertices influenced by this bone are contained in weights.
            • 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.

             

            下載cube_1.x ~ cube6.x


            posted on 2008-05-27 15:44 lovedday 閱讀(2019) 評論(1)  編輯 收藏 引用

            評論

            # re: 網格模型高級技術(4) 2013-09-06 17:29 abc

            講的太好了  回復  更多評論   

            公告

            導航

            統計

            常用鏈接

            隨筆分類(178)

            3D游戲編程相關鏈接

            搜索

            最新評論

            国内精品人妻无码久久久影院 | 欧美一区二区三区久久综| 国产激情久久久久影院| 久久综合狠狠综合久久激情 | 亚洲精品乱码久久久久久自慰| 国内精品人妻无码久久久影院导航 | 亚洲欧美久久久久9999| 亚洲国产另类久久久精品| 99久久国产热无码精品免费| 欧美精品一区二区久久| 伊人久久大香线蕉亚洲| 久久久91精品国产一区二区三区 | 一本色道久久综合狠狠躁篇| 亚洲va久久久噜噜噜久久狠狠 | 亚洲人成无码网站久久99热国产| 97精品久久天干天天天按摩| 亚洲国产成人久久综合碰| 色综合久久综精品| 亚洲AV日韩AV天堂久久| 久久亚洲电影| 欧美亚洲国产精品久久蜜芽| 久久亚洲AV无码精品色午夜麻豆| 四虎国产精品免费久久久| 99精品久久精品一区二区| 四虎亚洲国产成人久久精品| 国产精品久久影院| 亚洲精品乱码久久久久久| 四虎国产精品成人免费久久| 午夜精品久久久久久久无码| 久久91精品综合国产首页| 91精品国产综合久久四虎久久无码一级| 久久人人爽人人爽人人av东京热 | 久久久久亚洲AV片无码下载蜜桃| 久久99这里只有精品国产| 久久久久国产精品麻豆AR影院| 91视频国产91久久久| 999久久久无码国产精品| 麻豆成人久久精品二区三区免费 | 久久午夜夜伦鲁鲁片免费无码影视| 久久久精品久久久久久| 女同久久|