動畫位移拉伸方法、裝置及運(yùn)動控制方法、裝置的制造方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明涉及游戲?qū)ο罂刂祁I(lǐng)域,尤其涉及一種動畫位移拉伸方法、裝置以及游戲 對象的運(yùn)動控制方法、裝置。
【背景技術(shù)】
[0002] 游戲中常見的控制對象的運(yùn)動表現(xiàn)的方式往往有如下兩種:
[0003] -種控制對象運(yùn)動表現(xiàn)的方式是:美術(shù)制作一個原地的骨骼動畫,然后程序邏輯 里控制對象移動,比如人物的行走表現(xiàn),可以美術(shù)制作一個原地走路的骨骼動畫,然后程序 代碼邏輯里讓人物按一定速度移動,達(dá)到人物在走路的表現(xiàn)效果。這種方式適合于對象運(yùn) 動速度較固定的情況,比如走路、跑步,但如果是運(yùn)動速度、軌跡較復(fù)雜的情況,就不便于用 程序邏輯去實(shí)現(xiàn)。
[0004] 另外一種控制對象運(yùn)動表現(xiàn)的方式是使用動畫位移。在這種方式下,美術(shù)制作的 不是一個原地動畫而是一個帶有位移的骨骼動畫,然后在游戲中播放這個動畫時,就會根 據(jù)這個動畫的位移軌跡來移動對象,這種方式的優(yōu)點(diǎn)是對象在游戲中的表現(xiàn)能夠與美術(shù)設(shè) 計(jì)的一致,可以有速度、軌跡上的復(fù)雜變化,增強(qiáng)游戲?qū)ο蟮谋憩F(xiàn)力。因此這種方式經(jīng)常用 于游戲?qū)ο蟮募寄軇幼魃?,比如游戲中人物往前跳劈的技能(中間有一定的速度節(jié)奏變 化),用這種方式來表現(xiàn)人物的移動,就會比較自然。但在實(shí)際使用動畫位移中,經(jīng)常會遇到 的一個問題是,美術(shù)制作了一段動畫位移軌跡可以運(yùn)動到和當(dāng)前位置相對的某個目標(biāo)點(diǎn), 但策劃希望該對象最后移動到另一個目標(biāo)點(diǎn)。仍以人物的跳劈技能為例,美術(shù)可能制作的 位移軌跡是向前跳到3米處,但實(shí)際中人物的攻擊目標(biāo)是在前面5米處,這樣如果仍然按照 原來的位移軌跡來移動人物,就無法攻擊到目標(biāo)。這種情況下,就需要根據(jù)實(shí)際的目標(biāo)點(diǎn), 對動畫的位移軌跡進(jìn)行拉伸,從3米拉伸到5米,這就是所謂的動畫位移拉伸技術(shù)。這里的 "拉伸"不局限于拉長,也有可能是縮短,比如實(shí)際目標(biāo)點(diǎn)離對象比較近的情況。
[0005] 目前市面上的游戲引擎的動畫拉伸方法的基本思路是,計(jì)算實(shí)際的目標(biāo)點(diǎn)和美術(shù) 制作的位移軌跡的目標(biāo)點(diǎn)之間的位移差,然后將這個位移差除以動畫的運(yùn)行時間,得到一 個速度,然后在動畫播放過程中,將這個速度疊加到對象身上,作為一個補(bǔ)償速度,這樣在 動畫播放完畢后,相應(yīng)對象就會有一個位移補(bǔ)償,等于那個位移差,這樣就可以保證最后對 象能夠位移到指定的目標(biāo)點(diǎn)。
【發(fā)明內(nèi)容】
[0006] 經(jīng)工程測試研究發(fā)現(xiàn),現(xiàn)有技術(shù)的游戲引擎的動畫拉伸方法雖然方案實(shí)現(xiàn)簡單, 但其本質(zhì)上是按照時間無差別的均勻拉伸,拉伸效果僵,無法滿足特殊環(huán)境下具體應(yīng)用。具 體地:在游戲中,我們希望拉伸的過程是能夠和原來動畫本身的節(jié)奏相符合,比如仍以跳劈 技能為例,如果跳劈技能在中間有一段時間人物是滯空不動的,那么我們也希望在這段時 間不做拉伸,如果跳劈結(jié)束的時候人物運(yùn)動比較快,我們也希望這段時間拉伸的速度能夠 比較快。如果在滯空過程中因?yàn)槔於a(chǎn)生了的運(yùn)動,顯然這在表現(xiàn)上就是不太符合預(yù)期 的。
[0007] 以前面提到的跳劈技能為例,如果跳劈中間有一段滯空不動的時候,則按照現(xiàn)有 技術(shù)的這種動畫位移均勻拉伸方法,在這段時間仍然會有一個移動速度疊加上去,這樣就 會不太符合玩家對這個技能表現(xiàn)的預(yù)期。因此,在游戲中使用動畫位移來移動對象,當(dāng)需要 移動到的目標(biāo)點(diǎn)和原來動畫的目標(biāo)點(diǎn)間有差異,需要進(jìn)行動畫位移拉伸操作時,采用現(xiàn)有 的動畫位移均勻拉伸的方法不能夠使動畫位移的拉伸過程的運(yùn)動快慢表現(xiàn)符合原來動畫 的運(yùn)動快慢表現(xiàn),不符合玩家對該動畫位移拉伸表現(xiàn)的預(yù)期。
[0008] 為實(shí)現(xiàn)更優(yōu)質(zhì)的動畫拉伸效果,我們提出了一種理想的動畫位移拉伸,理想的動 畫位移拉伸是具有一定的語義性,在原來動畫軌跡中的運(yùn)動快時拉伸相應(yīng)快,運(yùn)動慢時拉 伸也相應(yīng)慢。
[0009] 為實(shí)現(xiàn)上述理想的動畫位移拉伸,本發(fā)明提供一種動畫位移拉伸方法及裝置,能 夠使得動畫位移拉伸的速度快慢表現(xiàn)與原來美術(shù)制作的動畫位移快慢表現(xiàn)一致,讓對象的 運(yùn)動表現(xiàn)更加符合玩家的預(yù)期。
[0010] 本發(fā)明實(shí)施例提供了一種動畫位移拉伸方法,包括:
[0011] 計(jì)算當(dāng)前動畫需要移動到的目標(biāo)點(diǎn)與原動畫位移軌跡的目標(biāo)點(diǎn)的位移差;
[0012] 計(jì)算原動畫位移軌跡中的每一幀的位移補(bǔ)償,使每一幀的位移補(bǔ)償?shù)拇笮≌扔?該幀在原動畫位移軌跡中的位移長度,并使原動畫位移軌跡中的所有幀的位移補(bǔ)償相加等 于所述位移差;
[0013] 將計(jì)算得到的每一幀的位移補(bǔ)償疊加到原動畫位移軌跡中對應(yīng)幀的位移上,從而 得到當(dāng)前動畫位移軌跡。
[0014] 作為上述方案的改進(jìn),通過以下公式(1)~(2)計(jì)算原動畫位移軌跡中的每一幀 的位移補(bǔ)償:
[0015] M(i) = 0, i = I (1)
[0016] M(i) = (D-P(N))*|P(i)-P(i-l) |/S,i 彡 2 (2)
[0017] 其中,M⑴為原動畫位移軌跡中的第i幀的位移補(bǔ)償,P⑴為原動畫位移軌跡中 的每一幀的位置,P(N)為原動畫位移軌跡的目標(biāo)點(diǎn),D為當(dāng)前動畫需要移動到的目標(biāo)點(diǎn),S 為原動畫位移軌跡的總位移長度。
[0018] 作為上述方案的改進(jìn),通過以下公式(3)~(6)計(jì)算得到當(dāng)前動畫位移軌跡:
[0019] V(i) = 0, i = 1 (3)
[0020] V ⑴=P ⑴-P (i-1) +M ⑴,i 彡 2 (4)
[0021] Q(i) = P(i),i = I (5)
[0022] Q(i) = Q(i-1)+V(i), i ^ 2 (6)
[0023] 其中,V⑴為當(dāng)前動畫位移軌跡中的第i幀的位移,Q⑴為當(dāng)前動畫位移軌跡中 的第i幀的位置。
[0024] 作為上述方案的改進(jìn),所述原動畫位移軌跡中的每一幀的位置是二維平面的坐標(biāo) 點(diǎn)或三維空間的坐標(biāo)點(diǎn)。
[0025] 作為上述方案的改進(jìn),所述原動畫位移軌跡中的每一幀的位移長度為該幀與前一 幀之間的直線距離;所述位移差為原動畫位移軌跡的目標(biāo)點(diǎn)指向當(dāng)前動畫需要移動到的目 標(biāo)點(diǎn)的位移。
[0026] 本發(fā)明實(shí)施例對應(yīng)提供了一種動畫位移拉伸裝置,包括:
[0027] 位移差計(jì)算模塊,用于計(jì)算當(dāng)前動畫需要移動到的目標(biāo)點(diǎn)與原動畫位移軌跡的目 標(biāo)點(diǎn)的位移差;
[0028] 位移補(bǔ)償計(jì)算模塊,用于計(jì)算原動畫位移軌跡中的每一幀的位移補(bǔ)償,使每一幀 的位移補(bǔ)償?shù)拇笮≌扔谠搸谠瓌赢嬑灰栖壽E中的位移長度,并使原動畫位移軌跡中的 所有幀的位移補(bǔ)償相加等于所述位移差;
[0029] 處理模塊,用于將計(jì)算得到的每一幀的位移補(bǔ)償疊加到原動畫位移軌跡中對應(yīng)幀 的位移上,從而得到當(dāng)前動畫位移軌跡。
[0030] 作為上述方案的改進(jìn),所述位移補(bǔ)償計(jì)算模塊通過以下公式(1)~(2)計(jì)算原動 畫位移軌跡中的每一幀的位移補(bǔ)償:
[0031] M(i) = 0, i = I (1)
[0032] M(i) = (D-P(N))*|P(i)-P(i-l) |/S,i 彡 2 (2)
[0033] 其中,M⑴為原動畫位移軌跡中的第i幀的位移補(bǔ)償,P⑴為原動畫位移軌跡中 的每一幀的位置,P(N)為原動畫位移軌跡的目標(biāo)點(diǎn),D為當(dāng)前動畫需要移動到的目標(biāo)點(diǎn),S 為原動畫位移軌跡的總位移長度。
[0034] 作為上述方案的改進(jìn),所述處理模塊通過以下公式(3)~(6)計(jì)算得到當(dāng)前動畫 位移軌跡:
[0035] V(i) = 0, i = 1 (3)
[0036] V ⑴=P ⑴-P (i-1) +M ⑴,i 彡 2 (4)
[0037] Q(i) = P(i),i = I (5)
[0038] Q(i) = Q(i-1)+V(i