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