dskjal
広告
広告

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

関連記事

Blender 記事の目次


広告
広告

カテゴリ