建立下個時代的高畫質遊戲美術資源生產管線(五):繫結篇-繫結基本概念
首發知乎:https://zhuanlan.zhihu.com/p/616173667
繫結是CG動畫製作流程中非常重要的一個環節,作為聯絡模型和動畫的紐帶,繫結保證了模型運動起來的效果也符合專案規範和審美標準,由繫結師製作和開發的各種工具可以很方便的讓動畫師快速實現自己想要的效果,在工作流中起到了承上啟下的關鍵作用。
我們可以透過幾個影片瞭解繫結的概念
恐怖動畫短片《遺物》MAYA角色繫結展示
https://www.bilibili.com/video/BV1D44y157mb/
筆尖繫結
https://www.bilibili.com/video/BV15T4y117rX/
線性蒙皮與混合修型差異對照
https://www.bilibili.com/video/BV1Hq4y1f7Kx
在以往的遊戲開發環節中,繫結往往是被忽視的一環。主要是受硬體條件限制的實時渲染環境無法支援繫結需要的各種複雜計算。隨著算力的提高和演算法的進步(移動平臺除外),使用者對產品品質要求也日益水漲船高,繫結流程也開始進入了遊戲開發環節中。
繫結環節主要有三步,1:骨骼搭建,2:蒙皮,3:控制器搭建和驅動關係設計。這三個環節相互關聯相互影響,在設計一套繫結方案的時候必須全面考慮才能得到最好的效果。同時,作為繫結環節的上游,模型的製作也會影響繫結設計和效果呈現。優秀的繫結師也必須對建模流程有所瞭解,或者模型對繫結環節有所瞭解,這樣才能做到領域互補。很多模型規範是和繫結一起溝通指定的,比如佈線位置,模型拓撲結構,掛件分配,UV分配等。
控制器搭建驅動關係設計則影響下游動畫環節的表現。優秀的關節聯動效果和驅動效果可以大大節省動畫師的工作量,起到事半功倍的效果。而有些效果的則是靠動畫師手工製作非常繁瑣或者很難做到效果特別好的,比如汽車行駛時輪胎懸掛和地面的接觸晃動,坦克履帶運動,生物運動時的肌肉晃動,雨傘的開合,角色運動時盔甲的晃動等等。那麼一個好的控制器設計可以把這些複雜的工作量一鍵化解。
綜上所述,繫結師是一個橫跨多個崗位的複合職位。他需要對資源製作中的模型材質流程有一定了解,這樣才能有效溝通上游,也要有動畫製作,基礎程式碼能力,常見的動力學解算,約束關係,計算機對物體旋轉和位移的計算,空間座標換算等計算機圖形學知識儲備。這樣才能高效率的驅動下游製作環節。可以說,繫結職位決定了動畫和遊戲美術生產管線中一半流程,其崗位含金量一點不比現階段熱門的TA或者圖形程式低。在動畫行業中,高階繫結師是離TD(Technical Director技術指導)最接近的行業。
因為繫結涉及的效果和技術面都非常廣,一篇文章是寫不完的,所以這裡主要談談遊戲或實時渲染中角色表現涉及的繫結工作流,這也是目前應用範圍最廣泛的部分。
遊戲角色繫結涉及的範圍主要有4大塊,修型和肌肉運動效果,表情效果,服裝運動效果,捏臉(身體)。我在幾年前翻譯的文章籠統的講過戰神4的製作流程,這裡詳細的介紹下相關操作步驟。
首先是角色修型,修型是動畫和影視繫結流程中的一個基礎模組,近幾年也逐漸開始出現在遊戲流程中。在介紹修型之前。我們要先了解下蒙皮的基礎概念。
遊戲和實時渲染中常見使用的方式是線性蒙皮。一個模型或者說一個網格體,是由N個頂點組成的。要想讓模型動起來,最直接的方式就是修改頂點位置,因此我們需要記錄每個頂點運動後的位置資訊。假如一個模型有20000個頂點,那麼需要記錄的每幀位置資訊就是20000*XYZ三個軸向的位移旋轉和縮放資訊,既180000個資料,如果動畫幀數是每秒30幀,那一秒的動畫資料就是5400000個資料。這個資料量隨模型的精細程度和幀數增加成指數級放大,相當於每幀就是一個模型,ABC格式就是這個概念,這種資料格式一般用於影視行業。這麼大的資料量用在實時渲染裡肯定是不行的,一段幾十秒的動畫可能就幾個G,沒有哪個普通使用者的裝置能跑得動。而且同時操作這麼多頂點也超過了人類的控制能力,那麼為了簡化計算量,我們會把頂點打組,用一個點去驅動N個頂點,這個點我們通常就叫骨骼(bone)。透過骨骼,我們可以把模型內一組大量的頂點運動資料簡化為幾個點的運動資訊,這樣需要儲存的資料能成指數級減少。
既然有了骨骼,那麼我們自然需要設計骨骼驅動頂點的方式。假如我們讓骨骼影響範圍內所有頂點都跟隨骨骼同步運動,那最終的結果就是這個物體看起來就是一個硬邦邦的剛體。所以我們需要控制頂點跟隨骨骼運動的範圍。最簡單的方式就是給頂點一個運動範圍衰減,100%為完全跟隨骨骼運動,0%為完全不跟隨骨骼運動,對映到0-1範圍,這個概念就叫權重。所以最終單個頂點的位置資訊是由驅動骨骼的運動範圍和頂點相對驅動骨骼的權重資訊混合計算而來。這個計算方式就叫線性混合蒙皮(linear blending skinning)。公式我就不貼了,這種祖傳演算法隨便一查就有。
線性混合蒙皮演算法計算速度很快,但是它也有很大缺陷,就是不能維持模型體積。線性蒙皮本質是加減法,最終計算的結果一定是頂點會朝權重影響方向移動,那麼在權重交界的地方,頂點位置會受多個骨骼位置影響。簡單來說,在權重交界的地方,骨骼旋轉的計算結果會導致頂點位置出現坍縮。
在演算法上,這種問題可以透過雙四元數蒙皮來解決,虛幻5新的animation deformer 系統也提供了雙四元數蒙皮方案。相關案例可以在內容例項專案的animation graph關卡找到。但是一般在專案中,為了實時渲染效能最佳化考慮,我們還是會採用線性蒙皮的方式製作角色,透過繫結修型來解決線性蒙皮的形變問題,也就是俗話說的“工匠克演算法”。
除了權重範圍,蒙皮結果還會受權重數量影響。既一個頂點最多能被多少骨骼驅動。在移動平臺通常是4個骨骼,在pc平臺上限可以擴充到24。數量為4的倍數。更改此選項需要修改專案設定裡skin相關設定。
回到剛才的話題,理解線性蒙皮方式的缺陷,就能理解為什麼我們需要透過繫結來製作修型。最終目標是為了讓模型運動起來的外形看起來順眼和符合運動造型規律,不產生不符合審美的畸變和扭曲。
以手臂為例,線性蒙皮的角色手掌骨骼做翻轉運動時會引起腕部形狀畸變,而正常人類運動時,因為骨骼結構的影響,手腕翻轉會帶動腕部至肘部肌肉和皮膚組織一起運動,從而維持手臂體積(大家可以自行觀察自己手臂感受一下)。我們可以透過架設骨骼的方式模擬這一運動效果。從手腕到手肘這段距離逐級新增twist骨骼,設定twist骨骼的X軸旋轉值隨手部骨骼旋轉值遞減,從而可以實現簡單模擬手臂肌肉運動的效果。
twist只是一個簡單案例。架設修型骨骼是遊戲中常用的繫結方式。UE5的預設角色小白人相比UE4版本增加了若干修型骨骼,主要是為了相容meta human,這樣可以最低限度的保證角色運動不產生過多的畸變。
為什麼說是最低限度,因為這個修型骨骼數量太少了,無法還原角色運動時的肌肉形變效果,只能保證關節大致形狀。要想實現比較好的效果,全身骨骼數量可能要增加到800——1000個。這也是線性流程的3A遊戲角色常見骨骼數量。
有了修型骨骼,我們需要知道怎樣正確的驅動修型骨骼。twist骨骼的驅動邏輯比較簡單,只需要把父骨骼的旋轉值遞減複製就可以。control rig和動畫藍圖都可以做到,簡單連幾個節點就可以。這裡單獨提一下control rig,這是UE4後期版本開始加入的功能,專為處理遊戲中實時繫結需求而開發。詳細內容可以自行查閱官方文件。
圖看不清沒關係,這些都是小白人預設配置,隨便建一個第三人稱工程就有。如果你們使用的骨骼和虛幻官方小白人骨骼一致,那麼你可以原封不動的copy官方藍圖使用。本文主要講概念和原理,不會太多去寫具體教程。所以具體的驅動邏輯和應用,還需要自己去消化官方的案例和教程。最好自己跟著做一遍,並且嘗試各種驅動效果,才能完全理解骨骼設計和驅動之間的關係。簡單提示一下,小白人的上臂和大腿關節的修型骨骼旋轉值和父骨骼是相反的,至於為什麼這麼做,大家可以自行思考一下。
我們知道,關節運動不止只有扭曲(twist),還有搖擺(swing)。關節的YZ軸各個方向的旋轉我們通常統稱為搖擺。搖擺的修型相對扭曲更加複雜,因為姿勢更多。同時搖擺運動伴隨更多更復雜的肌肉擠壓和拉伸效果。所以它的驅動關係就不是複製個旋轉值這麼簡單了。首先,我們需要知道角色運動後各個關節pose狀態,也就是模型的運動形態。寫到這裡,又一個概念登場了——blendshape,也叫morph,或者morph target。一般翻譯為混合變形,或者變形目標。
blendshape演算法很簡單,就是加法。我們知道頂點的初始位置A,也知道它運動後的位置A+,那麼把A和A+的差值記錄下來,得到的這個結果就叫blendshape,簡稱BS。我們只需要在模型頂點的初始值上加上這個差值,就得到頂點運動後的位置。這個差值理論上可以無限加,也就是用BS做動畫。不過一般不會這麼做,因為這和一幀一個模型沒任何區別。
那麼BS和修型又有什麼關係呢?我們可以事先做出模型在不同關節角度運動後的結果,存成BS,然後在骨骼運動的時候讀取這個結果,這樣就做到了修型效果。在我上面貼到戰神4繫結製作分享中,戰神團隊大概製作了這麼多pose模型。當然這裡pose結果並不完全,人體的運動關節最少數量是16個,根據關節的活動範圍不同,需要製作的pose模型數量最少應不低於54個。
maya中製作骨骼運動驅動BS的工具叫做姿勢空間變形,pose space deformations,簡稱PSD。max沒這個功能做不了。簡單介紹就是在關節運動到一定角度的時候可以驅動一個BS,maya的psd工具允許你在關節運動角度狀態下編輯模型,把編輯結果儲存為BS,也可以讀取事先製作好的BS。在虛幻引擎中,驅動這個效果的節點叫pose driver,姿勢驅動器。
覆盤這個流程,就是美術事先做出一堆運動狀態下的模型,儲存為BS,然後驅動它。說起來很簡單,但是工作量令人頭大。道理很明顯,你做的pose越多效果越好。要實現複雜的肌肉運動效果,一個角色做幾百個pose是很正常的事情。所以看起來一個角色只需要美術做一個模型,但是要想動起來效果好,一個角色可能要做幾百個不同姿勢的模型。
做出來bs後怎麼實時驅動bs呢?主要方式有三種:
1:動畫師手K。就是關節運動到一個範圍內,手動設定對應關節的修型BS,可以用驅動關鍵幀實現。遊戲中因為大部分都是播放的固定動畫片段,所以可以把驅動結果bake成固定動畫幀播放。這樣對算力沒有任何要求,只對人力有要求。不夠缺點也顯而易見,這並不是真實時,只是實時播放事先製作的結果而已。他不能模擬所有狀態下的效果。隨著遊戲互動性的提高,越來越多的動畫是程式化生成的,比如不同高度的攀爬,翻越,適應不同地形的行走效果等。這種預製作的效果瓶頸就顯而易見了,預先做好的效果不能完全匹配實時計算出來的角色姿勢。
2:透過關節旋轉值計算。因為角色pose是根據關節旋轉角度製作的。我們只要把關節相對初始位置的旋轉角度對映到0-1範圍就能得到驅動bs的權重值。這個做法實現起來簡單,效果可控。藍圖或者control rig都可以做,就是做起來稍微有點麻煩,全是重複工作量。另外一堆連線很難整理,最好自己寫個節點。旋轉值驅動還有一個缺點就是多個pose同時存在的情況下,bs結果會有疊加問題。
3:rbf驅動。這也是虛幻pose driver節點提供的功能。RBF是徑向基函式的縮寫。關於RBF是啥具體可以參考這篇文章:
RBF可以做很多效果,計算BS差值只是其中一個應用,RBF還可以用於不同拓撲的網格體形狀轉遞,計算表情權重等。具體描述優點就是,當多個姿勢同時存在的時候,RBF沒有疊加問題。某個姿勢的權重越高,其他姿勢的權重會對應減少。
這是我們整理的pose驅動需求表,詳細列舉了每個基礎關節的運動軸向。看不清沒關係,一般專案也沒這種需求。
在UE5預設的第三人稱工程中,其實已經提供了姿勢驅動的效果模板。只不過驅動的結果是骨骼位置。其實原理是一樣的。因為驅動大量BS也就是頂點位置計算量巨大,所以將BS轉成骨骼,這樣我們只需要計算幾個骨骼的位置資訊就可以了,大大節省算力需求。所以把頂點運動資訊轉成骨骼並計算骨骼權重是一種最佳化手段,主要使用ssdr(線性蒙皮分解)演算法實現。相對於BS,骨骼優點更明顯,第一,通用性更強,權重合理的情況下,一套骨骼可以驅動不同拓撲的角色。第二,可以量產。第三,已經說過了,骨骼計算速度更快。
maya的RBF外掛和ssdr外掛滿大街都是,知道怎麼用就行了,除非有特殊需求,一般沒必要自己開發。
所以綜合起來,3A級角色繫結環節中的修型流程就是:美術事先做出一堆不同運動狀態下的pose模型,儲存為BS,然後轉化成骨骼權重和動畫資訊。再把骨骼動畫轉成pose資源,在找個方式驅動這些pose,就完了。
是不是很簡單?當然,這是目前的做法,下一代的做法已經開始引入機器學習來驅動形變結果了。不過無論演算法怎麼迭代,第一步,也是成本最高的那一步,始終是繞不開的,就是需要一堆資料結果來驅動,而這個資料結果,目前並沒有高效率低成本的生產方式,還是需要人工製作。
修型算是繫結流程中一個比較常見且工作量較大的環節。基本涵蓋了骨骼設計,模型製作,驅動關係設計等領域,繫結涉及的面非常瑣碎不可能面面俱到都講全。因為只能挑在工作流中佔比較大的部分講。下一篇打算寫表情,具體描述如何從0開始製作一套metahuman或者snapper的表情繫結系統。徹底拋棄UE的DNA節點限制並實時驅動。
相關閱讀:
建立下個時代的高畫質遊戲美術資源生產管線(一):攝影測量建模
建立下個時代的高畫質遊戲美術資源生產管線(二):材質與紋理規範——場景篇
建立下個時代的高畫質遊戲美術資源生產管線(三):細節與質感
建立下個時代的高畫質遊戲美術資源生產管線(四):角色服裝篇
原文:https://zhuanlan.zhihu.com/p/616173667
繫結是CG動畫製作流程中非常重要的一個環節,作為聯絡模型和動畫的紐帶,繫結保證了模型運動起來的效果也符合專案規範和審美標準,由繫結師製作和開發的各種工具可以很方便的讓動畫師快速實現自己想要的效果,在工作流中起到了承上啟下的關鍵作用。
我們可以透過幾個影片瞭解繫結的概念
恐怖動畫短片《遺物》MAYA角色繫結展示
https://www.bilibili.com/video/BV1D44y157mb/
筆尖繫結
https://www.bilibili.com/video/BV15T4y117rX/
線性蒙皮與混合修型差異對照
https://www.bilibili.com/video/BV1Hq4y1f7Kx
在以往的遊戲開發環節中,繫結往往是被忽視的一環。主要是受硬體條件限制的實時渲染環境無法支援繫結需要的各種複雜計算。隨著算力的提高和演算法的進步(移動平臺除外),使用者對產品品質要求也日益水漲船高,繫結流程也開始進入了遊戲開發環節中。
繫結環節主要有三步,1:骨骼搭建,2:蒙皮,3:控制器搭建和驅動關係設計。這三個環節相互關聯相互影響,在設計一套繫結方案的時候必須全面考慮才能得到最好的效果。同時,作為繫結環節的上游,模型的製作也會影響繫結設計和效果呈現。優秀的繫結師也必須對建模流程有所瞭解,或者模型對繫結環節有所瞭解,這樣才能做到領域互補。很多模型規範是和繫結一起溝通指定的,比如佈線位置,模型拓撲結構,掛件分配,UV分配等。
控制器搭建驅動關係設計則影響下游動畫環節的表現。優秀的關節聯動效果和驅動效果可以大大節省動畫師的工作量,起到事半功倍的效果。而有些效果的則是靠動畫師手工製作非常繁瑣或者很難做到效果特別好的,比如汽車行駛時輪胎懸掛和地面的接觸晃動,坦克履帶運動,生物運動時的肌肉晃動,雨傘的開合,角色運動時盔甲的晃動等等。那麼一個好的控制器設計可以把這些複雜的工作量一鍵化解。
綜上所述,繫結師是一個橫跨多個崗位的複合職位。他需要對資源製作中的模型材質流程有一定了解,這樣才能有效溝通上游,也要有動畫製作,基礎程式碼能力,常見的動力學解算,約束關係,計算機對物體旋轉和位移的計算,空間座標換算等計算機圖形學知識儲備。這樣才能高效率的驅動下游製作環節。可以說,繫結職位決定了動畫和遊戲美術生產管線中一半流程,其崗位含金量一點不比現階段熱門的TA或者圖形程式低。在動畫行業中,高階繫結師是離TD(Technical Director技術指導)最接近的行業。
因為繫結涉及的效果和技術面都非常廣,一篇文章是寫不完的,所以這裡主要談談遊戲或實時渲染中角色表現涉及的繫結工作流,這也是目前應用範圍最廣泛的部分。
遊戲角色繫結涉及的範圍主要有4大塊,修型和肌肉運動效果,表情效果,服裝運動效果,捏臉(身體)。我在幾年前翻譯的文章籠統的講過戰神4的製作流程,這裡詳細的介紹下相關操作步驟。
首先是角色修型,修型是動畫和影視繫結流程中的一個基礎模組,近幾年也逐漸開始出現在遊戲流程中。在介紹修型之前。我們要先了解下蒙皮的基礎概念。
遊戲和實時渲染中常見使用的方式是線性蒙皮。一個模型或者說一個網格體,是由N個頂點組成的。要想讓模型動起來,最直接的方式就是修改頂點位置,因此我們需要記錄每個頂點運動後的位置資訊。假如一個模型有20000個頂點,那麼需要記錄的每幀位置資訊就是20000*XYZ三個軸向的位移旋轉和縮放資訊,既180000個資料,如果動畫幀數是每秒30幀,那一秒的動畫資料就是5400000個資料。這個資料量隨模型的精細程度和幀數增加成指數級放大,相當於每幀就是一個模型,ABC格式就是這個概念,這種資料格式一般用於影視行業。這麼大的資料量用在實時渲染裡肯定是不行的,一段幾十秒的動畫可能就幾個G,沒有哪個普通使用者的裝置能跑得動。而且同時操作這麼多頂點也超過了人類的控制能力,那麼為了簡化計算量,我們會把頂點打組,用一個點去驅動N個頂點,這個點我們通常就叫骨骼(bone)。透過骨骼,我們可以把模型內一組大量的頂點運動資料簡化為幾個點的運動資訊,這樣需要儲存的資料能成指數級減少。
既然有了骨骼,那麼我們自然需要設計骨骼驅動頂點的方式。假如我們讓骨骼影響範圍內所有頂點都跟隨骨骼同步運動,那最終的結果就是這個物體看起來就是一個硬邦邦的剛體。所以我們需要控制頂點跟隨骨骼運動的範圍。最簡單的方式就是給頂點一個運動範圍衰減,100%為完全跟隨骨骼運動,0%為完全不跟隨骨骼運動,對映到0-1範圍,這個概念就叫權重。所以最終單個頂點的位置資訊是由驅動骨骼的運動範圍和頂點相對驅動骨骼的權重資訊混合計算而來。這個計算方式就叫線性混合蒙皮(linear blending skinning)。公式我就不貼了,這種祖傳演算法隨便一查就有。
線性混合蒙皮演算法計算速度很快,但是它也有很大缺陷,就是不能維持模型體積。線性蒙皮本質是加減法,最終計算的結果一定是頂點會朝權重影響方向移動,那麼在權重交界的地方,頂點位置會受多個骨骼位置影響。簡單來說,在權重交界的地方,骨骼旋轉的計算結果會導致頂點位置出現坍縮。
在演算法上,這種問題可以透過雙四元數蒙皮來解決,虛幻5新的animation deformer 系統也提供了雙四元數蒙皮方案。相關案例可以在內容例項專案的animation graph關卡找到。但是一般在專案中,為了實時渲染效能最佳化考慮,我們還是會採用線性蒙皮的方式製作角色,透過繫結修型來解決線性蒙皮的形變問題,也就是俗話說的“工匠克演算法”。
除了權重範圍,蒙皮結果還會受權重數量影響。既一個頂點最多能被多少骨骼驅動。在移動平臺通常是4個骨骼,在pc平臺上限可以擴充到24。數量為4的倍數。更改此選項需要修改專案設定裡skin相關設定。
回到剛才的話題,理解線性蒙皮方式的缺陷,就能理解為什麼我們需要透過繫結來製作修型。最終目標是為了讓模型運動起來的外形看起來順眼和符合運動造型規律,不產生不符合審美的畸變和扭曲。
以手臂為例,線性蒙皮的角色手掌骨骼做翻轉運動時會引起腕部形狀畸變,而正常人類運動時,因為骨骼結構的影響,手腕翻轉會帶動腕部至肘部肌肉和皮膚組織一起運動,從而維持手臂體積(大家可以自行觀察自己手臂感受一下)。我們可以透過架設骨骼的方式模擬這一運動效果。從手腕到手肘這段距離逐級新增twist骨骼,設定twist骨骼的X軸旋轉值隨手部骨骼旋轉值遞減,從而可以實現簡單模擬手臂肌肉運動的效果。
twist修型效果對比
twist只是一個簡單案例。架設修型骨骼是遊戲中常用的繫結方式。UE5的預設角色小白人相比UE4版本增加了若干修型骨骼,主要是為了相容meta human,這樣可以最低限度的保證角色運動不產生過多的畸變。
為什麼說是最低限度,因為這個修型骨骼數量太少了,無法還原角色運動時的肌肉形變效果,只能保證關節大致形狀。要想實現比較好的效果,全身骨骼數量可能要增加到800——1000個。這也是線性流程的3A遊戲角色常見骨骼數量。
UE5 骨骼版本
UE4骨骼版本
有了修型骨骼,我們需要知道怎樣正確的驅動修型骨骼。twist骨骼的驅動邏輯比較簡單,只需要把父骨骼的旋轉值遞減複製就可以。control rig和動畫藍圖都可以做到,簡單連幾個節點就可以。這裡單獨提一下control rig,這是UE4後期版本開始加入的功能,專為處理遊戲中實時繫結需求而開發。詳細內容可以自行查閱官方文件。
圖看不清沒關係,這些都是小白人預設配置,隨便建一個第三人稱工程就有。如果你們使用的骨骼和虛幻官方小白人骨骼一致,那麼你可以原封不動的copy官方藍圖使用。本文主要講概念和原理,不會太多去寫具體教程。所以具體的驅動邏輯和應用,還需要自己去消化官方的案例和教程。最好自己跟著做一遍,並且嘗試各種驅動效果,才能完全理解骨骼設計和驅動之間的關係。簡單提示一下,小白人的上臂和大腿關節的修型骨骼旋轉值和父骨骼是相反的,至於為什麼這麼做,大家可以自行思考一下。
我們知道,關節運動不止只有扭曲(twist),還有搖擺(swing)。關節的YZ軸各個方向的旋轉我們通常統稱為搖擺。搖擺的修型相對扭曲更加複雜,因為姿勢更多。同時搖擺運動伴隨更多更復雜的肌肉擠壓和拉伸效果。所以它的驅動關係就不是複製個旋轉值這麼簡單了。首先,我們需要知道角色運動後各個關節pose狀態,也就是模型的運動形態。寫到這裡,又一個概念登場了——blendshape,也叫morph,或者morph target。一般翻譯為混合變形,或者變形目標。
blendshape演算法很簡單,就是加法。我們知道頂點的初始位置A,也知道它運動後的位置A+,那麼把A和A+的差值記錄下來,得到的這個結果就叫blendshape,簡稱BS。我們只需要在模型頂點的初始值上加上這個差值,就得到頂點運動後的位置。這個差值理論上可以無限加,也就是用BS做動畫。不過一般不會這麼做,因為這和一幀一個模型沒任何區別。
那麼BS和修型又有什麼關係呢?我們可以事先做出模型在不同關節角度運動後的結果,存成BS,然後在骨骼運動的時候讀取這個結果,這樣就做到了修型效果。在我上面貼到戰神4繫結製作分享中,戰神團隊大概製作了這麼多pose模型。當然這裡pose結果並不完全,人體的運動關節最少數量是16個,根據關節的活動範圍不同,需要製作的pose模型數量最少應不低於54個。
maya中製作骨骼運動驅動BS的工具叫做姿勢空間變形,pose space deformations,簡稱PSD。max沒這個功能做不了。簡單介紹就是在關節運動到一定角度的時候可以驅動一個BS,maya的psd工具允許你在關節運動角度狀態下編輯模型,把編輯結果儲存為BS,也可以讀取事先製作好的BS。在虛幻引擎中,驅動這個效果的節點叫pose driver,姿勢驅動器。
覆盤這個流程,就是美術事先做出一堆運動狀態下的模型,儲存為BS,然後驅動它。說起來很簡單,但是工作量令人頭大。道理很明顯,你做的pose越多效果越好。要實現複雜的肌肉運動效果,一個角色做幾百個pose是很正常的事情。所以看起來一個角色只需要美術做一個模型,但是要想動起來效果好,一個角色可能要做幾百個不同姿勢的模型。
做出來bs後怎麼實時驅動bs呢?主要方式有三種:
1:動畫師手K。就是關節運動到一個範圍內,手動設定對應關節的修型BS,可以用驅動關鍵幀實現。遊戲中因為大部分都是播放的固定動畫片段,所以可以把驅動結果bake成固定動畫幀播放。這樣對算力沒有任何要求,只對人力有要求。不夠缺點也顯而易見,這並不是真實時,只是實時播放事先製作的結果而已。他不能模擬所有狀態下的效果。隨著遊戲互動性的提高,越來越多的動畫是程式化生成的,比如不同高度的攀爬,翻越,適應不同地形的行走效果等。這種預製作的效果瓶頸就顯而易見了,預先做好的效果不能完全匹配實時計算出來的角色姿勢。
2:透過關節旋轉值計算。因為角色pose是根據關節旋轉角度製作的。我們只要把關節相對初始位置的旋轉角度對映到0-1範圍就能得到驅動bs的權重值。這個做法實現起來簡單,效果可控。藍圖或者control rig都可以做,就是做起來稍微有點麻煩,全是重複工作量。另外一堆連線很難整理,最好自己寫個節點。旋轉值驅動還有一個缺點就是多個pose同時存在的情況下,bs結果會有疊加問題。
3:rbf驅動。這也是虛幻pose driver節點提供的功能。RBF是徑向基函式的縮寫。關於RBF是啥具體可以參考這篇文章:
RBF可以做很多效果,計算BS差值只是其中一個應用,RBF還可以用於不同拓撲的網格體形狀轉遞,計算表情權重等。具體描述優點就是,當多個姿勢同時存在的時候,RBF沒有疊加問題。某個姿勢的權重越高,其他姿勢的權重會對應減少。
這是我們整理的pose驅動需求表,詳細列舉了每個基礎關節的運動軸向。看不清沒關係,一般專案也沒這種需求。
在UE5預設的第三人稱工程中,其實已經提供了姿勢驅動的效果模板。只不過驅動的結果是骨骼位置。其實原理是一樣的。因為驅動大量BS也就是頂點位置計算量巨大,所以將BS轉成骨骼,這樣我們只需要計算幾個骨骼的位置資訊就可以了,大大節省算力需求。所以把頂點運動資訊轉成骨骼並計算骨骼權重是一種最佳化手段,主要使用ssdr(線性蒙皮分解)演算法實現。相對於BS,骨骼優點更明顯,第一,通用性更強,權重合理的情況下,一套骨骼可以驅動不同拓撲的角色。第二,可以量產。第三,已經說過了,骨骼計算速度更快。
maya的RBF外掛和ssdr外掛滿大街都是,知道怎麼用就行了,除非有特殊需求,一般沒必要自己開發。
所以綜合起來,3A級角色繫結環節中的修型流程就是:美術事先做出一堆不同運動狀態下的pose模型,儲存為BS,然後轉化成骨骼權重和動畫資訊。再把骨骼動畫轉成pose資源,在找個方式驅動這些pose,就完了。
是不是很簡單?當然,這是目前的做法,下一代的做法已經開始引入機器學習來驅動形變結果了。不過無論演算法怎麼迭代,第一步,也是成本最高的那一步,始終是繞不開的,就是需要一堆資料結果來驅動,而這個資料結果,目前並沒有高效率低成本的生產方式,還是需要人工製作。
修型算是繫結流程中一個比較常見且工作量較大的環節。基本涵蓋了骨骼設計,模型製作,驅動關係設計等領域,繫結涉及的面非常瑣碎不可能面面俱到都講全。因為只能挑在工作流中佔比較大的部分講。下一篇打算寫表情,具體描述如何從0開始製作一套metahuman或者snapper的表情繫結系統。徹底拋棄UE的DNA節點限制並實時驅動。
相關閱讀:
建立下個時代的高畫質遊戲美術資源生產管線(一):攝影測量建模
建立下個時代的高畫質遊戲美術資源生產管線(二):材質與紋理規範——場景篇
建立下個時代的高畫質遊戲美術資源生產管線(三):細節與質感
建立下個時代的高畫質遊戲美術資源生產管線(四):角色服裝篇
原文:https://zhuanlan.zhihu.com/p/616173667
相關文章
- 建立下個時代的高畫質遊戲美術資源生產管線(六):表情篇遊戲
- 建立下個時代的高畫質遊戲美術資源生產管線(七):動作捕捉遊戲
- 建立下個時代的高清遊戲美術資源生產管線(一):攝影測量建模遊戲
- 繫結變數之基本概念變數
- 高品質的遊戲美術如何生產?來看看鵝廠的美術開發工作流遊戲
- 資料繫結
- 簡單資料繫結和複雜資料繫結
- javascript實現資料的雙向繫結(手動繫結)JavaScript
- Vue的資料繫結Vue
- 第二講、Vue3.x繫結資料、繫結html、繫結屬性、迴圈資料VueHTML
- 資料繫結原理
- WPF備忘錄六(資料繫結篇)
- 列舉繫結資料來源,獲取值
- 五分鐘看懂Vue3-資料繫結Vue
- MySQL高階特性——繫結變數MySql變數
- C++的動態繫結和靜態繫結C++
- IOC容器的繫結解析過程(繫結單例)單例
- Laravel 路由的隱式繫結和顯式繫結Laravel路由
- java中的靜態繫結與動態繫結Java
- 理解靜態繫結與動態繫結
- 【阿不】深入ASP.NET資料繫結(下)—多樣的繫結方式ASP.NET
- this 繫結解析
- 繫結事件事件
- 事件繫結事件
- 繫結變數的一個例子變數
- 資料繫結之謎
- 【Angular-資料繫結】Angular
- 2、理解資料繫結
- Angular | 理解資料繫結Angular
- 動態繫結和靜態繫結的簡單理解
- 關於繫結變數的SQL繫結什麼值變數SQL
- SSL證書繫結域名還是繫結IP?
- C++ — 靜態繫結與動態繫結C++
- dataGridView繫結Dictionary |Dictionary繫結到DataGridViewView
- mysql繫結多個ip地址MySql
- 批次繫結幾千個域名
- springboot 配置多個資料來源,@MapperScan方式繫結Spring BootAPP
- angularjs中的資料繫結AngularJS