本日は Blender の技術調査枠です。
Blender2.8で利用可能なpythonスクリプトを作ります。
アーマチュアモディファイアの複製と適用
対象のアーマチュアモディファイアを複製して適用します。
・copyaplly_modifier_armature.py
# bpyインポート import bpy # 対象のアーマチュアモディファイアを複製して適用する def copyaplly_modifier_armature(arg_targetobject='Default') -> bool: """対象のアーマチュアモディファイアを複製して適用する Keyword Arguments: arg_targetobject {str} -- 対象オブジェクト名 (default: {'Default'}) Returns: bool -- 実行の正否 """ # 指定オブジェクトを取得する # (get関数は対象が存在しない場合 None が返る) selectob = bpy.data.objects.get(arg_targetobject) # 指定オブジェクトが存在するか確認する if selectob == None: # 指定オブジェクトが存在しない場合は処理しない return False # 指定オブジェクトをアクティブに変更する bpy.context.view_layer.objects.active = selectob # オブジェクトの全てモディファイアを走査する # モディファイアのタイプ一覧 # (https://docs.blender.org/api/2.82a/bpy.ops.object.html#bpy.ops.object.modifier_add) # オブジェクトに設定中のモディファイア数を取得する modifier_num = len(selectob.modifiers) # 走査中のモディファイア位置を記録する(先頭から開始) check_num = 0 # 全てのモディファイアを走査する while modifier_num > check_num: # 操作対象のモディファイアを取得する modifier=selectob.modifiers[check_num] # アーマチュアモディファイアなら処理を行う if modifier.type == 'ARMATURE': # モディファイアを複製する bpy.ops.object.modifier_copy(modifier=modifier.name) # 複製されたモディファイアの参照を取得する copy_modifier=selectob.modifiers[check_num + 1] # 複製したモディファイアを適用する bpy.ops.object.modifier_apply(apply_as='DATA',modifier=copy_modifier.name) # 走査位置を移動する check_num = check_num + 1 return True # 関数の実行例 copyaplly_modifier_armature(arg_targetobject="JointObj")
ポーズの変更をボーンとメッシュに反映する
前回記事のスクリプトと今回のスクリプトを以下のように組み合わせて利用すると、ポーズの変更をボーンとメッシュに反映することができます。
bluebirdofoz.hatenablog.com
・comb.py
以下のような処理の流れになります。
1.ボーンの角度を変更する。
2.アーマチュアを複製してボーンの角度変更による変形をメッシュに適用する
3.変更後のボーンの角度をデフォルトに設定する
これでメッシュとボーンの角度について変更後の位置をデフォルトとして再設定できます。