[前言:在Ogre的Facial Demo中采用了頂點動畫(確切點說是Pose Animation)讓面部產生面部表情及發音動畫,本文簡單介紹了頂點動畫的概念,并結合Facial Demo,探討如何實現Pose Animation。]
頂點動畫是直接使用頂點讓網格(mesh)產生動畫的一種方式。每一組動作在頂點動畫中對應一個頂點數據實體。頂點動畫被存儲在.mesh文件中,因為它與網格的頂點緊密相連。實際上,頂點動畫分為兩種子類型。
1、Morph Animation(變形動畫)
變形動畫依靠在每個關鍵幀中及其之間保存和插入頂點絕對位置的快照(snapshot)。當骨骼動畫不能恰當處理動畫對象時,變形動畫會比較有用。在分物體必須從根本改變動畫部分的結構和形狀時,骨骼動畫就不適合了。
由于絕對位置數據的使用,不可能在同樣的頂點數據中混合多于一個的變形動畫;如果你想使用動畫混合,你應該使用骨骼動畫,因為它更有效。如果你激活了在同一個頂點數據中包含的多個動畫,只有最后一個有效。也就是說動畫狀態的"weight"選項不能被用于變形動畫。
變形動畫與骨骼動畫能夠組合應用(參考 Ogre Manual 8.3.3 Combining Skeletal and Vertex Animation)。同時,變形動畫也能在使用頂點渲染器(shader)的硬件中實現(參考Ogre Manual Morph Animation in Vertex Programs)
2、Pose Animation(姿態動畫)
姿態動畫允許將多個潛在地不同效果等級的頂點姿態(vertex poses)混合成最終的頂點狀態。該動畫通常用于面部動畫,在這種動畫中每一個面部表情被作為一個獨立的動畫,我們可以將一個表情混合在另外一個上,如果每個姿態只影響面部的一部分,也可以組合所有的表情。
為了產生姿態動畫,需要引用預先包含在mesh中的一套動作集,這些動作集采用與源頂點的偏移量來表示。但是并不要求每一個頂點都有偏移量,當用軟件處理這些數據時,沒有偏移量的頂點會被忽略掉。如果用硬件處理的話,沒有偏移量的頂點會自動被填充為0。
一旦定義好了姿態,你就可以在動畫中引用他們。每一個姿態動畫跡(pose animation track)對應著一個單獨的幾何數據集合(或者是與物體網格對應的,或者是其中一個子網格的),在動畫中的每個關鍵幀可以引用一個或多個姿態(pose),且每一個有其相應的影響值(influence)。你能定義許多關鍵幀,使用多種姿態的混合,從而產生多個部位協調運動的動畫。
應該小心多個姿態同時應用的情況。當在硬件中處理姿態動畫的時候(參考Ogre Manual Pose Animation in Vertex Programs),每個激活的動作都需要額外的頂點緩沖器加入到渲染器(shader)中,如果采用軟件來處理動畫,你處理的激活姿態越多消耗的時間也就越長。也就是說,在一個關鍵幀中如果有兩個姿態,在下一幀中也有兩個,那么在它們過渡之間實際上就有4個激活的關鍵幀。
你可以綜合應用姿態動畫和骨骼動畫,參考 Ogre Manual 8.3.3 Combining Skeletal and Vertex Animation,你也可以采用硬件加速那些混合頂點渲染器(shader)的應用程序(參考Ogre Manual Pose Animation in Vertex Programs)。
3、Pose Animation xml結構
<mesh>
<submeshes>
<submesh material="子網格材質" ...>
<faces count="面數">
<face ... />
</faces>
<geometry vertexcount="頂點數">
<vertexbuffer ...> // 頂點緩沖器內容
<vertex>
<position 頂點位置>
<normal 頂點法向量>
<texcoord 紋理坐標>
</vertex>
</submesh>
</submeshes>
<submeshnames> // 主要是為pose和animation提供索引號
<submeshname name="子網格的名字" index="子網格的索引號(從0開始)">
</submeshnames>
<poses> // 這些參數主要是對手調動畫有效
<pose target="submesh or mesh" index="對應哪個網格的姿態" name="姿態的名字">
<poseoffset index="頂點索引" x y z相對偏移量 />
</pose>
</poses>
<animations> // 下面這些動畫對于自動播放動畫有效
<animation name="動畫名字" length="幀長度">
<tracks> // 動畫跡
<track target="submesh or mesh" index="姿態索引號" type="動畫類型,這里是pose">
<keyframes> // 關鍵幀
<keyframe time="時間">
<poseref poseindex="pose索引" influence="影響值[0-1]" />
</keyframe>
</keyframes>
<track>
</tracks>
</animation>
</animations>
</mesh>
4、如何實現
4.1 建模工具對Pose Animation的支持
Facial Demo中所用的頭部模型是由SoftImage授權使用的XSI面部動畫模型,不是所有的導出工具都支持Pose Animation,目前有 SoftImage XSI 5.0 Exporter v1.2.3、oFusion Pro for 3ds max、Maya Ogre導出器支持。
4.2 關鍵頂點的尋找
通過分析xml中的poseoffset偏移量,可以看到許多非常小的數據,這些數據是由模型導出工具產生的,其實它們完全可以被忽略掉。通過實驗,我將原來604個頂點的poseoffset數據減少為75個,而且效果和原來相差不大,說明這75個poseoffset對應的頂點是該動畫的關鍵頂點。
4.3 在程序中如何讀取Pose Animation
下面是包括在場景創建函數createScene中創建動畫的代碼:
// 載入包含pose animation的mesh
MeshPtr mesh = MeshManager::getSingleton().load("aaa.mesh", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
// 創建動畫將其命名為smile,并將長度初始化為0
Animation* anim = mesh->createAnimation("smile", 0);
// 創建頂點動畫跡,這里只有針對索引值為0的Pose動畫,故第一個參數為1[1]
// 這些動畫pose被定義在<poses>標簽中
VertexAnimationTrack* track = anim->createVertexTrack(1, VAT_POSE);
// 創建手動動畫,并將關鍵幀起始位置置為0
manualKeyFrame = track->createVertexPoseKeyFrame(0);
// 創建手動動畫所用到的poses引用,并初始化為0
manualKeyFrame->addPoseReference(0, 0.0f);
// 創建物體(這里是Dr. Bunsen的頭像)
Entity* head = mSceneMgr->createEntity("Head1", "aaa.mesh");
// 從mesh中得到名為action的動畫參數(在<animations>標簽中定義)
actionAnimState = head->getAnimationState("action");
// 是否允許自動播放該動畫
actionAnimState->setEnabled(true);
// 獲取先前從mesh文件中得到的動畫smile,并將關鍵幀起始位置置為0
manualAnimState = head->getAnimationState("smile");
manualAnimState->setTimePosition(0);
下面在是每一幀渲染開始都會調用的frameStarted函數中自動播放動畫代碼:
// 根據自上一幀以來所消耗的秒數來修改調整關鍵幀位置
actionAnimState->addTime(evt.timeSinceLastFrame);
--------------------------------------------------------------------------------
[1] Ogre API指出createVertexTrack第一個參數的含義為: Handle to give the track, used for accessing the track later. Must be unique within this Animation, and is used to
identify the target. For example when applied to a Mesh, the handle must reference the
index of the geometry being modified; 0 for the shared geometry, and 1+ for SubMesh
geometry with the same index-1.
posted on 2006-11-24 02:01
七星重劍 閱讀(3323)
評論(1) 編輯 收藏 引用 所屬分類:
Game Engine 、
OGRE