Control Rig 是Unreal Engine的rigging系統,一個完全節點、程序化的綁定流程,基本上可以做到跟maya差不多的效果,除了無法直接編輯blendshape、deformer略少之外,絕對是個很強大的工具,完全不需要自己寫程式就可以做到近乎coding的效果!!
最近嘗試在control rig還原Maya advanced skeleton的效果,底下是一些在過程中學習到的筆記。
Construction Solver+Forwrd Solver結構
第一次接觸control rig可能會有點困惑,基本上這兩個節點都是在處理rig,只不過,Construction solver負責初始化,Forward Solver負責傳遞資訊。
這是一個很特別的概念,在control rig的結構裡面,所有在construction solver後面執行的節點都只會執行一次,也就是說這個方法特別適合用來生成控制器以及將其移動到我們需要的位置上,可以理解為將整個rigging系統初始化的步驟。
而Forward Solver就是真正讓控制器驅動joint發生的地方,所有的數值、constraint、旋轉位移縮放都是在這個節點之後才能真正傳遞到joint上。
下面的影片簡單用了節點生成控制器,可以看到就算移動控制器,骨架也沒有跟著移動,那是因為construction solver後面的所有節點都會執行一次,所以這整串命令就會停在完成控制器那一刻,後續的位移則必須使用Forward Sovler來執行。
底下是使用forward solver節點串接的簡單控制器,可以看到在這一層執行的指令會不斷傳遞到設定的節點上。
幾個會用到的熱鍵
Ctrl+G 當前選中的控制器數值歸0。
Ctrl+Shift+G 所有控制器數值歸0(順帶一提,如果rig因為這樣爆炸,務必回去檢視控制器是否在construction階段沒有勾到initial這個選項!)。
T 隱藏控制器。
Array的應用以及Control Stack Item快速生成控制器
Array相當於python中的list,可以使用for each來迭代內容物,這個節點在control rig中絕對必用,另外Control Stack Item則是一個完整的function,可以迅速生成控制器以及上層null(也就是maya的group)。
要生成array節點很簡單,複選想要迭代的物件(joint、ctrl任何東西都可以),拖進面板就可以創建。
想要對array內容物做進一步的處理,就必須要使用for each節點,然後串上Control Stack Item,就可以生成控制器,並且是在剛剛選中的物件位置上生成,這個function非常強大,還可以勾選是否要在上層新增null、是否需要二級控制器,也可以更改形狀、顏色。
新增null之後會發現所有控制器瞬間都飛回世界中心,那是因為null的所有數值都是0,所以控制器自然就被放回世界中心,下一步,就是要擷取每個joint的位置,重新將null定位回去!
要將null正確定位回去joint位置,首先就須要先得到joint的位置,也就會用到get trnsform,這是一個類似maya.cmds xform的命令,用意是獲取物件的transform資訊。
然後再將Control Stack Item 的null output到set transform節點,最後串聯剛剛get到的資訊,就可以看到控制器已經正確定位回去joint的位置,非常迅速!
這邊需要注意的是,一定要在set transform這邊勾選initial,這個用意是讓unreal理解到當前設定的位置就是控制器的起始位置,我想應該類似於maya中的freeze transform,雖然不太一樣。
控制器已經創建完成,但是階層不對,現在每個控制器都散落在外,我們需要的應該是有上下階層關係的FK Chain。
要做到這一點,就必須在迴圈之前指定好parent對象!
要做到這件事,我們還需要先在VARIABLES面板新增變數,可以想像成是python中的空變數,當我們一開始先在迴圈前指定parent變數,這個時候還變數還是空白的,也因此array的第一個item並不會被parent到任何物件底下,但是當節點執行到Control Stack Item之後,我們將這個變數set為Secondary ctrl,那麼迴圈再迭代下一次時就會自動將parent對象指定為上一個sec ctrl,也因此就可以做出FK Chain的階層。
控制器生成完成之後,接下來就需要將它綁定到joint上,在Maya中通常使用parent constrinat來做這件事,在unreal一樣可以,不過還有另一個比較直觀的方式,就是使用get transform--->set transform的做法。
在一開始先將需要綁定的joint選中為array,然後使用concat,這個節點可以為任何物件加上前綴以及後綴。
接著get 這些加上後綴的控制器的transform,然後輸出到set transform節點,這個方式比較像maya中的connection,就是將當前的控制器數值直接原封不動輸出到joint上。
IK FK 切換以及Snap
上面完成了FK的製作,接下來解釋下IK的製作方法。
要製作IK需要兩個控制器,一個IK Ctrl、一個Polve Vector,在Unreal中都是透過節點來生成的。
首先先來製作pole vector控制器,使用compute pole vector節點,然後依序選擇肩膀、手肘、手腕三根joint,系統就會自己判別pole vector應該在的位置。
然後將transform數值輸出到另外新增的控制器上就完成了,一定要勾選initial,沒有勾選之前控制器的數值並沒有歸零,這點非常重要!
IK Ctrl就比較簡單了,選擇wrist joint然後生成控制器即可。
IK控制器完成,現在就把它綁定到joint上,這次會使用到IK節點。
把剛剛新增的兩個控制器分別接上,這邊要注意Primary 、Secondary的軸向,要按照手臂的joint軸向來設定。
接下來,製作IK FK切換的裝置,首先需要一個用來切換的控制器以Attribute,在unreal裡面這個東西叫做Animation Channel。
想要在IK FK控制器之間切換,就需要使用到if這個簡單的節點,設定是這樣True-->IK,False ----->FK。
這樣切換功能就玩了,但是,還需要再加上兩個功能這個rig才會更適合動畫師的基本需求,那就是隱藏沒有用到的控制器,以及同步IK FK的位置。
首先來解決控制器隱藏的部分,概念就是當切換到IK,就隱藏FK,反之亦然。
這邊會用到Hide Control這個節點,還有剛剛切換IK FK的animation chnnel,在這邊,隱藏控制器要在執行綁定之前,所以要把執行節點放在Branch,這樣邏輯才會是正確的。
現在,來處理控制器跟隨部分,如果你有發現,當IK FK做切換時,上一個使用的控制器會被留在原地,等到下一次切換時又會瞬間飛過去,這對於動畫師來說是很不友善的,所以如果可以都會盡量讓IK FK控制器維持同步。
要做到這一點,就必須要在使用FK時,讓IK控制器跟隨joint,反之亦然,這樣在做切換就不會發生模型瞬間彈跳的情況。
Function功能
如字面上意思,這是一個可以將多個節點打包成獨立運作的涵式的功能,包含所有function的特性,可以方便將已經做好的功能更程序化!
unreal function也包含了return,讓我們可以將計算結果回傳出來利用,也可以自訂變數!
0 留言