スクリプトからドライバーをつける&IK/FK切り替えスイッチの自動セットアップ
カテゴリ:blender
IK の影響力をボーンのローカル X で操作する
アーマチュア名を Armature,IK のついているボーン名を Bone.001,スイッチのボーン名を switch とする.
import bpy amt = bpy.data.objects['Armature'] #driver をつける d = amt.pose.bones['Bone.001'].constraints['IK'].driver_add('influence') d.driver.type = 'SCRIPTED' #ドライバ変数の作成 var = d.driver.variables.new() var.name = 'locx' var.type = 'SINGLE_PROP' #ターゲットの設定 var.targets[0].id = amt var.targets[0].data_path = 'pose.bones["switch"].location[0]' d.driver.expression = 'locx'
IK の影響力をボーンに追加したプロパティから操作する
ボーンの名前の最後に .001 や .L 等がついているとプロパティを追加できないことに注意する.
import bpy #プロパティの追加 switch_name = "ikfk_switch" ik_bone_name = "forearm" exec("bpy.types.PoseBone.%s = bpy.props.FloatProperty(switch_name,default=1, min=0.0, max=1.0)"%ik_bone_name) #UI の表示範囲を0から1に制限 ikbone = bpy.data.objects['Armature'].pose.bones[ik_bone_name] ikbone['_RNA_UI'] = {switch_name:{'min':0.0, 'max':1.0, 'soft_min':0.0, 'soft_max':1.0}} ikbone[switch_name] = 1.0 #ドライバーの追加 d = ikbone.constraints['IK'].driver_add('influence') d.driver.type = 'SCRIPTED' var = d.driver.variables.new() var.name = 'var' var.type = 'SINGLE_PROP' var.targets[0].id = bpy.data.objects['Armature'] var.targets[0].data_path = 'pose.bones["%s"]["%s"]' % (ik_bone_name,switch_name) d.driver.expression = 'var' #UI class UI(bpy.types.Panel): bl_label = "ikfk" bl_space_type = "VIEW_3D" bl_region_type = "UI" def draw(self, context): self.layout.prop(ikbone, '["%s"]'%switch_name, slider=True) bpy.utils.register_class(UI)
動作デモ