Quantcast
Channel: 気まぐれブロマガ
Viewing all articles
Browse latest Browse all 56

Blender 小ネタ・その5 - 変形ウェイトグループ数が一定数以上である頂点を選択するスクリプト

$
0
0

Blenderで頂点の変形ウェイトグループ数を制限する場合、ペイントモードのウェイトツール「合計を制限」(Limit Total)を実行するわけですが、これは最小ウェイトのグループから問答無用に削除してしまうので、ちょっと怖いです(^^;

そこで、編集モード上で変形ウェイトグループ数が一定数以上である頂点を選択するスクリプトを作ってみました。

threshold = 5

# -----------------------------------------------------#
import bpy
import bmesh
me_obj = bpy.context.edit_object
arms = {x.object for x in me_obj.modifiers if x.type == "ARMATURE" and x.show_viewport}
if len(arms):
print("")
print("Check Bone Weight")
print("-----------------")
vgroups_map = {x.index: x.name for x in me_obj.vertex_groups}
others = {x.name for x in me_obj.vertex_groups} - {y.name for x in arms for y in x.pose.bones}
bpy.context.tool_settings.mesh_select_mode = [True, False, False]
bpy.ops.mesh.select_all(action = 'DESELECT')
me = me_obj.data
bm = bmesh.from_edit_mesh(me)
for vert in bm.verts:
bone_weights = {vgroups_map[x.group] for x in me.vertices[vert.index].groups} - others
num = len(bone_weights)
if num >= threshold:
print(vert.index, "(", num, ")")
vert.select = True
bmesh.update_edit_mesh(me, True)
冒頭の変数thresholdにしきい値を設定してください。例えば、変形ウェイトグループ数を最大で4までにしたい場合は、それを超えるグループ数である頂点を選択状態にするために、thresholdに5を設定します。
このスクリプトは、実行するとシステムコンソールへの結果表示もします。



コンソールウィンドウはウィンドウメニュー「システムコンソール切替」(Toggle System Console)で表示されます。これを閉じるときも同じです。決して閉じるボタンを押さないでください。Blenderが強制終了します。

システムコンソールには変形ウェイトグループ数がしきい値以上である頂点について、インデックスとグループ数が表示されます。

頂点のインデックスを調べる便利なアドオンがあります。

Index Visualizer

こんな感じに選択頂点のインデックスを表示してくれます。



アドオンの使い方は簡単です。アドオンを有効化すると、プロパティシェルフにIndex Visualizerという項目が表示されるので、その「Start」ボタンを押すだけです。このアドオンは、スクリプトの開発に非常に便利で、大変お世話になっています。

話を当方のスクリプトに戻します。

上記掲載のスクリプトは、変形ウェイトグループだけが検証対象になります。アーマチュアに関係ない頂点グループはグループ数にカウントされません。当然ながら、アーマチュア モディファイアが有効になってないと、エラーになります。

もうひとつ注意点があります。編集モードで頂点に割り当てられたグループを追加・削除しても、直ちにはスクリプトは認識できません。いったん編集モードを抜けてから再度編集モードに入って、それからスクリプトを実行してください。











Viewing all articles
Browse latest Browse all 56

Trending Articles