2012年6月3日 星期日

【rig筆記】關於IK/FK無接縫切換script

原文:http://mymamaya.blogspot.tw/2011/08/character-rigging.html

在某次rig的時候無意間的看到了這篇文章
其實他非常適合喜歡同時切換IK/FK來做Animation的Animator
((好像繞口令...

而我將他的教學竊取整理出來
用自己的想法整理了一下筆記

以下是一點點的心得報告。請見!



再做Animation的時候,大部分人喜歡用IK手,畢竟方便
手軸帶動整個手臂,可以省去不少時間
但是像一些單純的揮手或是搖擺,希望藉由肩膀來驅動整個手臂的時候
FK就顯得相對好用

針對喜歡兩個方法互用的人
無接縫的切換就顯得重要。

Q:何謂無接縫切換

A:在原先IK的設定裡面,就有提供最簡易的IK/FK切換法,但是當切換的時候,會出現位差
    而無接縫切換就是,能夠解決這個問題的好方法....


((聽不懂嗎?
((那就讓我們繼續看下去......



在開始的時候我們先創建了三跟骨頭,分別代表上手臂、下手臂、手掌,中間凸起的部分是手肘(此為上視圖)

點選IK,在設定裡頭,ik分為RP跟SC
這邊我們使用的設定是ikRP,如上圖

RP跟SC的差別在哪!?
我的解釋是可旋轉關節跟不可旋轉關節
在做手部或是腳的IK時,我們會希望能夠控制手軸或是膝蓋的旋轉
所以使用ikRP
至於ikSC的實際使用時機....哈哈哈說真的我也還不知道
或許哪天搞清楚的時候,在分享給大家

anyway
創建完IK在骨頭上後,我們會看到channel Box這邊除了一般的位移旋轉資訊之外
另外也看到了底下的幾個channels

放大一點來看......

有offset、Roll、Twist、IK Blend
((大家應該都知道兇手是誰了!!??
特別注意的是IK Blend這個選項

當數值是1的時候
IK就是很正常的IK
被手腕的部分逆向驅動
移動手腕,整隻手臂都動了!

但當我們把ik Blend歸0的時候
就無法移動IK

未叮未當...
這時就只能轉動骨頭,當作FK來使用了



所以上面其實就是最基礎的IK與FK
分享結束?


但是無奈的是,在架設完控制器以後會出現位差
沒有辦法做完全切換
我提供兩張圖讓大家參照
圖二

大家可以發現,旁邊IK/FK的切換扭轉過來以後
IK留在原地(紅色的十字),而切到FK以後手臂又跳回來了!

所以我們才需要使用
IK/FK的切換mel



(控制器製作中......)


製作好FK以及IK的控制器以後
我們就可以開始進行IK/FK切換的mel製作


在製作mel以前我們需要設置兩個locator
分別把locator吸附在手腕關節處並且constrain parent給手腕



以及把locator2吸附在PV控制器上,然後把他constrain parent給上手臂


如果你忘記constrain parent是什麼
可以看這裡(延伸閱讀:Constrain魔法大全)

為什麼要設置這兩個控制器呢?
因為IK/FK的轉換其實就是利用這兩個locator當作定位點
在手臂在移動的過程中,素質會被記錄在locator上面
而我們就透過底下的mel,將這些素質富與給IK/FK的切換


mel如下:
//代表解釋
((提摸雞哥哥說,最好不要有中文出現,所以大家記得貼上以後要把中文殺掉
知道意思就好。
---------------------------------------這是分隔線---------------------------------------



//fk to ik//
//Left Arm ik controls--> fk controls snap

$IK_t = `xform -q -ws -t locator2`;
//尋找locator2的位移資訊
xform -ws -t $IK_t[0] $IK_t[1] $IK_t[2] L_IK_arm_controller;
//把locator2的translate資料轉移到IK手腕控制器

$IK_ro = `xform -q -ws -ro L_FK_wrist_controller`;
//尋找fk 手腕控制器的rotate資訊
xform -ws -ro $IK_ro[0] $IK_ro[1] $IK_ro[2] L_IK_arm_controller;
//把fk手腕控制器的rotate資訊轉移到IK手腕控制器

$IK_elbow_t = `xform -q -ws -t locator1`;
//尋找fk手軸定位器的translate資訊
xform -ws -t $IK_elbow_t[0] $IK_elbow_t[1] $IK_elbow_t[2] L_arm_PV_controller;
//把fk手軸定位器的translate資訊轉移到IK手軸控制器

setAttr "IK_FK.IK_FK" 0;
//把目前的fk切換成ik//

}

else if ($switch == 0)
//如果不是這樣的話,改執行下面的指令

{

//ik to fk//
//Left Arm fk controls--> ik controls snap

$FK_arm_ro = `xform -q -ws -ro L_shoulder`;
//尋找ik上手臂骨骼的rotate資訊
xform -ws -ro $FK_arm_ro[0] $FK_arm_ro[1] $FK_arm_ro[2] L_FK_shoulder_controller;
//把ik上手臂骨骼的rotate資訊轉移到fk肩膀控制器

$FK_elbow_ro = `xform -q -ws -ro L_elbow`;
//尋找下手臂骨骼的rotate資訊
xform -ws -ro $FK_elbow_ro[0] $FK_elbow_ro[1] $FK_elbow_ro[2] L_FK_elbow_controller;
//把下手臂骨骼的rotate資訊轉移到fk手軸控制器

$FK_wrist_ro = `xform -q -ws -ro L_wrist`;
//尋找手腕骨骼的rotate資訊
xform -ws -ro $FK_wrist_ro[0] $FK_wrist_ro[1] $FK_wrist_ro[2] L_FK_wrist_controller;
//把手腕骨骼的rotate資訊轉移到fk手腕控制器

setAttr "IK_FK.IK_FK" 1;
//把目前的ik切換成fk//




---------------------------------------這是分隔線---------------------------------------

紅字是必須替換成你命名的控制器

這上面寫的IK_FK.IK_FK的意思是,因為我的ik/fk控制器的名稱叫做"IK_FK"
而channels的名稱也叫做IK_FK
當我在從fk→ik的時候
打開script會看到顯示


如果我是ik→fk的話

這樣大家應該就可以了解這個mel的作用了
而我們實際使用看看~

先把手臂移動到頭頂做出敬禮的動作...
輸入我們的mel然後按一下enter
YA!大成功!!
IK順利的轉換成FK了
而且位置一模一樣!!
這樣就可以實現IK key動作,轉換成FK繼續key的方法了


我們也可以把這個mel全選
拖拉到上排的工具列上面變成按鈕
like this!

mel的下載
原站已經有提供了~這邊就不再提供。


不過要特別注意的是
轉換的關鍵禎要記得設key,不然animation會被影響到~

據說這樣的控制方法似乎有他的bug存在?
這個我不是很確定......
((因為我是IK控...

大家可以研究看看,如果有甚麼新發現大家可以一起分享 : D

以上是小弟的小小研究心得
歡迎大家一起討論進步 : D

以上


by 偷尼  2012/6/3

3 則留言:

  1. 回覆
    1. 沒想到這麼多年後,還能夠幫助到你!
      真是太感恩了~

      刪除
  2. 滿有用的~~
    如果說BUG
    就是 MOCAP 骨架 elbow FK rotate 不會只單純有rotate X 就會出現錯唔

    回覆刪除