No More Retake

3DCG屋さん向けTips&Referenceサイト

メニュー

再帰関数でオブジェクト取得

ブログでプログラムのコードを綺麗に表示する方法を覚えたので、今回はそっち系です。

再帰関数を使用して、複雑な親子階層からオブジェクトのみ取得するMayaのスクリプトを書いてみました。
親を選択してこのスクリプトを実行すると、親以下すべての階層を検索してMeshのリストを作成します。
ちなみにpymelです。

#再帰関数使ってMeshのみを取得
import pymel.core as pm

#再帰関数
def getMeshList(Node, MeshList):

    #選択したノードの子供をリストで返す
    children = Node.getChildren()
    for i in children:
        type = i.nodeType()
        #NodeがMeshならリストに格納、Transformなら再度検索
        if type == "mesh":
            MeshList.append(i)
        else:
            getMeshList(i, MeshList)
    return MeshList 

#親を選択し実行すると、子供以下すべてを検索。Meshのみをリスト化
sel = pm.selected()
MeshList = []   

for i in sel:
 tempList=[]
 l = getMeshList(i, tempList)
 MeshList.append(l)
 print MeshList

再帰関数とは、自分自身を呼び出す関数だそうです。
関数の処理中に自分自身を呼び出し、さらにその処理中に自分を呼び出し…と、どんどん繰り返してゆきます。

ある言語ではfor文の代わりに再帰関数を使うそうな。
詳しい説明はWikipediaかなんかに任せるとして、この再帰関数、Mayaでスクリプトを書くとき複雑な階層化にあるジオメトリや特定のノードを取得するのにとても重宝しています。

for文で書くこともできるのですが、個人的にはこっちの方がしっくりきます。
for文で書くよりもコードも短くてすむ……ような気もするし。

python以外の言語でも使えます。
AfterEffectsのスクリプトとかでも重宝してます。

実はこの再帰関数、最近やっと覚えたのです……はい。

 

関連記事

コメントをお待ちしております

このサイトについて

3DCG Tipsサイト。Houdiniの記事が多めです。

RSS

follow us in feedly

アンケート

あなたのCG歴はどのくらいですか?

View Results

Loading ... Loading ...

言語切り替え

  • English (United States)
  • 日本語

Archives

  • 2017 (8)
  • 2016 (36)
  • 2015 (64)
  • 2014 (54)
  • 2013 (60)
  • 2012 (54)

スポンサードリンク