RECENT ENTRY
ARCHIVES
こんにちは!
Development Div./Rig Dept. 所属のIです。
筆者は毎年この時期は花粉に悩まされています…が、
皆様はいかがお過ごしでしょうか?🤧
さて、今回は『Mayaのコンストレインを
効率化するスクリプト』をご紹介します!
アニマのリグ作業は基本的に、
mGearでカスタムステップを用いたワークフローです。
そのため、mGearコンポーネントだけではセットアップできない部分を
全てスクリプトに落とし込む必要があります。
コンストレインもその一つなのですが、過去には知識不足から
無駄な工程を多く含んだスクリプトを書いてしまったことも…😢
そこで今回は、そのリベンジも兼ねてフリップ対策を学びつつ、
汎用性が高く誰でも使いやすいスクリプトの作成を目指しました💪
※このスクリプトは複数の親からのコンストレインを適用するケースを想定しているため
「”parentA~Z”と”childA~Z”を1対1でコンストレインしたい」等の状況には不向きです。
興味のある方はお使いのスクリプトエディターに
コピー&ペーストしてご活用ください◎
————————————————–
import pymel.core as pm
def addNPO_alt(targetNode):
targetNode_p = pm.listRelatives(targetNode, p=True)
npoNode = pm.group(em=True, n=targetNode+”_npo”)
if len(targetNode_p) != 0:
pm.parent(npoNode, targetNode_p[0])
pm.matchTransform(npoNode, targetNode, pos=1, rot=1, scl=1)
pm.parent(targetNode, npoNode)
pm.select(cl=True)
# interpType -> 0 == No Flip, 1 == Average, 2 == Shortest, 3 == Longest, 4 == Cache
# skip -> None, “trans”, “rot”
def interpConst(parentList, childList, weightList, interpType=1, skip=None):
for child, weight in zip(childList, weightList):
tagC = pm.PyNode(child)
tagC_p = pm.listRelatives(tagC, p=True)
constC = pm.group(em=True, n=tagC+”_constC”)
if len(tagC_p) != 0:
pm.parent(constC, tagC_p[0])
pm.matchTransform(constC, tagC, pos=1, rot=0, scl=0)
pm.parent(tagC, constC)
addNPO_alt(constC)
for parent in parentList:
tagP = pm.PyNode(parent)
if len(pm.ls(tagP+”_constP”)) == 0:
constP = pm.group(em=True, n=tagP+”_constP”)
pm.matchTransform(constP, tagP, pos=1, rot=0, scl=0)
pm.parent(constP, tagP)
addNPO_alt(constP)
else:
constP = pm.PyNode(tagP+”_constP”)
const = pm.parentConstraint(constP, constC, mo=True)
pm.setAttr(const.interpType, interpType)
parentLength = len(parentList)
for i, w in zip(range(parentLength), weight):
pm.setAttr(const+”.w{}”.format(int(i)), w)
if skip == “trans”:
pm.disconnectAttr(const+”.ctx”, constC+”.tx”)
pm.disconnectAttr(const+”.cty”, constC+”.ty”)
pm.disconnectAttr(const+”.ctz”, constC+”.tz”)
elif skip == “rot”:
pm.disconnectAttr(const+”.crx”, constC+”.rx”)
pm.disconnectAttr(const+”.cry”, constC+”.ry”)
pm.disconnectAttr(const+”.crz”, constC+”.rz”)
parentList = [“parentA”, “parentB”, “parentC”]
childList = [“childA”, “childB”, “childC”, “childD”, “childE”, “childF”, “childG”, “childH”, “childI”]
weightList = [[0.88, 0.08, 0.04], [0.73, 0.18, 0.09], [0.57, 0.29, 0.14],
[0.41, 0.39, 0.20], [0.25, 0.50, 0.25], [0.20, 0.39, 0.41],
[0.14, 0.29, 0.57], [0.09, 0.18, 0.73], [0.04, 0.08, 0.88]]
interpConst(parentList, childList, weightList, interpType=0, skip=None)
————————————————–
【スクリプトの使い方】
編集が必要な部分は、parentList = [“parentA”, “parentB”, “parentC”] の行からです。
1. 親ノードの設定
parentList には、コンストレインの「親」となるノードの名前をリストで記入する。
1つ以上のノードを設定でき、多くの親ノードを指定することも可能です。
2. 子ノードの設定
childList には、
指定した親ノードから影響を受ける 「子」 ノードの名前をリストで記入する。
こちらも0でなければ個数の制限はありません。
3. ウェイトの設定
weightList には、親ノードから受ける影響の強さ(ウェイト)を設定する。
このリストは 「親の数 × 子の数」 の多重リストになっており、
parentList に記載した順番と対応させる必要があります。
4. interpType(回転の補間タイプ)の設定
interpType の値を変更することで、
コンストレインの回転補間の挙動を調整できます。
デフォルトは 1(Average)ですが、
おすすめは「0」(No Flip) です。
特にフリップが起こりにくいため、安定した挙動が期待できます。
このスクリプトでは、コンストレインを適用する
ノードの軸が揃う様にワールド軸のnullが生成されるため、
デフォルトの 1(Average) でも180度までは概ね問題ありません。
5. skip(除外設定)の活用
skip には、None・”trans”・”rot” の3種類があります。
None(デフォルト) → すべてのコンストレインを適用
“trans” → 移動のコンストレインを無効化
“rot” → 回転のコンストレインを無効化
あまり使用する機会は少ないかもしれませんが、
特定の動作を抑制したい場合にご活用ください。
————————————————–
以上、Mayaのコンストレインを効率化するスクリプトの紹介でした!
皆様の参考になれば幸いです:)