動畫重定向技術分析和Unity中的應用

2021-09-13 12:15:17 字數 2825 閱讀 4417

動畫重定向,即animation retargeting,是一種動畫復用的技術,直觀上,你可以把它的作用想象成周星馳電影《西遊-降魔篇》裡的「聽話符」——「我做什麼,你就跟我做什麼」。

這裡給出乙個非官方的定義:

retargeting is just the process of 「copying」 the animation from one skeleton to the other.

簡單來說,重定向技術就是一種在將動畫資料從乙個骨架拷貝到另外乙個骨架的過程,只是這個所謂的「拷貝」過程,沒有ctrl+c、ctrl+v這麼簡單,其實現的方式,也會影響到動畫應用到另外乙個骨架之後的效果。

動畫重定向技術在很多地方已經得到很廣泛的應用,比如目前3a級主機遊戲常用的動作捕捉技術就是基於這個原理來實現的——將真實人物 的動作通過影象識別等技術生成動畫資訊應用到虛擬的角色身上,儲存成動畫資料。還有max和maya這樣的建模工具中,也都已經整合了這一技術,用來方便美術把乙個動作檔案復用到其他骨架上。

那什麼樣的遊戲開發需要這樣的技術呢?我們可以假想如果要開發類似《街霸》這樣的3d格鬥遊戲,其中有幾十個不同體型姿態各異的角色,戰鬥過程中會有很多抓技和投技的動作表現,對於這一型別的技能,不同角色的受擊動作應該是一致的。

如果使用最常規的製作方法,需要對每乙個角色製作攻擊動作對應的受擊動畫,或者需要限制策劃設計的受擊表現在使用固定姿勢、掛接、特效等方式可以實現的範圍內。而不甘平庸的策劃同學往往需要更加複雜的受擊表現,常規的製作方法帶來的問題有如下三個方面:

a) 美術工作量較大。如果有n個不同角色的骨架,有m個需要特殊表現的技能,那麼只考慮受擊動畫就需要m*n個,這個數量級通常會在幾千個動作的級別。美術需要製作、匯出這些動畫檔案,需要非常大的工作量。

b) 動畫維護困難。想象下,策劃設計了乙個需要特殊動作表現的技能,美術加班加點製作出了所有英雄的受擊動畫,第二天黑著眼圈來上班,策劃同學滿臉訕笑地走過來說——「哎呀,你看,這個受擊動作的第15幀有點不自然,力量感不夠強,要你不優化一下?」……每一處修改都需要美術手動同步到其他動作檔案上,重新調整匯出,這一過程太過費時費力。

c) 遊戲發布打包檔案過大。動畫檔案多必然帶來這一問題,尤其是在手遊中,包體大小通常是安卓渠道發行的乙個需要考慮的重要指標。

而動畫重定向技術就是一種時間換空間的思路,在執行時將一套動畫根據預計算好的骨骼差異資訊,得到目標模型骨架上可以適用的動畫資料,就可以生成目標角色的受擊動畫效果。這種方式既可以減少美術的工作量,又可以增加遊戲對策劃需求和修改的靈活度,將需要維護和打包的動畫數量從m*n這樣的平方級別降低到m個。當然,軟體工程中「沒有銀彈」的定律在這裡依舊生效,重定向之後的動畫可能由於體型差異等問題在某些情況下無法完全滿足策劃或者美術的要求,這就需要一些額外的方法或者重新製作部分動畫來進行彌補,這部分放在後面進行詳述。

寫到這裡,其實之前有一點沒有說明的是動畫重定向技術主要是針對骨骼動畫的方案,由骨骼來描述動作資訊,用蒙皮來表示模型網格與骨骼之間的關係從而得到模型最終的樣子。對於這塊不熟悉的讀者可以自己查閱一下相關的資料。

動畫重定向的過程主要是針對骨骼資訊,對於蒙皮過程沒有任何影響。而動畫資訊,可以理解為每一幀中所有骨骼資料資訊的集合,更加形象地理解,動畫就是每一幀為模型製作乙個pose(姿勢),在每幀之間的姿勢可以通過差值獲得。

為了更加清楚地描述動畫重定向地原理,我們擷取某一幀的姿勢來進行分析——在解決了每一幀的姿勢重定向之後,整個動畫的重定向也就是在每一幀都進行姿勢的重定向即可。

假設有兩個模型,他們的骨架分別是a和b,我們擁有a骨架對應的動畫資料,想把這個動畫資料應用在b骨架上。直接應用是否可以?當a骨架和b骨架完全一樣的時候,直接應用是可以的,但通常動畫重定向要處理的是骨架不太一樣的情況。這些不一樣的情況有很多種,比如:

a) 骨骼數量不一致;

b) 骨骼父子關係不一致;

c) 骨骼名稱不一致;

d) 骨骼本身的長度等資料不一致。

對於前幾種不一致情況的處理,我們在基本原理的部分先不進行分析,對於骨骼數量一致、骨骼父子關係也相同這樣最為簡單的情況下,我們來看一下動畫重定向的基本方式。

先明確在這種情況下,直接應用a的動畫資料到b上會存在的問題。想象一下,a是乙個身高為1.8m左右的大人骨架,而b是乙個身高為1.5m左右小孩骨架,a的動畫資訊記錄的骨骼位置(position)、旋轉(rotation)和縮放(scale)資訊都是針對於大人的,比如經過最終的計算,在idle動畫中的某一幀姿勢中,模型空間下a的head這根骨骼可能在距離地面1.7m這樣的位置,而同樣的動作讓乙個小孩b來做,也把head骨骼放置在1.7m的位置,蒙皮之後的結果會非常奇怪,出現拉伸等問題,因為b的身高整個才是1.5m。

為了解決這個問題,或者說乙個正確的動畫重定向過程,是基於所謂的參考姿勢(reference pose)的。通常情況下,會把t-pose作為參考姿勢。引入參考姿勢之後,動畫資料不再直接應用到目標骨架上,而是把動畫姿勢與參考姿勢的差異應用到目標骨架上。a1是a骨架的參考姿勢,b1是b骨架的參考姿勢,動畫中某一幀的姿勢是a2,我們想得到的結果是b2,我們認為,a2與參考姿勢a1的差異應當和b2與其對應的參考姿勢b1的差異相同,即:

a2 - a1 = b2 - b1

我們可以得到計算過程為:

b2 = a2 - a1 + b1 = a2 + (b1 - a1)

這其中,a1和b1的資料是在遊戲發布時就確定的,因此可以進行預先計算好b1-a1的值。要知道這裡的加法和減法要轉換為每根骨骼的prs計算,因此還是有不少cpu消耗的。下圖給出了使用乙個簡單整數代替骨骼的prs資料來模擬動畫重定向的計算過程。

近期更有資深開發人士直播分享unity開發經驗,詳情請進入官網或加入qq群了解

JSP SERVLET重定向技術綜述

1.requestdispatcher.forward 是在伺服器端起作用,當使用forward 時,servlet engine傳遞http請求從當前的servlet or jsp到另外乙個servlet,jsp 或普通html檔案,也即你的form提交至a.jsp,在a.jsp用到了forwar...

jmeter自動重定向和跟隨重定向區別

自動重定向 httpclient接收到請求後,如果請求中包含重定向請求,httpclient是可以自動跳轉的,但是只針對get和head請求,勾選此項則 跟隨重定向 失效 自動重定向可以自動轉向到最終目標頁面,但是jmeter是不記錄重定向過程內容的,比如在檢視結果樹中是無法找到重定向過程內容的 a...

重定向和管道

重定向和管道 第 3 章 命令列簡介 程序 包括圖形應用程式,但不包括絕大多數守護程式 至少使用三個檔案描述符 標準輸入 標準輸出和標準錯誤輸出 它們相應的序號是 0 1 和 2。一般來說,這三個描述符與該程序啟動的終端相關聯,其中輸入為鍵盤。重定向和管道的目的是重定向這些描述符。本節中的例項將幫助...