承接上次的筆記(想要看可以來這),本次筆記是有關Maya Rigging Basic的第8到11章的教學,大致上會記錄:
1.簡單的Spine結構
2.Roll&Twist Joint的做法
3.Squash&Stretch做法
那麼就讓我們開始吧!
簡單的Spine結構
首先先架好脊椎的joint,軸向自然是跟世界軸向一樣,Z軸朝前Y軸朝上。
接下來,給它們上個簡單的FK控制器,到目前為止都還很好了解!
現在,我們要新增一個叫做Waist的控制器,它的功能是拿來讓我們做出扭腰擺臀動作的控制器,因此,我們要把這個控制器的軸向從root位置移動到Spine_1的位置,然後,把原本root joint上的constraint解除掉(上一步做的)。
接著再使用waist ctrl parent到 root上,就完成了,現在我們可以做出扭屁股動作,而且原本的root 控制器仍然可以控制它的下層那些FK控制器!
最後,再新增一個Mian的控制器(或是你想叫什麼其他的名稱也可以),然後把剛剛創建的兩個控制器群組(Root跟Waist)丟到它底下,這個部分就算完成一半了!
接下來要做的,就是稍微整理一下joint的階層,把新增的root joint丟到原本就有的群組內,然後把hip跟scapula分別丟到root跟chest底下,保持整個骨架的階層一目瞭然!
注意!! 這邊的joint指的是拿來skin的Base joint,不是IK跟FK骨架,千萬不可搞混了!!!
接下來,一樣繼續整理joint,這次要整理的是IK FK骨架,我們把手臂(ARM)跟大腿(LEG)的joint Group起來。
這個步驟,我們要使用waist ctrl來parent constraint Leg_Joint(這邊叫Hip)這個group,可以看到完成之後我們的大腿骨就可以跟著控制器扭屁股了,而且還可以做出半蹲的動作!
最後再把group隱藏起來!
在上一步驟我們可以發現手臂的部分並沒有跟著身體移動,那是因為我們還沒有處理Scapula這個joint的控制器!
首先,先製作一個肩胛骨專用的控制器,然後把它parent constraint到Scapula這個joint上!
然後,跟之前大腿骨的步驟一樣,我們使用這個scapula ctrl parent constraint到Arm_JNT這個group上,最後把這整個ctrl group丟到Chest ctrl底下,現在轉動它,可以發現手臂已經開始跟著整個身體移動了!
這個時候如果你把手跟大腿控制器切換到FK模式會發現,FK的控制器並沒有跟著移動!!!!
那是因為剛剛我們做的綁定還漏掉了FK 控制器群組這個部分!
現在,我們把Scapula ctrl constraint patent到FK Arm ctrl group上,以及Waist ctrl constraint parent到 FK Hip group上,就完成了,現在不管是IK FK,所有的控制器以及joint都已經正常運作了!!!
Roll&Twist Joint的做法
Roll Joint會用在肩膀跟手肘+手肘跟手腕之間,如果整隻手的骨架只有肩膀、手肘、手腕,會發現旋轉的時候不像正常人,因那是因為當我們旋轉手腕時,其實是有兩條肌肉來帶動中間的部位的,所以我們會需要使用Roll Joint來模擬正常手臂的動態!!
首先,我們複製shoulderJNT出來,把它重新取名為Shoulder_Roll,接著再複製一個命名為Elbow_Roll,接下來使用elbow_JNT加上shoulder_JNT對它做parent constraint,但是不要勾選旋轉,讓它的位置能夠處於elbow_JNT、shoulder_JNT中間,然後把它丟回shouldr_Roll底下!
接著把這整個Roll_JNT丟回原本的shoulder_JNT階層底下!
新增一個locator,使用shoulder_JNT parent constraint它,讓它的位置一樣,然後把它往後移,命名為Shoulder_Roll_Loc。
這個locator是為了待會的constraint會用到,目的是要讓shoulder_Roll的軸向永遠指向固定方向!
接下來就是重要的一步! 我們要使用elbow_JNT 來AimConstraint shoulder_Roll,World up type選擇Object up。
Aim Vector我們要選擇joint指向的方向,也就是X軸,而Up vector則是使用joint 朝前的軸向,也就是Z軸,但是這邊我們要使用-1,那是因為我們剛剛創建的Shoulder_Roll_Loc目前正位於joint的後方,所以為了讓shoulder_Roll保持對它的軸向一致,我們要選擇加上負號!
完成之後按下Apply。
現在旋轉控制器會發現,只有往前跟往後的時候shoulder_Roll才會跟著移動,但是只要旋轉X軸它就不會有反應,那是因為我們已經對它做了AimConstraint,再加上Shoulder_Roll_Loc的限制,等於它現在只能永遠朝向elbow_JNT這個方向,然後只能透過Shoulder_Roll_Loc的位移才能對X軸產生影響!
接下來,我們要再複製一次整個Shoulder_Roll_JNT。
將它取名為Shoulder_Roll_Aim。
接著對它做一次IK 控制器! 使用Rotate Plane Solver!
View post on imgur.com
現在接著把剛剛生成的IK Handler重新命名,然後把它parent 到elbow_JNT底下,接著把軸向也吸過去對準。
至於先前生成的Shoulder_Roll_Loc則是把它加到Shoulder_Roll_Aim階層底下,現在我們的肩膀就可以正常地位移了!
View post on imgur.com
現在記得要把剛剛創建的IK Handler的Vole Vector 都歸零!
最後把Shoulder_Roll_Aim放到跟IK FK 手臂一樣的群組就可以了!
這裡,把shoulder_Roll 的X軸數值connect到 Elbow_Roll上就可以了,可以再加上multiply結點來控制強弱,畢竟上臂旋轉會漸弱然後過渡到手肘!
View post on imgur.com
那麼,上半部的Twist就完成了! 接下來就要進行手肘到手腕的Twist製作,相對於上肩來說會比較單純一點,做法也非常雷同!
首先,一樣先在手腕、手肘手腕中間位置處各放一個joint,命名為Wrist_Roll_End(放在手腕)、Wrist_Roll。
接著把它們都放到Elbow_JNT階層底下。
現在一樣在手腕位置處做一個locator,命名為Wrist_Roll_END,把它constraint到手腕,然後刪掉constraint,移到手腕後方。
接著把這個locator移動到wrist_JNT的階層底下,讓它跟隨手腕移動。
現在一樣使用aimConstraint;使用elbow_JNT對wrist_Roll_End做,然後一樣用object up,名字輸入Wris_Roll_End這個locator,至於為什麼AimVector跟在製作上手臂時不一樣,這邊使用負數,那是因為對於Wrist_Roll_End來說,它要指向的Elbow_JNT是在反向(X軸),所以這邊要用負數!
完成之後可以發現,只有手腕旋轉X軸時,wrist_Roll_End才會旋轉!!
View post on imgur.com
最後就跟剛剛一樣,把Wrist_Roll_End的X軸Connect到Wrist_Roll上就可以了!!
View post on imgur.com
現在只要把剛剛新增的twist joints加回原本的skin就可以了。
接下來只有腳踝這邊要特別注意,因為他的軸向有點特別,X軸一樣維持負數,不過這邊的Up Vector我們選用朝向左邊的軸向,也就是正Z軸!
至於大腿的Twist作法基本上就跟Shoulder那邊一樣,所以這邊就不多說哩!
那麼最後動起來差不多就會是這樣!
那麼Twist Joint的作法到這邊就告一段落了!!!
Squash&Stretch的做法
Squash&Stretch如字面上意思,就是賦予rig拉伸效果! 通常會家在身體軀幹以及四肢!
提供更animator更自由的表演方式!
首先,我們複製出整個shoulder的joint,然後只保留joint,其他的constraint都刪除!
並且加上後綴_Stretch,這節joint是為了測量stretch的程度!
打開node editor,我們把這三個JNT load進來,然後新增distance between節點來計算他們之間的距離,可以看到這邊是使用World Maxtrx[0]接到In Matrix,如此一來我們就可以得到Shoulder_L_Stretch跟Elbow_L_Stretch之間的距離,而另一個distance between的節點則是接上Wrist_L_Stretch跟Elbow_L_Stretch!
接下來把這兩個distance 節點接到Double Linear的節點上,這麼一來我麼就取得了整隻手臂的距離資訊!
現在,我們把IK 手腕的控制器也叫進來,然後把它跟Shoulder_JNT_L一同接到Distance節點上,因為等等我們需要這個數值來去跟整個手臂比較。
最後,再把剛剛的Double Linear把它接到一個mmultiply節點上,命名為Shoulder_Stretch_Scale_L,模式選擇相除,也就是Divide。
現在我們把剛剛的節點通通整合到一個condition節點上,命名為Shoulder_Stretch_Cond_L,模式使用Greater Than,它是用來輸出正確的縮放數值到最終的JNT上的。
底下我們可以看到IK_Wrist_CTRL_Distance_L跟Shoulder_Stretch_Distance_L一起接到了Shoulder_Stretch_Scale_L(使用Divide模式),這是因為我們要比較IK控制器跟整個shoulder的長度,在控制器沒有變動時,他們的數值相除數值應該會為1,因為彼此的位置距離是一樣的!
但是當IK控制器的距離大於整個Shoulder之後,那麼Shoulder_Stretch_Scale_L輸出的數值就會大於1,此時Shoulder_Stretch_Cond_L就會接收到-------->First Term大於Second Term,那麼最終會輸出來自Shoulder_Stretch_Scale_L最終的數值,而這個數值恰好就可以拿來縮放我們的JNT,達到伸縮的效果!
現在,把IK JNT裡面的Shoulder跟Elbow叫進來,然後把Shoulder_Stretch_Cond_L的Output接上ScaleX就完成了! 接上Scale X是因為joint的指向軸向是X,所以並沒有固定一定要接到哪個軸向,完全是看joint的走向來決定!
現在我們已經完成了初步的伸縮效果,但是會發現Roll JNT並沒有跟著縮放,而這也是我們必須解決的問題!
現在,我們叫入用來Bind的Shoulder JNT,注意,這邊跟剛開始複製出來的Shoulder_JNT_Stretch是不一樣的,我們這邊要使用的是拿來skin的那副骨架! 也就是最原始的骨架,千萬不可搞混!
接著一樣為他們接上Distance節點!
現在,把這兩個Distance節點接上multiply節點,命名為Shoulder_JNT_Roll_Stretch_L,要把input 2x、2y數值調為0.5是因為,我們要確保這兩個Roll JNT的位置永遠都在Shoulder_JNT+Elbow_JNT、Elbow_JNT+Wrist_JNT的正中間,所以需要把distance的數值除以2,也就是乘上0.5!
最後把OuputX Y 分別接上Translate X,也就是指向的軸向!
接著,我們也可以加入縮放的效果,讓整體看起來更有細節,所以這邊,把原本的Shoulder_Stretch_Cond_L接到Roll_JNT的ScaleX數值上!
現在,我們的Roll JNT也能夠跟著一起伸縮了!
現在,已經大致上完成了伸縮的IK手臂,但是如果我們切回FK,會發現Roll_JNT的縮放數值並沒有回到原位(也就是1),那是因為如果我們沒有將IK控制器歸零,那麼Roll_JNT就會維持在被移動的狀態下,所以我們需要再加上幾個節點,讓手臂的Roll_JNT伸縮只有在IK開啟的狀態下才有作用!
現在我們需要把IK FK切換器叫進來,然後新增一個blend color節點,命名為Roll_JNT_Blend_L,接著,把Shoulder_Stretch_Cond_L接到 Color 1 R,IK FK接到Blender,最後OuputR輸出到Roll_JNT的ScaleX取代原本的連接! 最後把Roll_JNT_Blend_L的Output2R數值設成1。
blend color節點是一種可以迅速在兩種數值之間切換的工具,如果Blender數值為1(也就是切換到IK時),那麼就會輸出 Color 1 R的數值,也就是我們希望縮放的數值,反之blender為0時(也就是切換到FK時),就會輸出 Color 2 R的數值,也就是1,這樣一來在FK的狀態下,Roll_JNT的scale數值就會維持在預設的狀態了!
現在完全正常了!!! IK FK切換也不會影響到任何東西!
寫到這裡,終於到了本篇筆記的最後一步,就是為這個IK 伸縮的功能新增更多選項!
首先先切換到Shoulder_Stretch_Cond_L,把他的面板獨立出來,然後我們可以發現如果改變了operation的模式,縮放的效果就會不同!
目前可以看出Equal模式會把伸縮功能關掉,Less Than則是會變成擠壓,至於其他大多大同小異,因此,我們可以在IK控制器上新增切換器讓animator可以隨時切換伸縮的模式!
View post on imgur.com
設定的方法很簡單,就是Driven Key而已!!
最終成品!!
那麼,這個超長筆記就到一段落了!!
如果覺得這篇文章有幫助你在動畫之路走得更長遠,可以使用 Google 或 Facebook 帳號快速登入,按Like五下,就可以幫助我從Likecoin得到回饋,完全不用任何費用!
一點點的鼓勵都會成為我寫作的動力,感激不盡!
0 留言