Blenderのウェイトペイントは直感的ですが、どうしても扱いに慣れません。人物などウェイトが複雑になりがちなモデルの場合、ブラシではなかなか細かい調整をやりにくい気がしています。
結局、ウェイトは直接数値入力しています。数値入力は、「0.5」のように値を入力する方法のほか、「0.25*2」とか「1-0.5」のような計算式を入力することも可能です。また、プロパティ・シェルフでウェイトのコピーが簡単にできます。なので、数値入力でも結構効率よく作業できます。
ウェイトを数値入力する場合に厄介な点は、ウェイトペイントを使う場合と違って、自動的に頂点グループが作成されないというところです。何かよい方法があるのかもしれませんが、見つかりませんでした。そこでウェイトに必要な頂点グループを空の状態(割り当ての頂点がない状態)で追加するスクリプトを作ってみました。
先の記事で掲載したスクリプトの拡張版です。
MARKER0 = ".L"このスクリプトの使い方は、次のとおりです。
MARKER1 = ".R"
# -----------------------------------------------------#
import bpy
active_object = bpy.context.active_object
if active_object.type == "ARMATURE":
objects = bpy.context.scene.objects
bones = []
if active_object.mode == "EDIT":
bones = [x.name for x in active_object.data.edit_bones if x.select]
else:
bones = [x.name for x in active_object.pose.bones if x.bone.select]
targets = [x for x in objects if x.type == "MESH" and x.select]
for obj in targets:
objects.active = obj
vertex_groups = obj.vertex_groups
vertex_group_names = [x.name for x in vertex_groups]
for x in bones:
if x not in vertex_group_names:
bpy.ops.object.vertex_group_add()
vertex_groups.active.name = x
objects.active = active_object
elif active_object.type == "MESH":
j = len(MARKER0) * -1
vertex_groups = active_object.vertex_groups
vertex_group_names = [x.name for x in vertex_groups]
for x in vertex_group_names:
if x.endswith(MARKER0):
name1 = x[:j] + MARKER1
if name1 not in vertex_group_names:
bpy.ops.object.vertex_group_add()
vertex_groups.active.name = name1
- 頂点グループを追加したいオブジェクトを選択する(複数選択可)
- 最後にアーマチュアを選択してアクティブにする
- アーマチュアを編集モードかポーズモードにして、頂点グループとして追加したいボーンを選択する
- 上記の状態でスクリプトを実行する
このスクリプトには、もう一つの使い方があります。
アーマチュアでなく、メッシュオブジェクトをアクティブにした状態でスクリプトを実行すると、"shoulder.L"などの左のマーカーのついた頂点グループが存在する場合に対称となる"shoulder.R"などの頂点グループを追加します。これも空の状態です。オブジェクトにミラー・モディファイアを設定している場合は、空の対称グループがあるだけで自動的にウェイトが設定されます。対称のマーカーは、変数MARKER0とMARKER1に設定してください。