清源游民
gameogre@gmail.com概述動(dòng)畫,總的來(lái)講,在計(jì)算機(jī)發(fā)展的各個(gè)階段,與藝術(shù)家們快速瀏覽一系列彼此稍微不同的圖片從而產(chǎn)生運(yùn)動(dòng)的幻覺的行為沒有什么不同。1872年,Eadweard Muybridge給奔跑的馬拍了一組連續(xù)的照片,從而證明了馬在奔跑時(shí)會(huì)四腳同時(shí)離地。這是一系列的圖片流可以產(chǎn)生運(yùn)動(dòng)幻覺的最早的文檔化的記錄。
現(xiàn)在在Ogre中,不必小題大作地裝配一些設(shè)備來(lái)創(chuàng)造這種運(yùn)動(dòng)幻覺了。只需要每幀少量地移動(dòng)或變形場(chǎng)景中的數(shù)據(jù),幻覺就產(chǎn)生了。它確實(shí)只是幻覺。ogre不跟蹤對(duì)象的速度,加速度,或是角色的胳膊是在抬起
或是叉著腰。ogre逐幀來(lái)處理位置與朝向。ogre能為你做的是幫你重新播放這些動(dòng)畫。這些動(dòng)畫可以是用離線工具制作的,或是運(yùn)行時(shí)產(chǎn)生的,或僅是為了實(shí)現(xiàn)相機(jī)漫游而填充了一系列位置的曲線。
場(chǎng)景的每幀都會(huì)被重畫,兩幀之間沒有什么會(huì)被保存下來(lái)。ogre中的動(dòng)畫僅僅是根據(jù)關(guān)于任意變量(通常
是時(shí)間)的函數(shù),來(lái)定位與定向角色。每一幀,在ogre動(dòng)畫系統(tǒng)的控制之下,場(chǎng)景中的實(shí)體與動(dòng)畫被稍稍
移動(dòng)或產(chǎn)生變形,然后場(chǎng)景被重畫。這種產(chǎn)生動(dòng)畫的方式,與華納兄弟的動(dòng)畫團(tuán)隊(duì)做卡通動(dòng)畫沒什么同。
一行畫24個(gè)卡通兔,彼此稍微不同,然后在1秒鐘的時(shí)間連續(xù)播放。
Ogre中的動(dòng)畫類型根據(jù)控制物體的不同方式分為兩種:基于關(guān)鍵幀的動(dòng)畫,控制器。
抽象地來(lái)看,ogre中的動(dòng)畫是相關(guān)tracks的集合。track是作為時(shí)間函數(shù)存儲(chǔ)的一組數(shù)據(jù)值。一對(duì)“track值”與"時(shí)間點(diǎn)“,構(gòu)成了關(guān)鍵幀(keyframe),更好的一種說(shuō)法是,在時(shí)間軸線上對(duì)對(duì)象全部或部分的位置,朝向,縮放,進(jìn)行采樣。根據(jù)動(dòng)畫的類型,ogre支持好幾種關(guān)鍵幀。"關(guān)鍵幀”這個(gè)名稱來(lái)源于手工制作動(dòng)畫的時(shí)代(像上面提到的制作卡通兔動(dòng)畫),首席藝術(shù)家會(huì)給他的下級(jí)提供一組關(guān)鍵的幀。這些幀給出了場(chǎng)景中角色的位置,然后下級(jí)藝術(shù)家們根據(jù)這些畫出幀之間角色的位置。在ogre中,你就是首席藝術(shù)家,需要提供這些關(guān)鍵幀,ogre是你的下級(jí),它幫你完成幀之間的過渡。
ogre中支持的track有下面這幾種類型(一個(gè)track中的所有關(guān)鍵幀必須有一致的類型):
NumericAnimaitonTrack(NumericKeyFrame):
關(guān)鍵幀包含一個(gè)AnyNumeric類型的標(biāo)量值。Any是ogre中定義的結(jié)構(gòu),和COM中的variant 類型一樣,允許數(shù)據(jù)類型的多態(tài)化。AnyNumeric限定了可能的數(shù)據(jù)類型只能是數(shù)字的(實(shí)數(shù),整數(shù))。
NodeAnimationTrack(TransformKeyFrame):
關(guān)鍵幀包含兩個(gè)3維向量,一個(gè)四元數(shù),分別表示結(jié)點(diǎn)的位置,縮放與朝向。
VertexAnimationTrack(VertexMorphKeyFrame,VertexPoseKeyFrame):
關(guān)鍵幀包含或是引用在一個(gè)特定時(shí)間點(diǎn)上(在pose 動(dòng)畫中)頂點(diǎn)位置和混合權(quán)重(VertexPoseKeyFrame)。
動(dòng)畫狀態(tài)
程序與ogre中的動(dòng)畫主要的交互是通過動(dòng)畫狀態(tài)來(lái)完成的(animation state)。在建模工具中,可以為骨骼或頂點(diǎn)網(wǎng)格沿時(shí)間軸線定義多個(gè)動(dòng)畫,導(dǎo)出時(shí)每個(gè)動(dòng)畫都可以定義一個(gè)名字,通過這個(gè)名字來(lái)定位Entity中同的動(dòng)畫。通過動(dòng)畫狀態(tài)可以訪問動(dòng)畫的許多屬性:長(zhǎng)度,當(dāng)前位置,動(dòng)畫名,是否循環(huán),有否有效,權(quán)重(用于混合動(dòng)畫)。權(quán)重根據(jù)混合動(dòng)畫的類型進(jìn)行不同的處理。
混合權(quán)平均:告訴ogre做這種混合時(shí),所有權(quán)重之和為1。如果不是1,ogre會(huì)進(jìn)行正規(guī)化處理,使得它們的總和為1。這種方式只對(duì)骨骼動(dòng)畫有效,它也是默認(rèn)的混合方式。
混合權(quán)累積:ogre只是簡(jiǎn)單地把所有引用權(quán)重的效果進(jìn)行累加,不會(huì)再平衡。這種方式只對(duì)頂點(diǎn)動(dòng)畫有效(pose, morph),用到骨骼動(dòng)畫時(shí)也可以。
動(dòng)畫狀態(tài)也是也給動(dòng)畫“加時(shí)間”推動(dòng)它向前變化的地方。基本上總是給一個(gè)時(shí)間增量,意味著從上次調(diào)用到現(xiàn)在增長(zhǎng)了的時(shí)間。本質(zhì)上,加一個(gè)時(shí)間增量與直接設(shè)定時(shí)間位置沒有什么不同。
骨骼動(dòng)畫
骨骼動(dòng)畫是最常用的動(dòng)畫類型。網(wǎng)格(mesh)中的頂點(diǎn)被綁定到骨骼上,如同我們身體的肌肉綁定到骨上。
不同的是,計(jì)算機(jī)動(dòng)畫中的“骨頭”不是真實(shí)存在的。它們用一些(無(wú)對(duì)應(yīng)實(shí)體)變換來(lái)表示骨頭的位置,朝向與縮放,經(jīng)常是用矩陣來(lái)表示。骨骼動(dòng)畫的關(guān)鍵幀,僅是相對(duì)于骨骼恢復(fù)位置的偏移。它們被組合起來(lái)形成了沿著時(shí)間軸線上某一給定點(diǎn)的骨骼。
Ogre中的骨骼是有層次關(guān)系的,如腳骨與脛骨相連,脛骨又與膝蓋骨相連。在這種層次關(guān)系下,除了root外,每個(gè)骨頭都有父親。但并不限于只有一個(gè)root,這種層次關(guān)系僅僅是用來(lái)傳遞轉(zhuǎn)換(自上而下)。改變一根骨頭會(huì)影響它所有孩子的位置。反向的運(yùn)動(dòng)ogre不支持:當(dāng)一個(gè)骨頭運(yùn)動(dòng)時(shí),它不會(huì)影響父輩。
頂點(diǎn)綁定
頂點(diǎn)被綁定到骨骼時(shí)會(huì)指定一個(gè)權(quán)重,權(quán)重說(shuō)明了骨頭運(yùn)動(dòng)對(duì)頂點(diǎn)的影響效果。典型的是把一個(gè)頂點(diǎn)綁
定到多個(gè)骨頭,賦于不同的權(quán)重。ogre僅支持每頂點(diǎn)四個(gè)骨頭,但每個(gè)骨頭可以與任意多個(gè)頂點(diǎn)關(guān)聯(lián)。
頂點(diǎn)動(dòng)畫
與通過計(jì)算動(dòng)畫骨骼,再根據(jù)骨骼位置計(jì)算頂點(diǎn)位置的動(dòng)畫方式不同。頂點(diǎn)動(dòng)畫直接對(duì)頂點(diǎn)進(jìn)行動(dòng)畫操作。它是資源密集型的解決方案,對(duì)于每個(gè)動(dòng)畫位置都要轉(zhuǎn)送完整的頂點(diǎn)數(shù)據(jù)的拷貝。有時(shí)這種方式是維一的辦法,例如實(shí)現(xiàn)逼真的面部表情動(dòng)畫。
頂點(diǎn)動(dòng)畫在動(dòng)畫track這個(gè)層次上被管理、操縱。這意味著我們可以對(duì)角色的頭,臉部分使用復(fù)雜的pose動(dòng)畫,而角色的剩余部分使用相對(duì)簡(jiǎn)單的morph動(dòng)畫。但是不能對(duì)相同的頂點(diǎn)使用不同的動(dòng)畫類型。頂點(diǎn)動(dòng)畫在引用一組頂點(diǎn)集時(shí),要么全部引用,要么一個(gè)也不引用。這意味著,在網(wǎng)格級(jí)別上來(lái)看,所有的共享幾何(shared geometry)構(gòu)成了頂點(diǎn)動(dòng)畫的頂點(diǎn)數(shù)據(jù)。在子網(wǎng)格級(jí)別上來(lái)看,所有子網(wǎng)格的頂點(diǎn)構(gòu)成了頂點(diǎn)動(dòng)畫的頂點(diǎn)數(shù)據(jù)。舉例來(lái)講,一個(gè)子網(wǎng)格的某些頂點(diǎn)參與morph動(dòng)畫,而剩余頂點(diǎn)參與pose動(dòng)畫,這種情況是不允許的。
變形動(dòng)畫(Morph Animation)
變形動(dòng)畫是兩種頂點(diǎn)動(dòng)畫技術(shù)中最簡(jiǎn)單最直觀的一種。實(shí)際的頂點(diǎn)位置做為"快照"被保存。這與前面說(shuō)到
的卡通兔動(dòng)畫的過程是一樣的。這種方法比較消耗資源,但是計(jì)算效率最高。關(guān)鍵之間數(shù)據(jù)通過插值得。
主要的缺點(diǎn)是不能混合多個(gè)變形動(dòng)畫,因?yàn)樗麄儽4娴氖琼旤c(diǎn)的絕對(duì)位置。當(dāng)然,如果有兩個(gè)動(dòng)畫,它們
影響的頂點(diǎn)沒有交集,那么確實(shí)可以對(duì)這兩個(gè)動(dòng)畫進(jìn)行混合。
姿勢(shì)動(dòng)畫(Pose Animation)
模型的各種姿勢(shì)被保存在動(dòng)畫tracks中。這些姿勢(shì)可以被混合來(lái)創(chuàng)建更復(fù)雜的動(dòng)畫。頂點(diǎn)的位置是相對(duì)于
復(fù)原位置的偏移量,而不是頂點(diǎn)的絕對(duì)位置。而且只有變化的數(shù)據(jù)才被保存。因此,它不僅更靈活,而且
對(duì)資源使用也更高效。
pose動(dòng)畫的關(guān)鍵幀引用一個(gè)或多個(gè)pose tracks,每個(gè)引用對(duì)姿勢(shì)有一個(gè)影響權(quán)重。權(quán)重決定了當(dāng)pose被混合時(shí)每個(gè)頂點(diǎn)偏移對(duì)最終的頂點(diǎn)位置產(chǎn)生多大的影響。不必在每一幀都引用一個(gè)pose。在實(shí)踐中,pose混合會(huì)碰到一些限制:每個(gè)附加的pose需要更多的處理時(shí)間。
混合動(dòng)畫不能混合pose與morph動(dòng)畫到一起,也不能混合多個(gè)morph動(dòng)畫。
當(dāng)混合骨骼動(dòng)畫與頂點(diǎn)動(dòng)畫時(shí),ogre將首先計(jì)算/混合頂點(diǎn)動(dòng)畫,然后應(yīng)用骨骼變形到混合頂點(diǎn)上。
規(guī)范的pose與骨骼動(dòng)畫混合的程序,會(huì)混合全身體的骨骼動(dòng)畫與復(fù)雜的面部表情。例如,可以對(duì)角色的面部頂點(diǎn)使用pose動(dòng)畫,而角色的剩余部分(包括頭)使用相對(duì)簡(jiǎn)單的骨骼動(dòng)畫。
混合兩個(gè)骨骼動(dòng)畫對(duì)于動(dòng)畫之間的切換是最有用的。例如角色可能在循環(huán)地執(zhí)行"跑步"這個(gè)動(dòng)畫,一會(huì)兒
他可能要停下來(lái)(執(zhí)行"idle"動(dòng)畫),那么這時(shí)需要對(duì)兩個(gè)動(dòng)畫進(jìn)行混合。
Morph與骨骼動(dòng)畫的混合,對(duì)于給骨骼動(dòng)畫的角色增加"外皮"網(wǎng)格變形是很合適的。例如,將一個(gè)衣服動(dòng)畫與角色實(shí)際的骨骼運(yùn)動(dòng)動(dòng)畫混合,這樣就避免了對(duì)衣服進(jìn)行實(shí)時(shí)模擬的高額代價(jià)。
硬件vs軟件
應(yīng)用硬件加速時(shí)最應(yīng)該記住的是:硬件動(dòng)畫網(wǎng)格數(shù)據(jù)不能被CPU使用。這相當(dāng)重要!假如你依賴網(wǎng)格數(shù)據(jù)
進(jìn)行別的計(jì)算(體積陰影計(jì)算,物理模擬),一旦頂點(diǎn)變形計(jì)算被移到GPU中,頂點(diǎn)就永遠(yuǎn)消失了,不在代碼中使用了,假如需要變形之后的頂點(diǎn)數(shù)據(jù),那么你還得用CPU進(jìn)行與GPU同樣的計(jì)算!這確實(shí)也可以做到,告訴ogre做吧: Entity::addSoftwareAnimationRequest()。
硬件加速的骨骼動(dòng)畫與頂點(diǎn)動(dòng)畫混合,會(huì)在頂點(diǎn)程序中執(zhí)行混合。假如你剛才還沒有注意到上面曾經(jīng)提到
過的執(zhí)行順序的話,現(xiàn)在又有機(jī)會(huì)讓你意識(shí)到這點(diǎn):先頂點(diǎn),然后骨骼。這同樣也意味著,所有的動(dòng)畫技術(shù)都應(yīng)該是基于硬件加速的,不能讓硬件加速的骨骼動(dòng)畫與基于軟件的頂點(diǎn)動(dòng)畫混合。
使用GPU加速
骨骼動(dòng)畫時(shí),應(yīng)該考慮到:骨骼動(dòng)畫算法的本質(zhì)上要求,在計(jì)算每個(gè)頂點(diǎn)時(shí),骨架中所有骨頭的數(shù)據(jù)必須都被提供。老舊的硬件僅僅支持24 bones或更少的skinning通道。這時(shí)應(yīng)把mesh分為幾段,在多個(gè)通道中skin它們。ogre只會(huì)把submesh引用到的bones發(fā)送到skinning shader,而不是骨骼中所有的bones,這使得多個(gè)skinnig pass成為可能。
在CPU中對(duì)
morph動(dòng)畫頂點(diǎn)進(jìn)行插值的主要優(yōu)點(diǎn)是利用了GPU并行計(jì)算的本質(zhì)。morph計(jì)算起來(lái)也不復(fù)雜,
主要的輸入是兩個(gè)頂點(diǎn)位置與一個(gè)插值因子,頂點(diǎn)程序產(chǎn)生插值后的頂點(diǎn)位置做為輸出。
pose動(dòng)畫與morph類似,而且有與骨骼動(dòng)畫類似的限制:它提供給程序的pose數(shù)目如何進(jìn)行傳遞。
標(biāo)簽點(diǎn)
標(biāo)簽本身不是動(dòng)畫的一部分,但它們常被用于聯(lián)結(jié)任意對(duì)象(例如武器)到存在的動(dòng)畫模型上。標(biāo)簽點(diǎn)
的概念比較簡(jiǎn)單:它是骨架中一塊特殊的骨頭,它能在運(yùn)行時(shí),控制綁定對(duì)象的位置與朝向。不必事先
創(chuàng)建標(biāo)簽點(diǎn),可以在運(yùn)動(dòng)期attched一個(gè)可移動(dòng)對(duì)象到骨架中一個(gè)命名的骨頭上。Entity有這樣一個(gè)方法:
attachObjectToBone();一旦物體被綁到骨頭上,它就會(huì)隨著標(biāo)簽點(diǎn)移動(dòng)。需要知道的是,對(duì)象并不是真正
地被attched到標(biāo)簽點(diǎn)上。它被attched到用那個(gè)骨骼的Entity上。
動(dòng)畫與控制器兩者都是基于一個(gè)一維的變量來(lái)控制對(duì)象的狀態(tài),把變量輸入一個(gè)函數(shù)產(chǎn)生輸出。對(duì)于動(dòng)畫來(lái)說(shuō),輸入變量是時(shí)間,而對(duì)于控制器來(lái)說(shuō),輸入變量是任何你想要的東西。
動(dòng)畫的特點(diǎn):通過插值函數(shù)計(jì)算給定時(shí)間點(diǎn)上track值來(lái)產(chǎn)生輸出,從而改變頂點(diǎn)位置。
動(dòng)畫被認(rèn)為是個(gè)封閉的系統(tǒng):你設(shè)置輸入值,ogre 使用它來(lái)更新相關(guān)對(duì)象的屬性。
插值函數(shù)較為固定:要么線值,要么三次樣條插值。
動(dòng)畫有ogre提供的許多工具的支持。
控制器的特點(diǎn):
對(duì)于輸出的計(jì)算更為靈活,工作函數(shù)需要提供,因此有更多選擇。
控制器可以形成一個(gè)鏈,一個(gè)輸出可作為另一個(gè)輸入。
控制器自己不移動(dòng)任何東西,對(duì)于輸出可以不做任何事情。ogre用控制器來(lái)驅(qū)動(dòng)紋理動(dòng)畫。
控制器自動(dòng)逐幀更新,然而必須手工添加代碼使每幀的動(dòng)畫向前變化。
posted on 2007-03-16 17:33
清源游民 閱讀(2664)
評(píng)論(0) 編輯 收藏 引用 所屬分類:
OGRE