ブログでプログラムのコードを綺麗に表示する方法を覚えたので、今回はそっち系です。
再帰関数を使用して、複雑な親子階層からオブジェクトのみ取得する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のスクリプトとかでも重宝してます。
実はこの再帰関数、最近やっと覚えたのです……はい。










コメント