ゲーム作りが大好きな人のブログ

ゲームを作るのが大好きな人のブログ。UE4とBlender、MAYA(LT)、3DCoatを使用しています!

【Blender】【Python】アーマチュアを階層選択するスクリプト

Blenderのバージョンは2.81aで検証しています
※ 2020/01/14追記 後日Shift+Gで階層選択ができる事が判明
f:id:toofu0:20200101142612p:plain
新年あけましておめでとうございます。
新年一発目のネタですがBlenderでアーマチュア(ボーン)を階層選択するスクリプトです。
なんでこの機能デフォルトで付いてないんや……

コード(最後の注意書きはよく読んでね)

2020年1月1日22時27分:より良い形に修正

import bpy

#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# ボーンの階層選択
#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
def SelectHierarchyBone(bone):
    
    # ボーンを選択しているか判定用関数
    def IsSelectBone(bone):
        retType = False
        
        if bone.select_head:
            retType = True
        
        return retType
            

    # 再帰的にボーンを選択する関数
    def SelectBoneCycle(bone):
        bone.select = True
        bone.select_tail = True
        for childBone in bone.children:
            SelectBoneCycle(childBone)
        
        return
    

    # ボーンを選択している場合
    if IsSelectBone(bone):
        SelectBoneCycle(bone)
    else:
        for childBone in bone.children:
            SelectHierarchyBone(childBone)            
    return

#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# 実際の処理
#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
print('+++++++++++++ start +++++++++++++')
for armature in bpy.data.armatures:
    for bone in armature.edit_bones:
        SelectHierarchyBone(bone)

注意書き

Blender初心者が作ったものなので間違いはあるかも
Pythonもほとんど触った事がなかったので間違いはあるかも。(でも思ったよりは便利だった)
・コレクションには「ビューレイヤーから除外」という機能がありますが
 こいつが中々の曲者で、オブジェクトリストを全部取得(bpy.data.objects)すると
 除外された物も拾ってくる仕組みのようです。
 尚且つ除外されたデータにアクセスすると
 (アクセス可能なものもあるかもしれませんが)スクリプトエラーになる可能性があるという非常に面倒な代物でした。
 除外されたオブジェクトは外してほしいと思う今日この頃。

・オブジェクトを全部探している関係上、少し重たいかもしれません。

最後に感想

これ作るのにめっちゃ時間かかったけど
Blenderの根幹がどういう風になっているか分かったという点では非常に良かった。
どうにもBlender2.8以前の物と思想的に違う部分があるらしく
2.8以前の過去文献と同様の挙動をしない物が多くて少し焦った。
でも、変更された内容は以前の物より洗練化されていて
使いやすくなっているので結果的に良いかなと思ってます。