再帰関数を使って末端ジョイントを取得しよう!

再帰関数って何?

自分で自分を呼び出すことを再帰的(recursive)と呼び、
再帰的を使って作られた関数を再帰関数と呼びます。

再帰関数で何ができる?

例えば、引数nに5を入れた場合に5+4+3+2+1の合計値が出力できます。
配列やfor文を使わずに合計値を勝手に計算してくれる感じです。

def sum(n):
    if n <= 0:
        return 0
    return n + sum(n-1)

再帰の最大回数

実は最大回数が決まっています。最大回数を超えるとランタイムエラーが出ます。
最大回数を調べる方法、変更する方法は以下です。

import sys
sys.getrecursionlimit()     # 取得
sys.setrecursionlimit(3000) # 変更

Mayaで再帰関数をどう使う?

Mayaでは…というよりも、3Dにおけるスケルトン構造のような階層構造がある時に結構使えます。

やりたいこと

ルートから再帰的に下っていき、
親ジョイントに子ジョイントが存在しない場合は親ジョイントを返すことをやってみます。

結果として末端ジョイントだけ得ることができます!

サンプルコード

from maya import cmds

# 階層構造の末端ジョイントを取得する再帰関数
def getEndJoints(root):
    end_joints = []
    children = cmds.listRelatives(root, c=True, type="joint")
    if children is None:
        return [root]
    for child in children:
        end_joints.extend(getEndJoints(child))
    return  end_joints

end_joints = getEndJoints("root")
cmds.select(end_joints)

処理抜け出せない問題に気をつけよう!

再帰関数はwhile文のように終了条件が必要です。
終了条件がない場合は計算を一生して出られなくなるのでご注意を…!

参考リンク

再帰処理とは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
再帰的プログラミングをマスターする – IBM Developer
再帰関数を学ぶと、どんな世界が広がるか – Qiita

おすすめ書籍

Pythonの場合ですが、『なっとくアルゴリズム!』が
わかりやすくておすすめです。

私は再起を学ぶために購入したわけではなく、
ダイクストラ法を学ぶために購入したんですけどね。

再起も含めて、全ての章が図入りでわかりやすく書いてあったのでPythonでいろんなアルゴリズムを知りたい・組みたい方に
おすすめできます。

ソートとか、用意された関数でお手軽にできますが
自分で組むと結構考えさせられるんですよね。

基本情報処理技術者資格の知識の必要性が
徐々にわかってきました。笑

関連記事

  1. アーティストのためのMaya Python入門 第6回「renameコマンドを使って、名前を変更しよう!」

    2020-10-03

  2. ローカルリギングってなに?

    2020-12-16

  3. 処理の前後に別の処理を挟む?デコレータとWith文

    2021-01-09

  4. 裏ラティス!リガーのためのLatticeデフォーマの使い方を解説します。

    2020-10-27

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

コメント

ABOUT

テクニカルアーティストの為のまとめサイトです。

本サイトでは、『YouTube ✕ Blog』を中心に
情報発信をしていきます。

また、テクニカルアーティストとしての様々な
ライフハック記事も投稿予定です。

限定情報会員

PATREONでは、限定情報やサンプルファイルの配布も行っています。登録頂けると更新頑張れます。支援の方よろしくお願いします。


免責事項

本ウェブサイト内で公開している全ての情報の有用性や安全性については当方は一切の保証を与えるものではありません。
利用したことによって引き起こる直接および間接的な損害に対して当方は一切責任を負うものではありません。
全て自己責任でご使用ください。

3DCGBOOK出版

BOOTHで技術書を販売利しております。







スポンサー

ページ上部へ戻る