【Maya HAT Rigging_1】SplineIK

【Maya HAT Rigging_1】SplineIK

 




最近在看迪士尼大神的教學,非常受用,沒有用到什麼高深的技術但是把基礎的角色rigging講的很清楚直白,如果想要手動建構自己的rig系統可以參考!

這篇是想筆記下裡面提到的splineIK做法,這是一個整合IK/FK的rig,多會用在脊椎+脖子部位,其實不難,不過以往都依賴Advanced Skeleton所以沒有思考過背後的原理,這次剛好透過這個workshop來學習基礎的spline做法。


這個spine基本上包含了這些功能:

  • Stretch&Squash(包含開關)
  • IK 首尾ctrl 位移(改變orient軸向)
  • IK Twist
  • 整合FK功能


----------------------------------------------------------------------------------------------------




S1.基礎Rig設置


首先第一步就是製作簡易spine chain,用 IK Spline Handle生成,沒意外的話會出現一條curve,整個spine就是透過控制這條curve來做動態。










然後CV線可以打開DispCV看到控制點,這些點就是控制整個CV的點,等等會把joint定位到這些點上。







然後就是在剛剛顯示的CV點上放上joint,用這些joint bind上CV線! 這樣整個spine就會被這些joint給控制,然後這些joint通常會直接parent到控制器底下,並不會bind到model上。








現在只要移動ctrl,就會看到spineIK已經被帶動了。

到這裡基礎的rig已經設置好了,剩下的就是把那些額外的功能加上去。









S2.Stretch Squash功能



這一個步驟是要實現IK必備的擠壓功能以及包含可控制的開關,讓animator可以有更多彈性來做表演。


先到node editor,把CV線以及bind joint(不是IK 控制器底下的joint)載入。





然後把CV線接上curve info這個節點取得線段長度,然後接上multiply節點,目的是要製作出〖當cv線被控制器拉伸而導致長度變化時,就縮放bind joint〗!


原理就是:

「用『目前曲線長度 ➗ 初始曲線長度』,去縮放 joint 的 translate 軸向(可能是X\Y\Z其中一個)」







接法如下,在multiply節點的input2要填上從 curve info中得到的CV線原始長度數值,然後使用Divide模式,就可以得到目前CV線的伸縮比例,再用這個數值去拉伸bind joint。

PS.有時候Arc Length不一定是整數,因為maya介面只會顯示到小數點後兩位,所以建議用getAttr命令來取得最精確的數值!







接著再把multiply的outputX接上bind joint 的特定scale軸向(這邊是X)就可以了!






完成之後就可以做拉伸。





stretch功能已經完成,接下來就是squash功能。

當 IK 拉長(Stretch)時,主軸變長,其他軸向依比例縮小,用來維持整體體積不爆不扁。

技術上就是:

  • 先算出 拉伸比例(Stretch Ratio)

  • 再用這個比例「反向影響」joint 的 scaleY / scaleZ

  • 常見做法是 1 / sqrt(stretchRatio),讓視覺看起來自然、不像橡皮筋


1 / sqrt(stretchRatio) 的意思是:

  • stretchRatio:目前被拉長了幾倍

  • sqrt(開根號):把縮放效果「減半」,避免看起來太誇張

  • 1 /:做反向補償,拉長就變細、縮短就變粗





所以,在maya要做出這樣的計算會需要用到兩個multiply節點,再加上剛剛已經得到的縮放比例(ratio)。


底下是Spline IK 的 Squash 節點串法

先用 spineIK_stretch_md 算出曲線「目前長度/原始長度」的 Stretch Ratio,接著用 multiplyDivide 設為 Power(0.5)(本質上等同於開根號,因為 Maya 沒有開根號節點,只能用次方運算來實作 √x)讓 squash 的反應變得較平滑,最後用右邊的 spineIK_squash_invertRatio_md1 ÷ sqrt(ratio) 得到「拉長就變細、縮短就變粗」的補償值,拿去驅動 joints 的 scaleY/scaleZ 來維持體積感。



最後再把spineIK_squash_invertRatio_md串上bind joint剩餘的兩個scale軸向就完成了!






現在就有了squash功能。






接下來就是作個開關來控制stretch squash,讓animator可以在特定時候開關這些功能。

Stretch 這一側,blendColors 的目的不是「關掉運算」,
而是 讓輸出永遠回到 Arc Length 的原始長度(12)

  • 當 Stretch = 0

    • blendColors 輸出固定為 12(原始 Arc Length)

    • 後面的 stretchRatio = 12 ➗ 12

    • 比例永遠是 1

    • 所有 bind joint 的 translate / scale 都不需要被拉伸

    • 👉 等同於「IK 永遠沒有變長」



Squash 這一側,blendColors 的角色是:

讓 scale 的輸出值在「1」與「計算結果」之間切換。

  • 當 Squash = 0

    • blendColors 輸出固定為 1

    • 後面就算有:

      • 開根號

      • 倒數

      • 比例運算
        👉 任何數對 1 開根號,結果仍是 1
        👉 joint 的 scaleY / scaleZ 永遠維持 1
        👉 完全不會有 squash










完成之後就可以開關。








S3.整合FK功能



一般rig會把FK IK分開,不過用在spine上似乎都會把兩者結合,畢竟這樣可以做出更多效果也不用再花時間設key做切換。



基礎設置基本上就是做一個FK chain(不用joint),位置一樣對齊CV point,然後把IK ctrl按照位置整包丟進去相對應的FK ctrl。


然後最上面的IK ctrl那邊基本上不會再放FK ctrl,因為用不太到。





然後效果如下,動起來滿不錯的有保持體積感,很類似ADS inbetween的感覺!









S4.IK Twist


如果旋轉IK ctrl會發現其實joint不會跟著一起轉動,這是先天上的限制,因為IK spline本身就只是控制CV線上的點而已,如果要做出類似旋轉的twist功能,需要到ik solver這邊設定。

基本上就是指定頭尾IK ctrl,然後AXIS這邊以bind joint軸向為主! 設定好就可以twist了!


PS.可以透過開關skin cluster有沒有設置錯誤!






設定好就可以透過頭尾IK ctrl來做twist。







S5.IK 首尾ctrl 位移(改變orient軸向)+Follow



這兩個功能會放在一起是因為,這兩個功能會互相影響。

首先先來做首尾Ctrl位移,這是一個可以改變控制器位置而不影響整體rig的功能。


先做兩個group,分別parent到 IK首尾Ctrl,也要把原本在裡面的ik drv joint丟進去這個新group。





然後利用IK ctrl上層的group,接上反向的multiply節點,抵消等等要位移的控制器!








接下來用DrivenKey,利用IK ctrl上的自定義Attr來位移控制器上層的gorup,0的時候在預設位置,1就移動到上層控制器位置。







兩個IK ctrl都完成之就可以做出這樣的效果。






接下來處理IK follow功能,這個主要是讓中間段的IK ctrl 透過調整constraint權重來跟隨首尾的IK ctrl。


首先先創建兩個group,以其中一個IK ctrl為命名基礎,這兩個group等等要parent到首尾的IK ctrl裡面,作為定位器來constraint 中間的IK ctrl。




這邊要注意,必須放進首尾IK ctrl的反向group裡面,這樣在座位移時rig才不會壞掉。






接下來是另一個很重要的地方,就是要把這兩個group的軸心match到中段IK ctrl上,透過match pivot功能,如果不這麼做,等等再做constraint時,會出現奇怪的位移!(主要是point constraint)。








然後用這兩個group對中段的IK ctrl上層group做point+orient constraint,這樣就可以跟隨頭尾的IK ctrl。




然後所有牽涉到Orient Constraint都建議切換到Shortest模式,比較不會出錯。





最後就是透過Driven Key來調整跟隨的強弱。

Follow End為1時,就完全跟隨最上層的IK ctrl,反之就是跟隨最下層那個!







然後Follow End的數值可以這樣分配,比較平均。





最終效果就是這樣,旋轉本身不會有效果,只是一個跟隨的功能而以!!




S6.整體Scale功能+Space Switch




最後是把Scale跟Space  Switch功能加上,Space Switch功能比較單純,就是讓第一個IK Ctrl跟隨世界座標或是local旋轉。


首先先整理一下到目前為止的group,首先新增兩層Global ctrl,把之前製做好的IK FK ctrl以及bind joint全部放進去,除了ikHandle跟IK CV以外。





然後新增兩個group,用來定位space swatch,一個放到手個IK ctrl上層的FK ctrl底下,另一個放到global ctrl底下,一樣要match pivot到首個 IK ctrl上。






然後用這兩個group對IK ctrl上層group做oreint constraint,接著用Driven Key搭配自定義Attr來切換兩個定位group的權重就完成了。









最後效果會長這樣。




最後是縮放效果,非常簡單,只要把curve info的Arc Length跟global ctrl的scale任一軸向接到multiply節點上,使用divide模式,就可以了!

只接上一個軸向是因為,我想大部分的rig都不會讓animator只縮放單一軸向,這樣很容易出問題! 所以scale的時候一定是三軸一起!

這是因為當global ctrl縮放時,Arc Length也會相對的變化,如果scale-->2 那麼Arc Length就會變成24,這樣兩個數值相除下來還是12,也就是原始的長度,最後再把這個數值接到之前創建的IK Stretch bld節點,就可以永遠得到原始的Arc Length,讓後面所有的節點都得到正確比例!









完成之後就可以自由縮放!

以上就是關於這個workshop的IK spline內容!
















張貼留言

0 留言