スクリプトからドライバーをつける&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)
動作デモ