本發(fā)明涉及計(jì)算機(jī)動畫技術(shù)領(lǐng)域,特別是涉及一種動畫中動態(tài)骨骼的實(shí)現(xiàn)方法和裝置。
背景技術(shù):
游戲中人物的走動,跑動,攻擊等動作是必不可少,實(shí)現(xiàn)它們的方法一般采用幀動畫或者骨骼動畫。幀動畫與骨骼動畫的區(qū)別在于:幀動畫的每一幀都是角色特定姿勢的一個快照,動畫的流暢性和平滑效果都取決于幀數(shù)的多少。而骨骼動畫則是把角色的各部分身體部件圖片綁定到一根根互相作用連接的“骨頭”上,通過控制這些骨骼的位置、旋轉(zhuǎn)方向和放大縮小而生成的動畫。
在3d游戲開發(fā)過程中,角色模型的動作表現(xiàn)通常是使用骨骼蒙皮動畫來實(shí)現(xiàn),標(biāo)準(zhǔn)的骨骼動畫是由美術(shù)設(shè)計(jì)人員預(yù)先設(shè)計(jì)然后再輸出到游戲應(yīng)用程序當(dāng)中,通過程序運(yùn)算來播放模型在每一幀的動作表現(xiàn)。然而,預(yù)先設(shè)計(jì)好的動畫表現(xiàn)并不能滿足一些特殊的情形,比如隨著人物的轉(zhuǎn)動,身上的衣物輕盈的飄動起來;或者隨著馬匹的跑動,尾巴隨著跑動作不同幅度地擺動等等。
動態(tài)骨骼動畫適用于這類情況,因?yàn)樗墓趋绖幼鞅憩F(xiàn)是在游戲運(yùn)行過程中根據(jù)關(guān)聯(lián)的骨骼信息動態(tài)計(jì)算出來的。使用動態(tài)骨骼除了使動畫模型具有逼真的動作表現(xiàn),還具有制作簡單,控制便捷等特點(diǎn),一般只需要美術(shù)設(shè)計(jì)人員預(yù)先將網(wǎng)格模型各個頂點(diǎn)的蒙皮信息設(shè)計(jì)好即可直接輸出結(jié)果模型,由程序根據(jù)配置的各類參數(shù)控制模型的動作表現(xiàn)。
但是,如何合理控制動態(tài)骨骼的移動,以使得動態(tài)骨骼所對應(yīng)的的部分的動畫模型的移動能夠更逼真地符合視覺效果,是動態(tài)骨骼技術(shù)面臨的主要問題。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的主要目的在于,提供一種動畫中動態(tài)骨骼的實(shí)現(xiàn)方法和裝置,在本發(fā)明的作用下,通過控制動態(tài)骨骼的移動,能夠使得所對應(yīng)的動畫模型的移動更為逼真地符合視覺效果。
根據(jù)本發(fā)明的一個方面,提供了一種動畫中動態(tài)骨骼的實(shí)現(xiàn)方法,包括:創(chuàng)建針對目標(biāo)對象的骨骼關(guān)節(jié)樹,其中,骨骼關(guān)節(jié)樹中直接相連的兩個關(guān)節(jié)中更接近根節(jié)點(diǎn)的關(guān)節(jié)為父關(guān)節(jié),更遠(yuǎn)離根關(guān)節(jié)的關(guān)節(jié)為子關(guān)節(jié);計(jì)算骨骼關(guān)節(jié)樹中的關(guān)節(jié)在下一幀的位置信息;針對骨骼關(guān)節(jié)樹中的至少一個子關(guān)節(jié),將該子關(guān)節(jié)從當(dāng)前幀到下一幀的位置變換轉(zhuǎn)換為繞該子關(guān)節(jié)的父關(guān)節(jié)的旋轉(zhuǎn)變換,從而通過旋轉(zhuǎn)變換,將子關(guān)節(jié)移動到其下一幀的位置。
由此,通過將關(guān)節(jié)的位置變換轉(zhuǎn)換為繞其父關(guān)節(jié)的旋轉(zhuǎn)變換,可以使得運(yùn)動過程更加平滑,改善視覺效果。
優(yōu)選地,計(jì)算骨骼關(guān)節(jié)樹中的關(guān)節(jié)在下一幀的位置信息可以包括:計(jì)算預(yù)定作用力下骨骼關(guān)節(jié)樹中的關(guān)節(jié)在下一幀的位置信息,其中,預(yù)定作用力可以包括下列至少一項(xiàng):重力;關(guān)節(jié)移動過程中受到的與移動方向相反的阻力;以及來自周圍環(huán)境的干擾力。
由此,可以計(jì)算在骨骼關(guān)節(jié)樹中的關(guān)節(jié)在受到重力、干擾力、阻力等外力作用下在下一幀的位置信息,使得計(jì)算出的位置信息能夠準(zhǔn)確地反映關(guān)節(jié)的實(shí)際運(yùn)動情況。
優(yōu)選地,計(jì)算預(yù)定作用力下骨骼關(guān)節(jié)樹中的關(guān)節(jié)在下一幀的位置信息可以包括:使用如下位置計(jì)算公式計(jì)算關(guān)節(jié)在下一幀的位置信息posn+1,
posn+1=posn+(posn-posn-1)*(1-r)+(gv+d)*δt2
其中,posn+1為關(guān)節(jié)在下一幀的位置信息,posn為關(guān)節(jié)在當(dāng)前幀的位置信息,posn-1為關(guān)節(jié)在上一幀的位置信息,r為阻力作用下的阻力系數(shù),0≤r≤1,gv為重力在關(guān)節(jié)的長度方向上的法向方向上的重力分力作用下的加速度,d為干擾力作用下的加速度,δt為上一幀與當(dāng)前幀之間的時間間隔。
優(yōu)選地,該實(shí)現(xiàn)方法還可以包括:使用如下第一修正公式對計(jì)算得到的關(guān)節(jié)在下一幀的位置信息posn+1進(jìn)行修正,
其中,pos'n+1為關(guān)節(jié)經(jīng)過補(bǔ)償后在下一幀的位置信息,posp為關(guān)節(jié)的父關(guān)節(jié)的位置信息,len為關(guān)節(jié)到其父關(guān)節(jié)之間的關(guān)節(jié)臂的長度。
由此,通過第一位置修正公式可以使得關(guān)節(jié)的長度在關(guān)節(jié)的運(yùn)動過程中保持不變。
優(yōu)選地,將子關(guān)節(jié)在下一幀的位置信息與當(dāng)前幀的位置信息之間的位置變換轉(zhuǎn)換為繞該子關(guān)節(jié)的父關(guān)節(jié)的旋轉(zhuǎn)變換可以包括:根據(jù)子關(guān)節(jié)在當(dāng)前幀的位置信息,確定從父關(guān)節(jié)到子關(guān)節(jié)的當(dāng)前方向向量;根據(jù)子關(guān)節(jié)在下一幀的位置信息以及當(dāng)前幀的位置信息,確定子關(guān)節(jié)在其父關(guān)節(jié)坐標(biāo)系下的移動向量;根據(jù)當(dāng)前方向向量和移動向量,獲取繞父關(guān)節(jié)進(jìn)行旋轉(zhuǎn)變換的四元數(shù)。由此,可以使用四元數(shù)來表示繞子關(guān)節(jié)的父關(guān)節(jié)的旋轉(zhuǎn)變換。
優(yōu)選地,將子關(guān)節(jié)在下一幀的位置信息與當(dāng)前幀的位置信息之間的位置變換轉(zhuǎn)換為繞該子關(guān)節(jié)的父關(guān)節(jié)的旋轉(zhuǎn)變換還可以包括:使用四元數(shù)插值算法對四元數(shù)進(jìn)行插值運(yùn)算,以得到緩沖四元數(shù);基于緩沖四元數(shù)對父關(guān)節(jié)和子關(guān)節(jié)進(jìn)行旋轉(zhuǎn)變換。
通過對四元數(shù)進(jìn)行插值運(yùn)算,可以對旋轉(zhuǎn)進(jìn)行緩沖過濾,以使得運(yùn)動關(guān)節(jié)所對應(yīng)的動畫模型的運(yùn)動更加柔順平滑。
優(yōu)選地,該實(shí)現(xiàn)方法還可以包括:消除旋轉(zhuǎn)變換在子關(guān)節(jié)與其父關(guān)節(jié)構(gòu)成的軸向方向上的分量;通過消除后的旋轉(zhuǎn)變換,將子關(guān)節(jié)移動到其下一幀的位置。由此,可以避免子關(guān)節(jié)的自轉(zhuǎn)造成的關(guān)節(jié)絞繞問題。
優(yōu)選地,該實(shí)現(xiàn)方法還可以包括:在檢測到計(jì)算得到的關(guān)節(jié)在下一幀的位置信息與目標(biāo)碰撞體發(fā)生碰撞的情況下,對關(guān)節(jié)的位置信息進(jìn)行修正,以使得修正后關(guān)節(jié)在下一幀的位置信息基本滿足以下條件:修正后關(guān)節(jié)位于目標(biāo)碰撞體的邊緣;修正后關(guān)節(jié)到其父關(guān)節(jié)之間的關(guān)節(jié)臂的長度不變。
由此,可以避免出現(xiàn)模型穿透的問題,比如人物在跑動過程中,衣服的飄動穿透了皮膚、頭發(fā)在人物播放跑動動作會嵌入后背等等,這些都是違背現(xiàn)實(shí)世界物體的運(yùn)動規(guī)律的,對視覺體驗(yàn)造成嚴(yán)重的影響。
優(yōu)選地,關(guān)節(jié)與目標(biāo)碰撞體均為具有預(yù)定半徑的球體,對關(guān)節(jié)的位置信息進(jìn)行修正可以包括:使用如下第二修正公式對關(guān)節(jié)的位置進(jìn)行修正:
其中,pos”n+1為關(guān)節(jié)進(jìn)行修正后在下一幀的位置信息,c1為關(guān)節(jié)修正前在下一幀的位置信息,c2為碰撞體的位置信息,r1為關(guān)節(jié)的半徑,r2為碰撞體的半徑,posp為關(guān)節(jié)的父關(guān)節(jié)的位置信息,len為關(guān)節(jié)到其父關(guān)節(jié)之間的關(guān)節(jié)臂的長度。
優(yōu)選地,該實(shí)現(xiàn)方法還可以包括:從與根關(guān)節(jié)直接相連的關(guān)節(jié)開始,逐級計(jì)算骨骼關(guān)節(jié)樹中的關(guān)節(jié)在下一幀的位置信息、將該關(guān)節(jié)在下一幀的位置信息與當(dāng)前幀的位置信息之間的位置變換轉(zhuǎn)換為繞該關(guān)節(jié)的父關(guān)節(jié)的旋轉(zhuǎn)變換。
由此,通過循環(huán)體的形式從根骨骼關(guān)節(jié)下的子關(guān)節(jié)開始進(jìn)行迭代運(yùn)算,以此模擬整個骨骼動畫的運(yùn)動軌跡。如此一來,既滿足了各骨骼關(guān)節(jié)運(yùn)算的獨(dú)立性,又保證了整棵骨骼關(guān)節(jié)樹運(yùn)算的順序性。
根據(jù)本發(fā)明的一種動畫中動態(tài)骨骼的實(shí)現(xiàn)裝置,包括:骨骼關(guān)節(jié)樹創(chuàng)建模塊,用于創(chuàng)建針對目標(biāo)對象的骨骼關(guān)節(jié)樹,其中,骨骼關(guān)節(jié)樹中直接相連的兩個關(guān)節(jié)中更接近根節(jié)點(diǎn)的關(guān)節(jié)為父關(guān)節(jié),更遠(yuǎn)離根關(guān)節(jié)的關(guān)節(jié)為子關(guān)節(jié);計(jì)算模塊,用于計(jì)算骨骼關(guān)節(jié)樹中的關(guān)節(jié)在下一幀的位置信息;旋轉(zhuǎn)變換模塊,用于針對骨骼關(guān)節(jié)樹中的至少一個子關(guān)節(jié),將該子關(guān)節(jié)從當(dāng)前幀到下一幀的位置變換轉(zhuǎn)換為繞該子關(guān)節(jié)的父關(guān)節(jié)的旋轉(zhuǎn)變換,從而通過旋轉(zhuǎn)變換,將子關(guān)節(jié)移動到其下一幀的位置。
優(yōu)選地,計(jì)算模塊計(jì)算預(yù)定作用力下骨骼關(guān)節(jié)樹中的關(guān)節(jié)在下一幀的位置信息,預(yù)定作用力可以包括下列至少一項(xiàng):重力;關(guān)節(jié)移動過程中受到的與移動方向相反的阻力;以及來自周圍環(huán)境的干擾力。
優(yōu)選地,計(jì)算模塊使用如下位置計(jì)算公式計(jì)算關(guān)節(jié)在下一幀的位置信息posn+1,posn+1=posn+(posn-posn-1)*(1-r)+(gv+d)*δt2
其中,posn+1為關(guān)節(jié)在下一幀的位置信息,posn為關(guān)節(jié)在當(dāng)前幀的位置信息,posn-1為關(guān)節(jié)在上一幀的位置信息,r為阻力作用下的阻力系數(shù),0≤r≤1,gv為重力在關(guān)節(jié)的長度方向上的法向方向上的重力分力作用下的加速度,d為干擾力作用下的加速度,δt為上一幀與當(dāng)前幀之間的時間間隔。
優(yōu)選地,實(shí)現(xiàn)裝置還可以包括:第一修正模塊,用于使用如下第一修正公式對計(jì)算得到的關(guān)節(jié)在下一幀的位置信息posn+1進(jìn)行修正,
其中,pos'n+1為關(guān)節(jié)經(jīng)過補(bǔ)償后在下一幀的位置信息,posp為關(guān)節(jié)的父關(guān)節(jié)的位置信息,len為為關(guān)節(jié)到其父關(guān)節(jié)之間的關(guān)節(jié)臂的長度。
優(yōu)選地,旋轉(zhuǎn)變換模塊可以包括:當(dāng)前方向向量確定模塊,用于根據(jù)子關(guān)節(jié)在當(dāng)前幀的的位置信息,確定從父關(guān)節(jié)到子關(guān)節(jié)的當(dāng)前方向向量;移動向量確定模塊,用于根據(jù)子關(guān)節(jié)在下一幀的的位置信息以及當(dāng)前幀的位置信息,確定子關(guān)節(jié)在其父關(guān)節(jié)坐標(biāo)系下的移動向量;四元數(shù)獲取模塊,用于根據(jù)方向向量和移動向量,獲取繞父關(guān)節(jié)進(jìn)行旋轉(zhuǎn)變換的四元數(shù)。
優(yōu)選地,旋轉(zhuǎn)變換模塊還可以包括:插值運(yùn)算模塊,用于使用四元數(shù)插值算法對四元數(shù)進(jìn)行插值運(yùn)算,以得到緩沖四元數(shù),旋轉(zhuǎn)模塊,用于基于緩沖四元數(shù)對父關(guān)節(jié)和子關(guān)節(jié)進(jìn)行旋轉(zhuǎn)變換。
優(yōu)選地,旋轉(zhuǎn)變換模塊還用于消除旋轉(zhuǎn)變換在子關(guān)節(jié)與其父關(guān)節(jié)構(gòu)成的軸向方向上的分量,通過消除后的旋轉(zhuǎn)變換,將子關(guān)節(jié)移動到其下一幀的位置。
優(yōu)選地,實(shí)現(xiàn)裝置還可以包括:第二修正模塊,用于在檢測到計(jì)算得到的關(guān)節(jié)在下一幀的位置信息與目標(biāo)碰撞體發(fā)生碰撞的情況下,對關(guān)節(jié)的位置信息進(jìn)行修正,以使得修正后關(guān)節(jié)在下一幀的位置信息基本滿足以下條件:修正后關(guān)節(jié)位于目標(biāo)碰撞體的邊緣;修正后關(guān)節(jié)到其父關(guān)節(jié)之間的關(guān)節(jié)臂的長度不變。
優(yōu)選地,第二修正模塊可以使用如下第二修正公式對關(guān)節(jié)的位置進(jìn)行修正:
其中,pos”n+1為關(guān)節(jié)進(jìn)行修正后在下一幀的位置信息,c1為關(guān)節(jié)修正前在下一幀的位置信息,c2為碰撞體的位置信息,r1為關(guān)節(jié)的半徑,r2為碰撞體的半徑,posp為關(guān)節(jié)的父關(guān)節(jié)的位置信息,len為關(guān)節(jié)到其父關(guān)節(jié)之間的關(guān)節(jié)臂的長度。
優(yōu)選地,計(jì)算模塊從根關(guān)節(jié)開始逐級計(jì)算骨骼關(guān)節(jié)樹中的關(guān)節(jié)在下一幀的位置信息,旋轉(zhuǎn)變換模塊從與根關(guān)節(jié)直接相連的關(guān)節(jié)開始,逐級將該關(guān)節(jié)在下一幀的位置信息與當(dāng)前幀的位置信息之間的位置變換轉(zhuǎn)換為繞該關(guān)節(jié)的父關(guān)節(jié)的旋轉(zhuǎn)變換。
本發(fā)明的動畫中動態(tài)骨骼的實(shí)現(xiàn)方法和裝置,通過計(jì)算關(guān)節(jié)在下一幀的位置信息,將關(guān)節(jié)的位置變換轉(zhuǎn)換為繞該關(guān)節(jié)的父關(guān)節(jié)的旋轉(zhuǎn)變換,從而通過所述旋轉(zhuǎn)變換,將關(guān)節(jié)移動到其下一幀的位置,可以使得運(yùn)動過程更加平滑,改善視覺效果。
附圖說明
通過結(jié)合附圖對本公開示例性實(shí)施方式進(jìn)行更詳細(xì)的描述,本公開的上述以及其它目的、特征和優(yōu)勢將變得更加明顯,其中,在本公開示例性實(shí)施方式中,相同的參考標(biāo)號通常代表相同部件。
圖1是示出了根據(jù)本發(fā)明一實(shí)施例的動畫中動態(tài)骨骼的實(shí)現(xiàn)方法的示意性流程圖。
圖2是示出了針對頭發(fā)構(gòu)建的骨骼關(guān)節(jié)樹的示意圖。
圖3是示出了根據(jù)本發(fā)明另一實(shí)施例的動畫中動態(tài)骨骼的實(shí)現(xiàn)方法的示意性流程圖。
圖4是示出了關(guān)節(jié)所受重力的分析示意圖。
圖5是示出了疊加各外在作用力后頭發(fā)的運(yùn)動效果圖
圖6a是示出了在模型圖中定義約束碰撞體的示意圖。
圖6b是示出了另一種方式下定義約束碰撞體的示意圖。
圖7是示出了判定球體與球體是否碰撞的示意圖。
圖8是示出了判定球體與膠囊體是否碰撞的示意圖。
圖9是示出了定義碰撞體前和定義碰撞體后頭發(fā)的對比圖。
圖10是示出了進(jìn)行插值處理前和插值處理后的對比圖。
圖11是示出了旋轉(zhuǎn)過程造成的絞繞現(xiàn)象以及解決后的示意圖。
圖12、圖13是示出了利用本發(fā)明進(jìn)行處理后的動畫效果圖。
圖14是示出了根據(jù)本發(fā)明一實(shí)施例的動畫中動態(tài)骨骼的實(shí)現(xiàn)裝置的結(jié)構(gòu)的示意性方框圖。
具體實(shí)施方式
下面將參照附圖更詳細(xì)地描述本公開的優(yōu)選實(shí)施方式。雖然附圖中顯示了本公開的優(yōu)選實(shí)施方式,然而應(yīng)該理解,可以以各種形式實(shí)現(xiàn)本公開而不應(yīng)被這里闡述的實(shí)施方式所限制。相反,提供這些實(shí)施方式是為了使本公開更加透徹和完整,并且能夠?qū)⒈竟_的范圍完整地傳達(dá)給本領(lǐng)域的技術(shù)人員。
在詳細(xì)介紹本發(fā)明前,首先對本發(fā)明涉及的一些背景術(shù)語做以簡要說明。
多邊形網(wǎng)格(polygonmesh):簡稱網(wǎng)格,是在三維電腦繪圖中用來表示立體模型的一種結(jié)構(gòu),包括頂點(diǎn)、面、法線、切線、頂點(diǎn)顏色、紋理坐標(biāo)等一系列基礎(chǔ)數(shù)據(jù)的定義。
骨骼蒙皮動畫(skeletalanimation):簡稱骨骼動畫,其原理為:在每一幀的動畫播放過程中,動畫關(guān)鍵幀數(shù)據(jù)驅(qū)動骨骼關(guān)節(jié)變換(包括位移、旋轉(zhuǎn)、縮放),然后結(jié)合蒙皮信息,骨骼關(guān)節(jié)進(jìn)一步驅(qū)動網(wǎng)格頂點(diǎn)的變換,以此完成模型動畫的模擬。一個骨骼動畫模型通常包括骨骼關(guān)節(jié)(joint)層次結(jié)構(gòu)數(shù)據(jù),網(wǎng)格數(shù)據(jù),網(wǎng)格蒙皮數(shù)據(jù)和骨骼的動畫(關(guān)鍵幀)數(shù)據(jù)。相比于其他動畫類似(如頂點(diǎn)動畫、變形動畫)具有數(shù)據(jù)簡明、占用存儲空間少、制作便捷、支持動態(tài)生成序列幀、支持正向反向動力學(xué)等諸多優(yōu)點(diǎn)。
蒙皮信息(skininfo):簡稱蒙皮,一種三維動畫制作過程中使用到的技術(shù)手段,由于骨骼關(guān)節(jié)與網(wǎng)格頂點(diǎn)在結(jié)構(gòu)設(shè)計(jì)上是相互獨(dú)立的,為了實(shí)現(xiàn)骨骼關(guān)節(jié)對網(wǎng)格頂點(diǎn)的控制,需要一種橋接數(shù)據(jù)來指定它們之間的關(guān)聯(lián)性,即骨骼關(guān)節(jié)對周圍哪些頂點(diǎn)產(chǎn)生影響以及影響權(quán)重是多少,這種將模型各網(wǎng)格頂點(diǎn)綁定骨骼關(guān)節(jié)并指定權(quán)重的技術(shù)叫做蒙皮;生成的數(shù)據(jù)結(jié)構(gòu)稱為蒙皮信息。
萬向節(jié)死鎖(gimballock):簡稱萬向鎖,當(dāng)使用歐拉角構(gòu)件剛體在三維歐幾里得空間中的有限轉(zhuǎn)動時,三個旋轉(zhuǎn)軸中的兩個軸發(fā)生重合時,會失去一個自由度的情形。
靜態(tài)骨骼動畫:指模型的骨骼關(guān)節(jié)的運(yùn)動軌跡是固定不變的,通常由美術(shù)制作人員負(fù)責(zé)設(shè)計(jì)并以特定的文件格式輸出的動畫類型,是相對于動態(tài)骨骼而言的。
下面首先結(jié)合圖1就本發(fā)明的動畫中動態(tài)骨骼的實(shí)現(xiàn)方法的基本流程做簡要說明。參見圖1,在步驟s110,創(chuàng)建針對目標(biāo)對象的骨骼關(guān)節(jié)樹。
本發(fā)明所針對的目標(biāo)對象可以是多種類型的動畫模型,例如可以是動畫人物、人物的頭發(fā)、人物所持有的武器、以及動畫環(huán)境中的其它物體如植物、動物、云朵等等。
由于本發(fā)明的主要目的在于使得動畫模型的運(yùn)動在視覺上更加逼真,因此,本發(fā)明所針對的目標(biāo)對象可以優(yōu)選地是某個動畫物體中需要進(jìn)行移動的部分。例如,目標(biāo)對象可以是動畫人物的頭發(fā)、裙子、所持有的鞭子等等。如圖2所示,針對圖中左邊的頭發(fā)模型,可以右圖所示的構(gòu)建骨骼關(guān)節(jié)樹,右圖中的圓球即表示所構(gòu)建的骨骼關(guān)節(jié)樹中的每個骨骼關(guān)節(jié),相鄰兩個圓球之間的白色線段可以視為相鄰關(guān)節(jié)之間的關(guān)節(jié)臂。
創(chuàng)建針對目標(biāo)對象的骨骼關(guān)節(jié)樹的過程為本領(lǐng)域技術(shù)人員所公知,這里不再詳述。需要說明的是,骨骼關(guān)節(jié)樹的創(chuàng)建過程可以由制作動畫的美術(shù)制作人員開發(fā),并且出于調(diào)試效率與控制粒度的需求,所構(gòu)建的骨骼關(guān)節(jié)樹中的每個關(guān)節(jié)可以綁定一個腳本進(jìn)行參數(shù)的控制,包括阻力系數(shù)、碰撞半徑、目標(biāo)碰撞體(即需要進(jìn)行穿透規(guī)避評估的碰撞體)。例如,骨骼關(guān)節(jié)樹中的每個關(guān)節(jié)都可以綁定包括中心位置坐標(biāo)、半徑、所受拖拽力、所涉及的目標(biāo)碰撞體等參數(shù)的腳本,以便實(shí)時模擬運(yùn)動軌跡,同時方便對參數(shù)進(jìn)行調(diào)整。
可以將所創(chuàng)建的骨骼關(guān)節(jié)樹中直接相連的兩個關(guān)節(jié)中更接近根關(guān)節(jié)的關(guān)節(jié)為父關(guān)節(jié),更遠(yuǎn)離根關(guān)節(jié)的關(guān)節(jié)為子關(guān)節(jié)。骨骼關(guān)節(jié)樹中沒有子關(guān)節(jié)的關(guān)節(jié)可以稱為葉子關(guān)節(jié),最頂端的關(guān)節(jié)為根關(guān)節(jié)。
在創(chuàng)建完成骨骼關(guān)節(jié)樹后,針對骨骼關(guān)節(jié)樹中的一個關(guān)節(jié),可以順序執(zhí)行步驟s120、步驟s130。
在步驟s120,計(jì)算該關(guān)節(jié)在下一幀的位置信息。此處需要說明的是,本發(fā)明中所計(jì)算的關(guān)節(jié)的位置信息可以是骨骼動畫中的世界坐標(biāo)系下的位置信息。
在步驟s130,將該關(guān)節(jié)從當(dāng)前幀到下一幀的位置變換轉(zhuǎn)換為繞該關(guān)節(jié)的父關(guān)節(jié)的旋轉(zhuǎn)變換,從而通過旋轉(zhuǎn)變換,可以將子關(guān)節(jié)移動到其下一幀的位置。將關(guān)節(jié)的位置變換轉(zhuǎn)換為該關(guān)節(jié)的父關(guān)節(jié)的旋轉(zhuǎn)變換的具體實(shí)現(xiàn)過程將在下文詳細(xì)說明,這里暫不敘述。
需要說明的是,步驟s130所針對的關(guān)節(jié)主要是骨骼關(guān)節(jié)樹中的非根關(guān)節(jié)。這是因?yàn)椋P(guān)節(jié)一般是動態(tài)骨骼與靜態(tài)骨骼的交匯處,根關(guān)節(jié)的運(yùn)動軌跡主要由靜態(tài)骨骼動畫決定。例如,頭部可以認(rèn)為是根關(guān)節(jié),頭發(fā)屬于頭部的子關(guān)節(jié),頭部的運(yùn)動狀態(tài)應(yīng)該由其父關(guān)節(jié)軀干(靜態(tài)骨骼)決定。因此,對于根關(guān)節(jié)的位置變換,可以不執(zhí)行本發(fā)明的動態(tài)骨骼的實(shí)現(xiàn)方法,而由美術(shù)預(yù)先設(shè)定,或者是游戲里的動畫控制器設(shè)定。
至此,結(jié)合圖1、圖2簡要說明了利用本發(fā)明實(shí)現(xiàn)骨骼關(guān)節(jié)樹中的一個關(guān)節(jié)在下一幀的移動的過程。在利用本發(fā)明實(shí)現(xiàn)骨骼關(guān)節(jié)樹中多個關(guān)節(jié)的移動時,可以由上到下逐級進(jìn)行。如圖3所示,方法開始于步驟s210,從與根關(guān)節(jié)直接連接的關(guān)節(jié)(即根關(guān)節(jié)的子關(guān)節(jié))開始,計(jì)算關(guān)節(jié)在下一幀的位置信息(步驟s220),然后將該關(guān)節(jié)的位置變換轉(zhuǎn)化為繞該關(guān)節(jié)的父關(guān)節(jié)的旋轉(zhuǎn)變換(步驟s230),由此完成了對根關(guān)節(jié)的子關(guān)節(jié)的處理,在完成后,可以判斷該關(guān)節(jié)是否為最底層的葉子關(guān)節(jié)(步驟s240),如果是,則處理結(jié)束(步驟s250),如果不是,則可以繼續(xù)對該關(guān)節(jié)的子關(guān)節(jié)執(zhí)行步驟s220、步驟s230的處理,直到處理完骨骼關(guān)節(jié)樹中的葉子關(guān)節(jié)為止。其中,步驟s220、步驟s230的處理過程與圖1中的步驟s120、步驟s130相同,這里不再贅述。
如上文所述,根關(guān)節(jié)一般是動態(tài)骨骼與靜態(tài)骨骼的交匯處,根關(guān)節(jié)的運(yùn)動軌跡主要由靜態(tài)骨骼動畫決定,因此對于根關(guān)節(jié)可以僅確定其在下一幀的位置信息,而不進(jìn)行旋轉(zhuǎn)變換。
也就是說,可以從與根關(guān)節(jié)直接相連的關(guān)節(jié)開始,逐級計(jì)算骨骼關(guān)節(jié)樹中的關(guān)節(jié)在下一幀的位置信息、將該關(guān)節(jié)在下一幀的位置信息與當(dāng)前幀的位置信息之間的位置變換轉(zhuǎn)換為繞該關(guān)節(jié)的父關(guān)節(jié)的旋轉(zhuǎn)變換。
根據(jù)上文對本發(fā)明的描述可知,本發(fā)明的動態(tài)骨骼的實(shí)現(xiàn)方法主要包括三個步驟:創(chuàng)建骨骼關(guān)節(jié)樹、計(jì)算關(guān)節(jié)的位置變換、將關(guān)節(jié)的位置變換轉(zhuǎn)換為父關(guān)節(jié)的旋轉(zhuǎn)變換。其中,關(guān)節(jié)骨骼關(guān)節(jié)樹的創(chuàng)建過程為本領(lǐng)域技術(shù)人員所公知,這里不再贅述。下面分別就“計(jì)算關(guān)節(jié)的位置變換”、“關(guān)節(jié)的位置變換轉(zhuǎn)換為父關(guān)節(jié)的旋轉(zhuǎn)變換”的具體實(shí)現(xiàn)做進(jìn)一步說明。
一、計(jì)算關(guān)節(jié)的位置變換
下面主要從算法的選擇、外力的干擾以及碰撞的規(guī)避三方面進(jìn)行說明。
1.1算法的選擇
在游戲開發(fā)過程中,常常需要控制各種物體進(jìn)行移動,如人物角色、子彈等等,最為常用的方法便是使用歐拉方法,也叫歐拉折線法,即在每一幀中記錄物體的位置與速度,與幀間間隔結(jié)合運(yùn)算來預(yù)測下一幀物體的位置,于是物體就“動”起來了。
定義物體當(dāng)前位置為x,下一步位置為x',當(dāng)前速度為v,下一步速度為v',加速度為a,質(zhì)量為m以及所受到的力為f,則有
歐拉方法的幾何解析就是將物體的整個移動過程分割為無數(shù)個小段,通過迭代式地計(jì)算每一段路線,最后將所有這些路線“累加”在一起,以近似的模擬物體的運(yùn)動軌跡。然而改變物體運(yùn)動軌跡的力一般都是持續(xù)進(jìn)行的,而不是斷續(xù)進(jìn)行的。比如一個受重力影響垂直降落的物體,在下墜的過程中,基速度的變化是平滑遞增的,而不是公式所表述的在幀末才考慮速度的變更,這無形中會造成物體運(yùn)動軌跡的失真。雖然通過降低幀間的繪制間隔可以讓速度的變更更為平滑,但跳躍式計(jì)算造成的誤差還是依然存在。其次,因?yàn)槲矬w最新的位置是將之前無數(shù)個小段的計(jì)算結(jié)果的累加,而中間每小段的計(jì)算都存在一定的誤差,這就導(dǎo)致了最終的計(jì)算結(jié)果也包含了無數(shù)個小段誤差的累加,即誤差存在放大效應(yīng),這進(jìn)一步造成物體運(yùn)動軌跡的失真。
在數(shù)學(xué)和計(jì)算機(jī)科學(xué)中,歐拉方法,是一種解決數(shù)值常微分方程的最基本的一階數(shù)值方法,是一種常用于計(jì)算非線性動力學(xué)的顯式求解法(explicitmethod),而顯式求解法的缺點(diǎn)就是步長對結(jié)果的準(zhǔn)確性影響較大,步長越大,準(zhǔn)確性越差。
韋爾萊算法是經(jīng)典力學(xué)(牛頓力學(xué))中經(jīng)典的積分方法,是對牛頓第二定律(運(yùn)動方程)在計(jì)算機(jī)上運(yùn)用的一種數(shù)值積分方法。一般情況下,它有三種表述形式:位置積分方程,蛙跳積分方程和速度積分方程,本提案需要使用到的是位置積分方程。與歐拉方法不同,韋爾萊位置積分方程通過物體當(dāng)前位置和上一步的位置來預(yù)測物體下一步的位置,假設(shè)物體在第n步的移動加速度為an、移動速度vn、位置xn,時間步長為δt則有:
假設(shè)物體在移動過程中,加速度a和時間步長δt是固定不變的,結(jié)合
有
xn+1=xn+(xn-xn-1)+a*δt2=2xn-xn-1+a*δt2
這就是經(jīng)典的韋爾萊位置積分方程,通過公式可以看出,為求下一步物體所在的位置,需要具備的因子有加速度a、時間步長δt、當(dāng)前所在位置xn和上一步所在位置xn-1。顯然,在游戲運(yùn)行過程中,如果加速度是固定的情況下,其他三個因子可以完美地跟游戲的繪制過程結(jié)合在一起,即xn為物體當(dāng)前幀所在的位置,xn-1為物體上一幀所在的位置,δt為兩幀之間的時間差。因?yàn)閍、xn-1和δt已知,所以通過改變物體當(dāng)前幀的位置xn即可對物體的移動軌跡實(shí)現(xiàn)控制,這在交互類游戲中很是常見,比如橡皮球掉到地上表面出現(xiàn)收縮后膨脹的表現(xiàn)、風(fēng)吹動布匹時出現(xiàn)的飄揚(yáng)舞動的效果,都可以通過方程的運(yùn)算來模擬。
韋爾萊算法不僅計(jì)算效率快(跟歐拉方法一樣快),而且其誤差等級達(dá)到了4階精度(歐拉方法的誤差等級只有1階精度)。相比之下,使用歐拉方法則“笨拙”得多,物體受力狀態(tài)如何、當(dāng)前幀的速度是多少,這些“包袱”都需要一一計(jì)算得出,然后再代入到方程求得結(jié)果,運(yùn)算效率因此變得低效。
1.2、外力的干擾
通過上文的分析可知,可以使用韋爾萊算法計(jì)算關(guān)節(jié)在下一幀的位置。其中,關(guān)節(jié)在運(yùn)動的過程中一般會受到重力、阻力、干擾力(如風(fēng))等力的作用。除此之外,因?yàn)槊繋瑢﹃P(guān)節(jié)的位置都進(jìn)行偏移運(yùn)算,所以對關(guān)節(jié)的長度(即從當(dāng)前關(guān)節(jié)到父關(guān)節(jié)之間的關(guān)節(jié)臂的長度)也要進(jìn)行修正處理,以確保在骨骼動作播放過程,每個關(guān)節(jié)的長度都是一直不變的。當(dāng)然,有些骨骼動畫會帶有關(guān)節(jié)伸縮的需求,但這不在本發(fā)明的討論范圍之內(nèi)。具體的運(yùn)算過程如下:
1.2.1、重力模擬
由于物體的受重力影響的表現(xiàn)是以墜落加速度的形式體現(xiàn)的。出于簡化模型的目的,本提案用一個浮點(diǎn)數(shù)來表示關(guān)節(jié)受重力影響的權(quán)重,通常為一個負(fù)數(shù)。如果關(guān)節(jié)在下墜過程中受到的空氣阻力越大,則權(quán)重越小,反之亦然。由于關(guān)節(jié)之間的長度不變性,因此關(guān)節(jié)的運(yùn)動軌跡受重力的影響需要結(jié)合力的分解進(jìn)行分析,如圖4所示,一般情況下重力g向量與ab關(guān)節(jié)向量u是不平行的,因?yàn)閎關(guān)節(jié)在運(yùn)動過程中,其與父關(guān)節(jié)a的長度保持不變,即u向量的長度不變,因此重力g向量可分解為兩個正交向量:對ab運(yùn)動有貢獻(xiàn)的分量垂直于u向量,設(shè)為gv,對ab運(yùn)動無貢獻(xiàn)的分量平行于u向量,設(shè)為gu。有
g=gu+gv
合并兩式,可得
gv即為重力g對關(guān)節(jié)運(yùn)動產(chǎn)生影響的部分。出于簡化計(jì)算的目的,不考慮重力加速度的影響,可以直接將gv作為變化因素并入公式計(jì)算之中。
1.2.2、干擾力摸擬
一般情況下,角色所受干擾力主要指來自于風(fēng)等自然因素的影響,具有隨機(jī)性,包括隨機(jī)的方向、隨機(jī)的力度和隨機(jī)的持續(xù)時間。本發(fā)明可以采用噪聲來模擬這三個因素。此因素是可選的,如果模型在場景中不受任何干擾力影響,可以忽略。
1.2.3、阻力模擬
每個關(guān)節(jié)在運(yùn)動的過程中都會受到阻力的影響,關(guān)節(jié)的運(yùn)動幅度隨著關(guān)節(jié)的傳遞表現(xiàn)得越來越小,阻力的方向與運(yùn)動的方向相反。為了簡化運(yùn)算,本提案使用一個浮點(diǎn)數(shù)來表示受阻力影響下運(yùn)行幅度的衰減程度,其范圍在[0,1]區(qū)間,0表示無衰減,即完全不受阻力影響,1表示全衰減,即在阻力的影響下關(guān)節(jié)運(yùn)動幅度為零。
假設(shè)d為干擾力作用下的加速度,gv為重力在關(guān)節(jié)的長度方向上的法向方向上的重力分力作用下的加速度,r為阻力作用下的阻力系數(shù),0≤r≤1,結(jié)合上面的韋爾萊公式有
posn+1=posn+(posn-posn-1)*(1-r)+(gv+d)*δt2(1)
其中,posn+1為關(guān)節(jié)在下一幀的位置信息,posn為關(guān)節(jié)在當(dāng)前幀的位置信息,posn-1為關(guān)節(jié)在上一幀的位置信息,δt為上一幀與當(dāng)前幀之間的時間間隔。posn+1、posn、posn-1、gv、d可以均是矢量,r為標(biāo)量。
公式(1)為綜合了重力、阻力以及干擾力三種外力作用下的位置計(jì)算公式,在實(shí)際計(jì)算中,如果需要忽略某個或某幾個作用力,去除公式(1)中相應(yīng)的參量即可。例如,如果忽略重力的影響,gv的取值為零,此時有posn+1=posn+(posn-posn-1)*(1-r)+d*δt2。
圖5示出了疊加各因素后頭發(fā)的運(yùn)動效果圖。其中,圖中的圓點(diǎn)即為骨骼關(guān)節(jié),圖5中的四幅圖由左到右依次為標(biāo)準(zhǔn)形態(tài)(不考慮外力作用下的形態(tài))、疊加重力的形態(tài)、進(jìn)一步疊加干擾力的形態(tài)、進(jìn)一步疊加阻力的形態(tài)。
1.2.4、位置修正
可以使用如下第一位置修正公式對計(jì)算得到的關(guān)節(jié)在下一幀的位置信息posn+1進(jìn)行修正,
其中,pos'n+1為關(guān)節(jié)經(jīng)過補(bǔ)償后在下一幀的位置信息,posp為關(guān)節(jié)的父關(guān)節(jié)的位置信息,len為關(guān)節(jié)到其父關(guān)節(jié)之間的關(guān)節(jié)臂的長度。pos'n+1即為每幀中關(guān)節(jié)在原有速度移動的情況下受各力影響以及進(jìn)行修正后所處的新位置。
第一位置修正公式中的運(yùn)算為矢量運(yùn)算,|posn+1-posp|表示posn+1到posp的距離(歐氏距離),
1.3、穿透規(guī)避
在利用上述公式得到了骨骼關(guān)節(jié)樹中的關(guān)節(jié)在各種力作用下的實(shí)時位置后??紤]到部分關(guān)節(jié)與外界環(huán)境存在交互的可能,而模型頂點(diǎn)隨骨骼關(guān)節(jié)運(yùn)行過程中,其運(yùn)行軌跡是在運(yùn)行過程中實(shí)時計(jì)算的,有一定的隨機(jī)性,這就意味著可能出現(xiàn)模型穿透的問題,比如人物在跑動過程中,衣服的飄動穿透了皮膚、頭發(fā)在人物播放跑動動作會嵌入后背等等,這些都是違背現(xiàn)實(shí)世界物體的運(yùn)動規(guī)律的,對視覺體驗(yàn)造成嚴(yán)重的影響。
因此,還需要對關(guān)節(jié)定義相應(yīng)的約束碰撞體,進(jìn)行碰撞規(guī)避運(yùn)算,即在骨骼關(guān)節(jié)完成位置變換運(yùn)算后進(jìn)行穿透規(guī)避運(yùn)算以便對關(guān)節(jié)位置作出校正。此處可以通過關(guān)節(jié)上的腳本來指定約束碰撞體,例如可以在腳本上為關(guān)節(jié)指定一個或多個約束碰撞體。如圖6a所示,可以指定模型圖中的兩只手的上臂與下臂部分為約束碰撞體,圖6a中示出的球體即為我們定義的約束碰撞體。
通過以上的定義規(guī)劃之后,圖6a中動畫模型的頭發(fā)在運(yùn)行狀態(tài)下,關(guān)節(jié)的運(yùn)動軌跡就會一直受到碰撞體影響,約束在一定范圍內(nèi)。由于不同關(guān)節(jié)的規(guī)避需求可能不同,所以每個需要約束的關(guān)節(jié)均可以定義各自的約束碰撞體。
另外,除使用球體進(jìn)行碰撞檢測外,也可以使用膠囊體作為目標(biāo)碰撞體。在綁定碰撞體時,對于近似球體或膠囊體的模型部位,我們可以直接分別綁定球形碰撞體或膠囊形碰撞體來定義碰撞區(qū)域。而對于無規(guī)則形體的部件,可以采用多個球體或膠囊體連接定義的形式來處理。如圖6b所示,人體模型的手臂由上手臂與下手臂組成,此時可以通過兩個膠囊體連接來定義碰撞區(qū)域。
下面分別就球體和球體之間進(jìn)行碰撞的檢測、規(guī)避,球體和膠囊體之間進(jìn)行碰撞的檢測、規(guī)避進(jìn)行說明,應(yīng)該知道,對于其它模型的碰撞也可以參考本發(fā)明的方法進(jìn)行相應(yīng)的處理,這里不再贅述。
1.3.1、判定球體與球體是否碰撞
對于每個需要檢測碰撞的關(guān)節(jié),可以通過定義一個球體(包括球心與半徑)來指定它的碰撞區(qū)域以及它需要檢測的其他碰撞體區(qū)域(如肢體),也是以球體的形式進(jìn)行規(guī)劃??梢愿鶕?jù)兩個球體半徑之和與球心距離的關(guān)系,判斷它們是否發(fā)生碰撞。
如圖7所示,假設(shè)關(guān)節(jié)的位置為c1,半徑為r1,目標(biāo)碰撞體位置為c2,半徑為r2,關(guān)節(jié)與目標(biāo)碰撞體發(fā)生碰撞時,兩者的距離d=|c1-c2|。
當(dāng)d=|c1-c2|<r1+r2時,表明關(guān)節(jié)發(fā)生碰撞,需要進(jìn)行位置校正,方法就是將關(guān)節(jié)的位置往目標(biāo)碰撞體的反方向移動,直至滿足d=|c1-c2|=r1+r2。
而為了規(guī)避碰撞,同時保持關(guān)節(jié)的長度不變,避免模型伸縮的情況出現(xiàn),還需要對規(guī)避碰撞后的位置進(jìn)行修正。
因此,在檢測到計(jì)算得到的關(guān)節(jié)在下一幀的位置信息與目標(biāo)碰撞體發(fā)生碰撞的情況下,對關(guān)節(jié)的位置信息進(jìn)行修正時,需要滿足或基本滿足以下條件:①、修正后關(guān)節(jié)位于目標(biāo)碰撞體的邊緣;②、修正后關(guān)節(jié)到其父關(guān)節(jié)之間的關(guān)節(jié)臂的長度不變。
基于上述兩個限制條件,可以使用如下第二修正公式對關(guān)節(jié)的位置進(jìn)行校正,
其中,pos”n+1為關(guān)節(jié)進(jìn)行修正后在下一幀的位置信息,c1為關(guān)節(jié)修正前在下一幀的位置信息,c2為碰撞體的位置信息,r1為關(guān)節(jié)的半徑,r2為碰撞體的半徑,posp為關(guān)節(jié)的父關(guān)節(jié)的位置信息,len為關(guān)節(jié)到其父關(guān)節(jié)之間的關(guān)節(jié)臂的長度。
posp、c1、c2可以均為三維向量,公式(2)中的運(yùn)算可以為矢量運(yùn)算,|c1-c2|表示c1到c2的距離(歐氏距離),
由此,利用公式(2)對關(guān)節(jié)進(jìn)行修正,可以保證關(guān)節(jié)長度不變的前提下,沿著目標(biāo)碰撞體邊緣放置關(guān)節(jié)。通過蒙皮變換后,模型的表面就會按關(guān)節(jié)的位置“覆蓋”在目標(biāo)碰撞體的邊緣上。例如,可以使得人物模型在跑動過程中,頭發(fā)只會披在后背上或者隨風(fēng)飄動起來,不會出現(xiàn)穿透皮膚的問題。
1.3.2、判定球體與膠囊體是否碰撞
在使用膠囊體作為目標(biāo)碰撞體時,需要判定球體與膠囊體的碰撞檢測。判定兩者發(fā)生碰撞的主要方法就是將球心往膠囊體的軸進(jìn)行投影,通過計(jì)算投影位置與球心的距離長度是否達(dá)到膠囊體半徑進(jìn)行判定。
具體如圖8所示,假設(shè)球體的球心為c、半徑為rs,膠囊體的兩個球心為m、n,半徑為rc,球體球心在膠囊體上的投影點(diǎn)為p,如果p點(diǎn)位于mn之間,則判定dpc=|p-c|<rs+rc
如果p點(diǎn)位于mn之外,會有兩種情況,靠近m點(diǎn)或靠近n點(diǎn)。如果靠近m點(diǎn),則判定dmc=|m-c|<rs+rc
如果p點(diǎn)靠近n點(diǎn),同理dnc=|n-c|<rs+rc
至此,可以確定球與膠囊體是否發(fā)生碰撞。同樣,為了實(shí)現(xiàn)碰撞規(guī)避,需要對球(骨骼關(guān)節(jié))進(jìn)行位置校正,基本方法與上文1.3.1節(jié)球體的處理是一樣的,這里不再贅述。
在模型的某些部件綁定碰撞體后,動態(tài)骨骼關(guān)節(jié)在模擬運(yùn)動軌跡時就會計(jì)算是否與這些碰撞體發(fā)生碰撞,一旦發(fā)生碰撞,就會采用上文的規(guī)避公式進(jìn)行位置修正。如圖9所示,左圖是頭發(fā)定義碰撞體之前各骨骼關(guān)節(jié)的形態(tài),它們以順滑的姿態(tài)逐個排列;右圖是定義了碰撞體(球體)后各骨骼關(guān)節(jié)的形態(tài),因受碰撞體影響,整個骨骼鏈路出現(xiàn)的彎曲,特別是第三個骨骼關(guān)節(jié),在對碰撞體進(jìn)行碰撞規(guī)避中,它對骨骼關(guān)節(jié)的排列的影響是最大的。
最后需要說明的是,穿透規(guī)避只在需要約束特定部件的關(guān)節(jié)運(yùn)動范圍時才需要采用,一般是由美術(shù)或策劃決定。如果沒有這方面的需求,則可以不指定約束碰撞體。
二、旋轉(zhuǎn)變換
2.1、四元數(shù)的獲取
在得到每個關(guān)節(jié)在各種力作用以及規(guī)避碰撞體的約束下的實(shí)時位置后,可以使用這些新的關(guān)節(jié)位置來控制模型各頂點(diǎn)按前后幀的變換進(jìn)行移動,以表現(xiàn)出模型的動畫效果。
但由于向量的變換插值并不是平滑的,因此可以借助一個數(shù)學(xué)工具——四元數(shù)來實(shí)現(xiàn)。四元數(shù)通常用來表示3d動畫中的旋轉(zhuǎn)變換,其最大的特點(diǎn)就是它表示的變換插值是一個球面線性插值,是平滑的。因此,可以將關(guān)節(jié)的位置變換轉(zhuǎn)換為父關(guān)節(jié)的旋轉(zhuǎn)變換,該旋轉(zhuǎn)變換可以由四元數(shù)表示。
關(guān)于四元數(shù)的概念為本領(lǐng)域技術(shù)人員所公知,這里不再贅述。下面主要就根據(jù)關(guān)節(jié)的位置變換確定四元數(shù)的一種可行的方式進(jìn)行說明,下面述及的四元數(shù)的確定方式僅是一種示例性說明,應(yīng)該知道,還可以有其它多種確定四元數(shù)的方式,這里不再贅述。
具體來說,可以根據(jù)關(guān)節(jié)在當(dāng)前幀的位置信息,確定從父關(guān)節(jié)np到子節(jié)點(diǎn)n的當(dāng)前方向向量為v’,v’可以視為是父關(guān)節(jié)坐標(biāo)系下的子關(guān)節(jié)的朝向向量。其中,這里父關(guān)節(jié)np的位置為所確定的父關(guān)節(jié)np在下一幀的位置。
根據(jù)子關(guān)節(jié)在下一幀的的位置信息以及當(dāng)前幀的位置信息,可以確定子關(guān)節(jié)在其父關(guān)節(jié)坐標(biāo)系下的移動向量δv。
根據(jù)當(dāng)前方向向量為v’和移動向量δv就可以確定四元數(shù)。例如可以使用四元數(shù)函數(shù)quaternion(v’,δv)確定繞父關(guān)節(jié)進(jìn)行旋轉(zhuǎn)變換的四元數(shù)rotp。四元數(shù)rotp的旋轉(zhuǎn)軸可以是過父關(guān)節(jié)的多種方向的旋轉(zhuǎn)軸,優(yōu)選地,可以是過父關(guān)節(jié)的垂直于δv和v’構(gòu)成的平面的垂線。
2.1、四元數(shù)插值
考慮到某些動作的幅度較大,關(guān)節(jié)之間的旋轉(zhuǎn)角度在兩幀之間也隨著變大,為此,可以對旋轉(zhuǎn)進(jìn)行緩沖過濾,以使得運(yùn)動關(guān)節(jié)所對應(yīng)的動畫模型的運(yùn)動更加柔順平滑。
因此,可以使用四元數(shù)插值算法對四元數(shù)進(jìn)行插值運(yùn)算,以得到緩沖四元數(shù),然后可以基于緩沖四元數(shù)對父關(guān)節(jié)和子關(guān)節(jié)進(jìn)行旋轉(zhuǎn)變換。例如,可以通過四元數(shù)插值函數(shù)quaternion.lerp來獲取緩沖四元數(shù)deltarot:
deltarot=quaternion.lerp(quaternion.identity,rotp)
由于骨骼動畫的模型頂點(diǎn)位置由骨骼關(guān)節(jié)變換決定,因此可以將上面的四元數(shù)作為關(guān)節(jié)的旋轉(zhuǎn)變換分量以完成關(guān)節(jié)的動畫控制,然后以此類推,對模型整棵關(guān)節(jié)樹進(jìn)行類似的處理,可以完成每幀骨骼關(guān)節(jié)變換的運(yùn)算。
通過對四元數(shù)進(jìn)行插值處理,基于插值處理后的四元數(shù)所對應(yīng)的旋轉(zhuǎn)變換控制關(guān)節(jié)運(yùn)動可以使得模型的運(yùn)動更加柔順平滑。如圖10所示,三幅圖中最左邊的圖為未經(jīng)旋轉(zhuǎn)變換后的形態(tài),中間的圖為沒有進(jìn)行插值過濾后旋轉(zhuǎn)變換后的形態(tài),最右邊的圖為進(jìn)行差值過濾后再進(jìn)行旋轉(zhuǎn)變換后的形態(tài),可以看出,經(jīng)過插值過濾可以使得頭發(fā)的運(yùn)動更加柔順平滑。
2.2、修復(fù)關(guān)節(jié)的絞繞問題
經(jīng)過關(guān)節(jié)的旋轉(zhuǎn)變換后,模型在關(guān)節(jié)的驅(qū)動下,逼真地模擬了各種力的作用下的物理運(yùn)動。但是,由于每一幀關(guān)節(jié)的位置都是基于前一幀狀態(tài)進(jìn)行疊加運(yùn)算得來,并且最終以旋轉(zhuǎn)變換的形式表示,即四元數(shù)。而每一個旋轉(zhuǎn)變換都可能要對關(guān)節(jié)所在軸向作自轉(zhuǎn)變換,經(jīng)過一幀又一幀的累加,最終關(guān)節(jié)的可能形成較大的自轉(zhuǎn)變換,甚至觸發(fā)萬向鎖現(xiàn)象,如圖11中左邊三幅圖所示,頭發(fā)a處的關(guān)節(jié)雖然朝向正確,但經(jīng)過一系列動畫幀的播放后,累積的誤差造成了自轉(zhuǎn)軸分量出現(xiàn)明顯的偏差,由于頭發(fā)a處的關(guān)節(jié)發(fā)生了自轉(zhuǎn),造成a處的頭發(fā)隨之發(fā)生轉(zhuǎn)動,對視覺體驗(yàn)造成嚴(yán)重的影響。
為了解決這個問題,可以為每個關(guān)節(jié)定義一個旋轉(zhuǎn)約束軸,關(guān)節(jié)所在的軸向可以作為旋轉(zhuǎn)約束軸的方向。此處關(guān)節(jié)所在的軸向,可以認(rèn)為是關(guān)節(jié)與其父關(guān)節(jié)構(gòu)成的軸向方向,例如,假設(shè)父關(guān)節(jié)的位置為p,子關(guān)節(jié)的位置為a,則pa可以認(rèn)為是關(guān)節(jié)所在的軸向。
對于獲取的四元數(shù)所對應(yīng)的旋轉(zhuǎn)變換,可以對旋轉(zhuǎn)變換在旋轉(zhuǎn)約束軸的方向上的分量進(jìn)行過濾,以此去除自轉(zhuǎn)變換部分。例如,可以將獲取的四元數(shù)轉(zhuǎn)換為歐拉角,然后對歐拉角在關(guān)節(jié)的軸向(即旋轉(zhuǎn)約束軸的方向)上的分量進(jìn)行過濾。例如,假設(shè)關(guān)節(jié)的軸向?yàn)閤軸,可以在關(guān)節(jié)的局部坐標(biāo)系下對它的旋轉(zhuǎn)變換對應(yīng)的歐拉角的x分量進(jìn)行過濾,即執(zhí)行:bone.localeuler.x=0。圖11中最右邊的附圖示出了經(jīng)過過濾后的頭發(fā)的示意圖,如圖所示,經(jīng)過對關(guān)節(jié)的軸向的分量進(jìn)行過濾,可以有效修復(fù)關(guān)節(jié)絞繞問題。
至此,詳細(xì)說明了本發(fā)明的動畫中動態(tài)骨骼的實(shí)現(xiàn)方法的具體實(shí)現(xiàn)過程。圖12、圖13是示出了利用本發(fā)明進(jìn)行處理后的效果圖。
參見圖12,在本測試案例中,圓點(diǎn)為骨骼關(guān)節(jié),白色線段為骨骼長度,使用網(wǎng)格視圖,圖中一個女孩一邊拿著皮鞭一邊跑動著,跑動過程中,骨骼關(guān)節(jié)也會隨著右手的動作計(jì)算關(guān)節(jié)擺動的幅度并更新皮鞭模型各頂點(diǎn)的位置。
參見圖13,在本測試案例中,顯示的是在模擬風(fēng)力影響下頭發(fā)的擺動效果,圖中圓點(diǎn)為骨骼關(guān)節(jié),白色線段為骨骼長度,從網(wǎng)格視圖可以看到,由于風(fēng)使用噪聲來模擬,具有隨機(jī)性,所以頭發(fā)的飄動也是隨機(jī)的。
圖14是示出了根據(jù)本發(fā)明一實(shí)施例的動畫中動態(tài)骨骼的實(shí)現(xiàn)裝置的功能框圖。其中,實(shí)現(xiàn)裝置300的功能模塊可以由實(shí)現(xiàn)本發(fā)明原理的硬件、軟件或硬件和軟件的結(jié)合來實(shí)現(xiàn)。本領(lǐng)域技術(shù)人員可以理解的是,圖13所描述的功能模塊可以組合起來或者劃分成子模塊,從而實(shí)現(xiàn)上述發(fā)明的原理。因此,本文的描述可以支持對本文描述的功能模塊的任何可能的組合、或者劃分、或者更進(jìn)一步的限定。
圖14所示的實(shí)現(xiàn)裝置300可以用來執(zhí)行圖1所示的實(shí)現(xiàn)方法,下面僅就實(shí)現(xiàn)裝置300可以具有的功能模塊以及各功能模塊可以執(zhí)行的操作做簡要說明,對于其中涉及的細(xì)節(jié)部分可以參見上文結(jié)合圖1的描述,這里不再贅述。
參見圖14,實(shí)現(xiàn)裝置300包括骨骼關(guān)節(jié)樹創(chuàng)建模塊310、計(jì)算模塊320以及旋轉(zhuǎn)變換模塊330。
骨骼關(guān)節(jié)樹創(chuàng)建模塊310用于創(chuàng)建針對目標(biāo)對象的骨骼關(guān)節(jié)樹,其中,骨骼關(guān)節(jié)樹中直接相連的兩個關(guān)節(jié)中更接近根節(jié)點(diǎn)的關(guān)節(jié)為父關(guān)節(jié),更遠(yuǎn)離根關(guān)節(jié)的關(guān)節(jié)為子關(guān)節(jié);
計(jì)算模塊320用于計(jì)算骨骼關(guān)節(jié)樹中的關(guān)節(jié)在下一幀的位置信息;
旋轉(zhuǎn)變換模塊330用于針對骨骼關(guān)節(jié)樹中的至少一個子關(guān)節(jié),將該子關(guān)節(jié)在下一幀的位置信息與當(dāng)前幀的位置信息之間的位置變換轉(zhuǎn)換為繞該子關(guān)節(jié)的父關(guān)節(jié)的旋轉(zhuǎn)變換,從而通過旋轉(zhuǎn)變換,將子關(guān)節(jié)移動到其下一幀的位置。
計(jì)算模塊320可以計(jì)算預(yù)定作用力下所述骨骼關(guān)節(jié)樹中的關(guān)節(jié)在下一幀的位置信息,預(yù)定作用力包括下列至少一項(xiàng):重力;關(guān)節(jié)移動過程中受到的與移動方向相反的阻力;以及來自周圍環(huán)境的干擾力。
具體地,計(jì)算模塊320可以使用如下位置計(jì)算公式計(jì)算關(guān)節(jié)在下一幀的位置信息posn+1,posn+1=posn+(posn-posn-1)*(1-r)+(gv+d)*δt2
其中,posn+1為關(guān)節(jié)在下一幀的位置信息,posn為關(guān)節(jié)在當(dāng)前幀的位置信息,posn-1為關(guān)節(jié)在上一幀的位置信息,r為阻力作用下的阻力系數(shù),0≤r≤1,gv為重力在關(guān)節(jié)的長度方向上的法向方向上的重力分力作用下的加速度,d為干擾力作用下的加速度,δt為上一幀與當(dāng)前幀之間的時間間隔。
如圖14所示,作為本發(fā)明的一個優(yōu)選實(shí)施例,實(shí)現(xiàn)裝置300還可以包括第一修正模塊340。第一修正模塊340用于使用如下第一修正公式對計(jì)算得到的關(guān)節(jié)在下一幀的位置信息posn+1進(jìn)行修正,
其中,pos'n+1為關(guān)節(jié)經(jīng)過補(bǔ)償后在下一幀的位置信息,posp為關(guān)節(jié)的父關(guān)節(jié)的位置信息,len為關(guān)節(jié)到其父關(guān)節(jié)之間的關(guān)節(jié)臂的長度。
如圖14所示,作為本發(fā)明的一個優(yōu)選實(shí)施例,旋轉(zhuǎn)變換模塊330可以包括:當(dāng)前方向向量確定模塊331、移動向量確定模塊332以及四元數(shù)獲取模塊333。
當(dāng)前方向向量確定模塊331用于根據(jù)子關(guān)節(jié)在當(dāng)前幀的的位置信息,確定從父關(guān)節(jié)到子關(guān)節(jié)的當(dāng)前方向向量。
移動向量確定模塊332用于根據(jù)子關(guān)節(jié)在下一幀的的位置信息以及當(dāng)前幀的位置信息,確定子關(guān)節(jié)在其父關(guān)節(jié)坐標(biāo)系下的移動向量。
四元數(shù)獲取模塊333用于根據(jù)方向向量和移動向量,獲取繞父關(guān)節(jié)進(jìn)行旋轉(zhuǎn)變換的四元數(shù)。
如圖14所示,旋轉(zhuǎn)變換模塊330還可以包括插值運(yùn)算模塊334和旋轉(zhuǎn)模塊335。
插值運(yùn)算模塊334用于使用四元數(shù)插值算法對四元數(shù)進(jìn)行插值運(yùn)算,以得到緩沖四元數(shù),旋轉(zhuǎn)模塊335用于基于緩沖四元數(shù)對父關(guān)節(jié)和子關(guān)節(jié)進(jìn)行旋轉(zhuǎn)變換。
作為本發(fā)明的一個優(yōu)選實(shí)施例,旋轉(zhuǎn)變換模塊330還用于消除旋轉(zhuǎn)變換在子關(guān)節(jié)與其父關(guān)節(jié)構(gòu)成的軸向方向上的分量,通過消除后的旋轉(zhuǎn)變換,將子關(guān)節(jié)移動到其下一幀的位置。
如圖14所示,作為本發(fā)明的一個優(yōu)選實(shí)施例,實(shí)現(xiàn)裝置300還可以包括第二修正模塊350。第二修正模塊350用于在檢測到計(jì)算得到的關(guān)節(jié)在下一幀的位置信息與目標(biāo)碰撞體發(fā)生碰撞的情況下,對關(guān)節(jié)的位置信息進(jìn)行修正,以使得修正后關(guān)節(jié)在下一幀的位置信息基本滿足以下條件:修正后關(guān)節(jié)位于目標(biāo)碰撞體的邊緣;修正后關(guān)節(jié)到其父關(guān)節(jié)之間的關(guān)節(jié)臂的長度不變。
具體地,第二修正模塊350可以使用如下第二修正公式對關(guān)節(jié)的位置進(jìn)行修正:
其中,pos”n+1為關(guān)節(jié)進(jìn)行修正后在下一幀的位置信息,c1為關(guān)節(jié)修正前在下一幀的位置信息,c2為碰撞體的位置信息,r1為關(guān)節(jié)的半徑,r2為碰撞體的半徑,posp為關(guān)節(jié)的父關(guān)節(jié)的位置信息,len為關(guān)節(jié)到其父關(guān)節(jié)之間的關(guān)節(jié)臂的長度。
上文中已經(jīng)參考附圖詳細(xì)描述了根據(jù)本發(fā)明的動畫中動態(tài)骨骼的實(shí)現(xiàn)方法和實(shí)現(xiàn)裝置。
此外,根據(jù)本發(fā)明的方法還可以實(shí)現(xiàn)為一種計(jì)算機(jī)程序,該計(jì)算機(jī)程序包括用于執(zhí)行本發(fā)明的上述方法中限定的上述各步驟的計(jì)算機(jī)程序代碼指令?;蛘?,根據(jù)本發(fā)明的方法還可以實(shí)現(xiàn)為一種計(jì)算機(jī)程序產(chǎn)品,該計(jì)算機(jī)程序產(chǎn)品包括計(jì)算機(jī)可讀介質(zhì),在該計(jì)算機(jī)可讀介質(zhì)上存儲有用于執(zhí)行本發(fā)明的上述方法中限定的上述功能的計(jì)算機(jī)程序。本領(lǐng)域技術(shù)人員還將明白的是,結(jié)合這里的公開所描述的各種示例性邏輯塊、模塊、電路和算法步驟可以被實(shí)現(xiàn)為電子硬件、計(jì)算機(jī)軟件或兩者的組合。
附圖中的流程圖和框圖顯示了根據(jù)本發(fā)明的多個實(shí)施例的系統(tǒng)和方法的可能實(shí)現(xiàn)的體系架構(gòu)、功能和操作。在這點(diǎn)上,流程圖或框圖中的每個方框可以代表一個模塊、程序段或代碼的一部分,所述模塊、程序段或代碼的一部分包含一個或多個用于實(shí)現(xiàn)規(guī)定的邏輯功能的可執(zhí)行指令。也應(yīng)當(dāng)注意,在有些作為替換的實(shí)現(xiàn)中,方框中所標(biāo)記的功能也可以以不同于附圖中所標(biāo)記的順序發(fā)生。例如,兩個連續(xù)的方框?qū)嶋H上可以基本并行地執(zhí)行,它們有時也可以按相反的順序執(zhí)行,這依所涉及的功能而定。也要注意的是,框圖和/或流程圖中的每個方框、以及框圖和/或流程圖中的方框的組合,可以用執(zhí)行規(guī)定的功能或操作的專用的基于硬件的系統(tǒng)來實(shí)現(xiàn),或者可以用專用硬件與計(jì)算機(jī)指令的組合來實(shí)現(xiàn)。
以上已經(jīng)描述了本發(fā)明的各實(shí)施例,上述說明是示例性的,并非窮盡性的,并且也不限于所披露的各實(shí)施例。在不偏離所說明的各實(shí)施例的范圍和精神的情況下,對于本技術(shù)領(lǐng)域的普通技術(shù)人員來說許多修改和變更都是顯而易見的。本文中所用術(shù)語的選擇,旨在最好地解釋各實(shí)施例的原理、實(shí)際應(yīng)用或?qū)κ袌鲋械募夹g(shù)的改進(jìn),或者使本技術(shù)領(lǐng)域的其它普通技術(shù)人員能理解本文披露的各實(shí)施例。