2012年2月10日 星期五

使用 mel/python 取得 manipulator 的位子





setToolTo "Move";
float $piv[0] = `manipMoveContext -q -p "Move"`;


這一招主要是用來取得 被選取的元件 (selected component)  的中心位子(pivot position).

譬如說我們想縮放控制器,但又不希望改到scale值(因為已經設定好 constraint/driven key 的連結)。那一般來說都會用 cv 模式去把那些 cv 點縮放。但如果要一次處理很多個控制器的時候(而且要是同一個縮放值),就需要知道每個控制器cv的中心位子。這時候就可以用類似以下的程式來快速達到這件事。

mel 範例:
string $tmp[] = `ls -sl`;

for($ctl in $tmp)
{
    select -r ($ctl+".cv[*]");
    setToolTo "Move";
    float $piv[0] = `manipMoveContext -q -p "Move"`;
    scale -r -p $piv[0] $piv[1] $piv[2] 0.5 0.5 0.5;
}

select -r $tmp;




pymel 範例 :
import pymel.core as pm
sel = pm.ls(sl=1)
for ctl in sel:
    pm.select(str(ctl)+'.cv[*]',r=1)
    pm.setToolTo('Move')
    pivotPos = pm.manipMoveContext('Move',q=1,p=1)
    pm.scale([0.5,0.5,0.5],r=1,p=pivotPos)
pm.select(sel,r=1)

那為何不直接用物件的pivot  (xform -q -ws -rp) 來當 scale 的 pivot 呢 ? 原因很簡單,就是因為控制器的 pivot很多時候都不是在中心位子!

沒有留言:

張貼留言