顯示具有 rigging 標籤的文章。 顯示所有文章
顯示具有 rigging 標籤的文章。 顯示所有文章

2015年8月5日 星期三

使用 dgProfiler 來檢測 rigging 的瓶頸

動畫師永遠會抱怨你的 rig 太慢, fps 只有 99.9999 等等的問題 ,所以很多時候你就得找個辦法加速你的 rig 了。首先最快的解決方法當然是直接出錢幫你的動畫師升級電腦,其次是找這位大神幫你加速:
如果這兩個辦法你都辦不到的話 那就只好自己乖乖想辦法加速了。其中一個方法就是透過 dgProfiler 檢測 rigging 的瓶頸到底在哪。 dgProfiler 是 maya 近年來(沒記錯的話是 2014 或 2015)增加的一個功能。首先要透過 plug-in manager 把 dgProfiler plugin  load 起來。




接下來你要準備一個角色有被keyframe 過的檔案,大概 50-60 frame 就夠了,不過記得盡量要全身都有動作的檔案會比較理想。 (以下這測試角色是 Mathilda Rig )



然後大開 DG Profiler 的 ui, 也不需要調整太多參數,大概只要把Number of Runs 改為 2~3 就好了(目的是要讓這程式重複跑個幾遍避免一些誤差)。按下 Profile! 這工具就會開始 playback 你的場景,跑 n 次(number of runs) 之後會顯示出一些數據。





你可以把這數據導出成一個 cvs 檔,再用 excel 或 openoffice 或 LibreOffice這類的 spreadsheet editor 來顯示以及編輯這個檔案,找出整個 rig 的瓶頸。



以這個測試rig來說,主要的兇手大概就是CT_headLattice_dfm (lattice) 還有一些 skinCluster. 如果有辦法加速這幾個 nodes 的話,就可以讓整個 rig 的數度再提升一些。不過說實話啦,有時候真的升級電腦是個快速又省時間(也等於省錢)的方法!

2013年9月11日 星期三

把物件軸心移到原點 (0,0,0) 的位子





以下小程式是用來把物件的 軸心 / 中心點 快速移到場景原點 (0,0,0) 的位子.


MEL:
 {  
   string $sel[]=`ls -sl`;  
   for($each in $sel)  
     xform -ws -piv 0 0 0 $each;  
 }  


Pymel:
 import pymel.core as pm  
 selected = pm.ls(sl=1)  
 for eachSel in selected:  
   pm.xform(eachSel,ws=True,pivots=[0,0,0])  




2012年9月1日 星期六

快速建立 blendshape 小程式




Maya 的 Blendshape 功能 (Animation Menu --> Create Deformers --> Blend Shape) 有個不方便的地方就是 : 設定裡沒有一個選項是可以讓 weight 的預設值為 1 的 ! (或是其時有但我從沒發現過?!?)

於是在這我提供一段小程式來協助大家快速建立 blendshape 並且把 weight 設為 1 :

MEL:

{

 $origin = "world";

$blendNode = `blendShape -origin $origin`;

setAttr ($blendNode[0]+".weight[0]") 1;

}

  



pymel:

import pymel.core as pm
origin = 'world'

blendNode = pm.blendShape(origin=origin)[0]

blendNode.weight[0].set(1)


若 blendshape 座標想從世界座標改為物件相對座標,那就把 origin 從 "world" 改為 "local"




2012年2月13日 星期一

把曲線 軸心 ( pivot ) 移動到 cv[0] 的位子



mel 程式碼:
{
  string $selected[] = `ls -sl`;
  for($each in $selected)
  {
    float $pos[] =`pointPosition ($each+".cv[0]")`;
    xform -ws -piv $pos[0] $pos[1] $pos[2] $each;
    
  }
}

這工具會用在哪呢 ? 例如編輯頭髮曲線時就有可能會用到,因為軸心若是設定在毛根的部位會比較方便做縮放或旋轉的動作。

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很多時候都不是在中心位子!

2011年7月11日 星期一

Spline IK 伸縮 手動架法




Spline IK 伸縮功能可以說是骨架設定裡一個很重要的元素。相信要設定這個功能不只有一種作法,我在這就分享一種算是"比較間單"的方法吧:



1. 建立骨架結構





2. 綁上 Spline IK




3. 選取新增出來的 spline 取線 (curve) , 然後在 script editor 執行
arclen -ch 1
;





4. arclen 這指令會生出一個 curveInfo node (在此稱為 curveInfo1 ) , 目的是為了量測曲線長度。




5. 在 script editor 執行
createNode multiplyDivide;

執行後會出現一個 multiplyDivide node (在此稱為 multiplyDivide1)。





6. 打開 connection editor, 然後把 curveInfo1arcLength 屬性 連結到 multiplyDivide1input1X.





7. 在屬性編輯室窗(attribute editor)裡把 multiplyDivide1Operation 設為 Divide, 然後把 Input1X 的 數值 複製到 Input2X 上。



8. 再執行 createNode multiplyDivide , 把另一個 multiplyDivide node 產生出來 (在此稱為 multiplyDivide2)。




9. 把 multiplyDivide1outputX 連結到 multiplyDivide2input1X




10 . 把最上層的joint (在此稱為 joint1) 的 translateX 數值複製到 multiplyDivide2input2X 裡,並把 operation 設為 multiply




11 . 把 multiplyDivide2outputX 連結到 joint1translateX



12. 對 spline ik 裡的所有 joint 重複執行 步驟 8 ~ 11。執行完的結果會類似以下的 hypergraph。 基本上到此 伸縮 spline IK 的 功能已經完成了。



13 .接下來我們可以使用 curve cluster 來控制 spline IK curve 的 行為。



當然還有一些其他要考慮的地方和多做的步驟,例如讓他可以一致的放大縮小。但如果先不考慮這部份的話,剩下來的問題就是看你要用什麼方式控制那些 cluster handle.
當然,因為這些步驟都有點繁瑣,所以當然會有很多人寫 mel / python 程式來自動產生這功能。 我若網路上有找到簡單又不錯用的程式,會在此跟大家分享。

2011年5月12日 星期四

[小程式] 在兩個物件中綁一條示意曲線


以下的小程式可以把一條曲線綁(constrain)在兩個物件的基準點之中,可用來當做視線或polevector方向的示意工具。

使用方法:先選兩個物件,然後執行以下的 MEL 或 pymel 程式。


MEL 版本 :
{
string $sel[] = `ls -sl`;
if(size($sel)>1)
{
string $startPoint = $sel[0];
string $endPoint = $sel[1];
string $distCurve = `curve -d 1 -p 0 0 1 -p 0 0 0`;
string $startCluster[]= `cluster -rel ($distCurve+".cv[0]")`;
string $endCluster[]= `cluster -rel ($distCurve+".cv[1]")`;

pointConstraint $startPoint $startCluster[1];
pointConstraint $endPoint $endCluster[1];
}
}


Pymel 版本 :
from pymel.core import *

sel = ls(sl=1)

if len(sel)>1:
startPoint = sel[0]
endPoint = sel[1]

distCurve = curve(d=1,p=[(0,0,1),(0,0,0)])
startCluster = rename(cluster(distCurve.cv[0],rel=1)[1])
endCluster = rename(cluster(distCurve.cv[1],rel=1)[1])

pointConstraint(startPoint,startCluster)
pointConstraint(endPoint,endCluster)




使用範例:

2011年4月27日 星期三

快速把 translate / rotate 歸零 ( scale 歸一)



這一段小程式主要是用來快速把 translate, rotate, scale 值歸回預設值,不需要特別打開 channel box 或 attribute editor只為了要做這件事。 (對 建模,骨架設定,動畫等等都蠻有幫助的)。

mel 程式 :
{
string $sel[]=`ls -sl`;
string $resetAttrs[]={"translateX","translateY","translateZ","rotateX","rotateY","rotateZ"};
for($each in $sel)
{
for($attr in $resetAttrs)
if (`getAttr -k ($each+"."+$attr)`)
{
catch(`setAttr ($each+"."+$attr) 0`);
}
}

$resetAttrs2 = {"scaleX","scaleY","scaleZ"};
for($each in $sel)
{
for($attr in $resetAttrs2)
if (`getAttr -k ($each+"."+$attr)`)
{
catch(`setAttr ($each+"."+$attr) 1`);
}
}

}
pymel 版 :
from pymel.core import *

zeroList = ['tx','ty','tz','rx','ry','rz']

oneList = ['sx','sy','sz']

reset = ls(sl=1)

for r in reset:
for attr in zeroList:
try:
setAttr('%s.%s'%(r,attr),0)
except RuntimeError:
pass

for attr in oneList:
try:
setAttr('%s.%s'%(r,attr),1)
except RuntimeError:
pass



如何設定成快速鍵 : http://maya-tricks.blogspot.com/2009/04/blog-post.html

2011年2月16日 星期三

使用 cluster 來控制/編輯 曲線 (curve)

這一招最常用來 控制 spline IK 的 曲線 。不像一般的 IK, 產生 Spline IK 後 我們是無法使用 它的 IK Handle 來移動骨架 ,而是要編輯它的曲線。可是要編輯曲線的 cv 點很麻煩,而且也無法做 constraint 之類的事,所以把 cv "轉成" cluster 可以增加 Spline IK 的控制性。

執行步驟:
1. 選取曲線.
2. 在 surface 的 menu 上 執行 Edit Curves -> Selection -> Cluster Curve.


參考影片:


2010年11月20日 星期六

Maya 2011 新功能 : Point on Poly Constraint



Point on Poly Constraint 可以把 一個物件緊貼 (constrain) 在另外一個 polygon模型的點、線、或面上。 一但constraint 成功之後 這物件就會一直黏貼在主物件的身上,不管它怎麼甩、怎麼動都OK。這新功能可以說是部分取代了以前常用的 rivet tool (或是 maya hair follicle ) constraint 的做法。


Constraint 使用方法 : 先選取 poly模型上的一個點、線、或面,然後再加選一個要被 constraint的物件。選完再執行 Animation Menu 裡的 Constrain -> Point on Poly。


Point on Poly Constraint 效果可以參考以下的影片:


2010年11月7日 星期日

在模型點或線上產生 Joint


這小工具尤其適用於臉部表情rig製作。當你想把幾個Joint布置在嘴部或眼部的上下方,就可以用它來快速把 Joint 產生出來。

使用方法 :
  • 先選一個或多個點/線,然後執行以下的程式。選點的話,Joint會產生在點的位子上。選線的話,Joint會產生在線的中間位子。

{
$verts=`filterExpand -ex 1 -sm 31`;
$edges = `filterExpand -ex 1 -sm 32`;

for($vtx in $verts)
{
select -cl;
$pos = `pointPosition -w $vtx`;
$newJoint = `joint -p $pos[0] $pos[1] $pos[2]`;
}

for($edge in $edges)
{
select -cl;
string $toVtx[]=`polyListComponentConversion -fe -tv $edge`;
$toVtx = `ls -fl $toVtx`;

$p0 = `pointPosition -w $toVtx[0]`;
$p1 = `pointPosition -w $toVtx[1]`;

float $center[];
$center[0] = ($p0[0]+$p1[0])/2;
$center[1] = ($p0[1]+$p1[1])/2;
$center[2] = ($p0[2]+$p1[2])/2;

$newJoint = `joint -p $center[0] $center[1] $center[2]`;
}

}

2010年11月6日 星期六

模型已經上好骨架, 但要修改 UV ,怎麼辦?





假設有個模型已經上完骨架,weight也已經 paint 好了,好死不死發現 UV有些地方要修改甚至要重拆,怎麼辦?

這時候就可以按照以下的步驟把 新的UV順利套到原本 rig 好的模型身上:

  1. 我們假設這模型叫做 MeshA 。 先把它複製一份(假設叫 DupMeshA)。



  2. 在 DupMeshA 上 把 UV 拆好。



  3. 使用這一篇文章裡的成是把 DupMeshA 的 UV 轉到 MeshA 上(或你如果是用 Maya2008 以前的版本的話可以直接使用 Mesh->Copy Mesh Attributes->UV sets 達到同樣的目的)。在 MeshA 的 input上會產生一個新的 node叫 polyTransfer。



  4. 把 DupMeshA 的 history 殺掉。



  5. 殺掉 DupMeshA。步驟完畢。

2010年10月16日 星期六

如何把 soft selection 轉換成 cluster





很多時候 做臉部表情的 rig 時都會需要用到 cluster 來控指變形範圍或當 constraint 使用. 以下的程式可以把 polygon 的 soft selection 轉換成一個 cluster. 個人是覺得還蠻好用的,所以在此分享給大家. 這段程式是從 這網頁 轉貼過來的, thanks to THNKR for providing the code.



轉換程式:
import maya.OpenMaya as om
import maya.cmds as mc

richSel = om.MRichSelection()
richSelList = om.MSelectionList()

om.MGlobal.getRichSelection(richSel)
richSel.getSelection(richSelList)




cluster = mc.cluster( rel=True )
clusterSet = mc.listConnections( cluster, type="objectSet" )

for idx in range(richSelList.length()):
    dag = om.MDagPath()
    component = om.MObject()
    richSelList.getDagPath(idx, dag, component)
    componentFn = om.MFnSingleIndexedComponent(component)

    meshName = dag.partialPathName()
    
    for cidx in range(componentFn.elementCount()):
        weight = componentFn.weight(cidx)
        v = componentFn.element(cidx)
        w = weight.influence()
        vtx = (meshName+'.vtx[%d]') % v
        mc.sets(vtx, add=clusterSet[0])
        mc.percent(cluster[0], vtx,  v=w )

mc.select(cluster)


這是個 python 程式, 所以要貼在 script editor 裡的 python tab 裡, 然後可以用 File->Save Script to Shelf 把它存成一個 shelf 按鈕.

2010年9月6日 星期一

2010年1月30日 星期六

調整骨架在畫面上的大小 (joint/skeleton display size)


到 menu 上的 Display->Animation->Joint Size 調整即可.
這招只是調整顯示上的大小,並不影響骨架結構或 scale.






2009年11月23日 星期一

rivet 工具 : 把 locator constraint 在 模型點上




rivet 是個很古老(2001年)的工具,可是還蠻好用的. 它功能是把一個 locator constraint 在 模型的點上. 這又有什麼用途呢?例如我們想讓一個物件緊緊得貼在另外一個物件點上,就可以使用這工具.以下是rivet constraint 使用結果:


把一個球constraint 在 ncloth 物件的點上


這工具要如何安裝與及使用的呢?

安裝:
1. 下載 rivet工具
2. 把 rivet.mel & rivetSetup.mel 放到 mel script 目錄下,例如 : C:\Documents and Settings\rainmaker\My Documents\maya\scripts
3. 把 rivet.bmp 放到 icon 目錄下,例如: C:\Documents and Settings\rainmaker\My Documents\maya\2009\prefs\icons
4.打開 maya,然後執行 "rivetSetup" . 按鈕將會出現在 shelf 上. 安裝完畢.

使用:
1. 選 polygon 裡接到一個點的兩條線, 然後按下案鈕. locator 將會出現在點上(或那兩條線的中間),
或選nurbs 的 surface point, 然後按下案鈕. locator 將會出現在點上.
2.然後我們就可以把某個物件 parent constraint 在這 locator 上了!

2009年9月19日 星期六

Maya Asset 介紹



Maya 2009 引進了一個對production pipeline 特有幫助的個功能叫 "Asset". 聽起來很普通,可是別小看它. Asset 這概念算是把程式語言裡面的 "class" 或 "object"引進了Maya.它可把rigging與物件複雜的結構簡單化,把沒必要的屬性隱藏起來.它也可以用來協助動畫師的一些製作過程.
拿摩托車與自行車這兩種物件做個比喻好了.兩種車是用不同的零件組成的,但操作上有些地方很類似,例如剎車,轉彎等等. 那使用 asset時你就可以在 bicycle & motorcycle 的物件上定義同樣的 attributes叫 brake (剎車), turn (轉彎)等等. 這樣做會有什麼好處呢?
  • 對於動畫師來說,他就可以有一個共同的介面來做這些物件的動畫.當他調bicycle 的 brake 時他會期待跟調 motorcyle 的brake 有同樣的效果.
  • 他可以把這些 attributes 從 bicycle 複製到 motorcyle, 讓它們做同樣的動作.
  • 當有一天導演說他想把 bicycle通通換成motorcyle 的話,動畫師就可以直接把 bicycle的 reference 替代成 motorcycle, 而出來的效果是一樣(或很類似) 的.
光這幾點你應該就可以感受到Asset的強大功能了. 但因為它算是一個新的概念,所以使用的人不算多,也有多人不太懂他的用處. 於是在 The Area 裡有一位 叫 Steven Roselle 的 Autodesk 員工寫了關於 Maya Asset 的介紹.以下是 該文章的連結( 裡頭 有 video 教學):

Maya Assets (Part 1 : Creating and Managing Assets)
Maya Assets (Part 2 : Working With Existing Assets)

2009年4月9日 星期四

如何設計一個好的Rig(角色控制器)

有一位叫 Chihming 的動畫師寫了一篇關於如何設計 rig 的文章.小弟覺得很值得推薦,所以在此貼上該文章的連結.

"不管你叫它rig,set-up還是控制器,它是CG動畫師用來控制角色的工具,一個好的rig當然不能保證會讓動畫師做出來的動畫更棒,更有水準,不過 rig設計得好的話,保證能夠讓動畫師工作更快,更有效率,也能有更多時間來polish動畫,因而更有機會作出非常棒的作品。"

完整內容