リギングの調整をしていて思った事。ボーン増えすぎて頂点に影響を与えているボーンがどれか判らない。
そんな訳で、先日作ったスクリプトを改造して作ってみました。
編集モードでメッシュオブジェクトの頂点編集中に起動すると影響を与えるアーマチュアのボーンが選択状態になります。
一応2.7、2.8で動作は確認しましたが、相変わらず2.8の動作は怪しいです。
編集モードでメッシュオブジェクトの頂点編集中に起動すると影響を与えるアーマチュアのボーンが選択状態になります。
一応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:
以下のループ処理ですね。
前者はアーマチュアオブジェクトを取得する際にテーブルに対して、モディファイアから取得したアーマチュアの名称をキーとして直接データを呼び出しているのに対して、後者は頂点グループ名と一致するボーンをループで探しています。
前者はモディファイアにアーマチュアを登録する際に実在する事が担保されているので、直接名前で呼び出しましたが、後者は頂点グループ名とボーン名が一致する保証は無い為、わざわざ一致するボーンが出るかを検索しています。
obj_arm = bpy.data.objects[name_armature]
と
for bone in arm.bones:
以下のループ処理ですね。
前者はアーマチュアオブジェクトを取得する際にテーブルに対して、モディファイアから取得したアーマチュアの名称をキーとして直接データを呼び出しているのに対して、後者は頂点グループ名と一致するボーンをループで探しています。
前者はモディファイアにアーマチュアを登録する際に実在する事が担保されているので、直接名前で呼び出しましたが、後者は頂点グループ名とボーン名が一致する保証は無い為、わざわざ一致するボーンが出るかを検索しています。
実はこれまで掲載してきたスクリプトは、皆2.7用アドオンに仕立て直したのですが、今後は2.8向けに修正しなくてはならないです。
その上で、リギング修正もしないと次の作業には入れない…近いようで遠いですねえ。
その上で、リギング修正もしないと次の作業には入れない…近いようで遠いですねえ。
0 件のコメント:
コメントを投稿