3DCGbook

映像プロダクションに所属しています。主に毎日のアウトプットを配信していこうと思います。

Mayaでの"スクリプト力"を向上させる提案

今日、飲み会でふと聞かれたことなので、
自分なりのスキルアップ方法をまとめてみます。
あくまで自分なりのです。

僕の場合は、
・よく使うコマンドを同じように使わない、フラグの意味は全て理解する
・別の方法で同じことができないかどうかを考えてみる
・コードの中でまとめられるところがあればまとめてみる
・Mayaのノードリファレンスをよく見て理解する

よく使うコマンドを同じように使わない、フラグの意味は全て理解する

僕がかなーり昔のコードを紹介します。
これは駄目なコードの例です。特に後者(笑)

import maya.cmds as cmds

# 階層を取得する
cmds.select("root",hierarchy=True)
nodes = cmds.ls(selection=True)

# shapeを取得する
node = cmds.ls(selection=True)[0]
cmds.select(node)
cmds.PickWalkDown()
node = cmds.ls(selection=True)[0]

selectでしか階層が取れない!と思っていた時代があります。
ただlsっていいフラグがたくさん揃っているんですよね。
この頃はドキュメントをあまり見ない、同じコードしか書けない定型スクリプター(?)って感じでした。
以下のようにした方が精度が高いですね。

# 階層を取得する
nodes = cmds.ls(selection=True,dag=True)

# shapeを取得する
nodes = cmds.ls(selection=True)
shapes = cmds.listRelatives(nodes,shapes=True)

別の方法で同じことができないかどうかを考えてみる

最近の記事でやった文字列の連結方法とかですね。

# transform.rotate という文字列をどう作るか
node = "transform"
attr = "rotate"

# type A
print '.'.join([node,attr])

# type B
print "%s.%s" %(node,attr)

# type C
print node + '.' +attr

コードの中でまとめられるところがあればまとめてみる

よくMayaでやるのはshapeを取得することです。
shapeからコネクションを辿るのが多いのでよく使います。
なので以下のようにshapeを取得するコマンドだけを抜き出しておきます。
そして自分なりの便利スクリプト集!みたいなのをたくさん作っていけるといいと思います。

def getShapes(*args):
    nodes = cmds.ls(selection=True)
    shapes = cmds.listRelatives(nodes,s=True)
    return shapes

# attributeをセットする例
[cmds.setAttr("%s.primaryVisibility" %shape,False) for shape in getShapes()]

Mayaのノードリファレンスをよく見て理解する

これはかなり重要で、ひっそりと存在するアトリビュートは割とあります。
例えばtextureノードのoutSizeとかは良い例ですね。
解像度がMaya上で取得できるのは非常に便利です。

またアトリビュートの意味もだいたいは書かれているので
よく使うノードのアトリビュートの意味を一度見てみると新たな発見があると思います。

>> Maya2015 Node Reference

あとがき

後半は眠くなり適当になりましたが、
どんなものでも基本に立ち返ることこそが一番の技術向上になると思います。
普段やっていることに関して常に振り返りをする…そうすることで新しい発見があるかも?
それでは。