【Maya】ノードの取得方法色々


選択階層以下のメッシュをすべて取得

例えば以下のような階層の場合

まずメッシュは2つのノードの親子で出来ています。
親はtransformノードで移動や回転スケールなどを設定できます。
その子にmeshノード、ポリゴンのシェイプ情報があるノードです。

アウトライナではシェイプは表示されていないので一つのノードに見えますがメッシュは2つのノードが基本です。
階層以下のtransformノードをすべて取得して、子にmeshノードがあるものだけを条件にすればメッシュは取得できます。

# lsコマンド dag:階層以下のノードすべて取得 l:フルパスで取得 typ:transformノードのみ
selection = cmds.ls(sl=True, dag=True, l=True, typ="transform")
meshes = []
for sel in selection:
    # listRelativesコマンド s:シェイプを指定 typ:meshノードのみ
    if cmds.listRelatives(sel, s=True, typ="mesh"):
        meshes.append(sel)

# Result: ['|body|mesh|pCube1', '|body|mesh|pCube2', '|body|mesh|pCube3', '|body|mesh|pCube4', '|body|mesh|pCube5', '|body|mesh|pCube6']


特定のヒストリーノードを取得

例えばスキンバインドしたメッシュのヒストリからSkinClusterノードだけ取得したい場合

listHistoryコマンドでヒストリーノードを取得できますが、フラグにタイプを設定できないので特定のノードだけを取得できません。
そこでlsコマンドを使用してタイプを指定することで特定のノードを取得できます。

selection = cmds.ls(sl=True, l=True)
history = cmds.listHistory(selection)

# ヒストリーノードの中でskinClusterノードだけ取得
skin_cluster = cmds.ls(history, typ="skinCluster")

if skin_cluster:
    print(skin_cluster[0])

取得した変数の中はリストになっていることに注意しましょう。



最上位階層のノードを取得

選択したノードから一番上の親を取得したい時に使える方法です。

こういう場合は決まった数を持たないループになるのでwhileなどを使用すると思いますが、今回は再帰関数を使って取得する方法を書きます。

再帰関数は、関数内でその関数を呼び出すことによってループする関数のことです。特定の条件になったら最初の呼び出した関数に戻ってきて値を返してくれます。

def get_top_node(node):
    # ノードの親を取得 p:親取得 f:フルパスで取得
    parent_node = cmds.listRelatives(node, p=True, f=True)

    if parent_node:
        # 親があればこの関数に再度に渡してその親を取得
        top_node = get_top_node(parent_node)
    else:
        # 親がなければ自身を返す=トップノード。このノードが最初の関数へ届けられる
        return node

    return top_node
    

selection = cmds.ls(sl=True, l=True)
top_node = get_top_node(selection)

処理の流れが複雑になりますがしっかりと戻り値が返ってきます。

①get_top_node(node) ← joint5
↓ joint5の親(joint4)があったので関数に渡す
②get_top_node(parent_node) ← [joint4]
↓ joint4の親(joint1)があったので関数に渡す
③get_top_node(parent_node) ← [joint1]
↓ 親がなくなる return node
④[joint1] ← ③get_top_node(parent_node) ← [joint1]
↓ return top_node
④[joint1] ← ②get_top_node(parent_node) ← [joint4]
↓ return top_node
⑤[joint1] ← ①get_top_node(node) ← joint5
↓ return top_node
[joint1]

このような処理になると思います。親がなくなるという条件を満たしたら一番最初の関数に戻ってきて結果を返してくれるというのが分かっていただけたと思います。
あと今回はすべてのタイプを対象にしていますがlistRelativesのtypフラグで特定のタイプでストップできますのでお試しあれ。



この記事が気に入ったらサポートをしてみませんか?