2020年10月29日木曜日

Blender でアクティブ頂点グループに影響を与えるボーンを探してみる

 リギングの調整をしていて思った事。ボーン増えすぎて頂点に影響を与えているボーンがどれか判らない。
そんな訳で、先日作ったスクリプトを改造して作ってみました。
編集モードでメッシュオブジェクトの頂点編集中に起動すると影響を与えるアーマチュアのボーンが選択状態になります。
一応2.7、2.8で動作は確認しましたが、相変わらず2.8の動作は怪しいです。

これで

こうなる

コード
# serch active vg bone
import bpy
if bpy.context.mode == 'EDIT_MESH':
    for obj in bpy.context.selected_objects:
        if obj.type != 'MESH':
            continue
        
        # vg use check
        name_armature=''
        for modifier in obj.modifiers:
            if modifier.type != 'ARMATURE':
                continue
            if not(modifier.use_vertex_groups):
                continue
            name_armature = modifier.object.name
            break
        
        if not(name_armature):
            continue
        active_vg = obj.vertex_groups.active
        obj_arm = bpy.data.objects[name_armature]
        arm = obj_arm.data
        
        # search bone loop
        for bone in arm.bones:
            if bone.name == active_vg.name:
                print(bone.name)
                bone.select=True
                break

特筆するところは
obj_arm = bpy.data.objects[name_armature]

for bone in arm.bones:
以下のループ処理ですね。
前者はアーマチュアオブジェクトを取得する際にテーブルに対して、モディファイアから取得したアーマチュアの名称をキーとして直接データを呼び出しているのに対して、後者は頂点グループ名と一致するボーンをループで探しています。
前者はモディファイアにアーマチュアを登録する際に実在する事が担保されているので、直接名前で呼び出しましたが、後者は頂点グループ名とボーン名が一致する保証は無い為、わざわざ一致するボーンが出るかを検索しています。

実はこれまで掲載してきたスクリプトは、皆2.7用アドオンに仕立て直したのですが、今後は2.8向けに修正しなくてはならないです。
その上で、リギング修正もしないと次の作業には入れない…近いようで遠いですねえ。

0 件のコメント:

コメントを投稿