dskjal
広告
広告

個々のボーンをスケールできるリグ

カテゴリ:blender

カートゥーンのリグではふつうパーツ単位で拡縮する機能が要求される。その実装は簡単で「スケールを継承」のチェックを外すだけだ。しかしそれだけではルートを拡縮したときすべてのボーンが拡縮する機能を実現できない。ルートの拡縮はすべてのボーンに拡縮コピーをつけることで実現できるが、手作業でやるのは現実的ではない。この記事ではそれを自動化するスクリプトを紹介する。

ルートの拡縮をコピーするスクリプト

以下のスクリプトは root_name 以外のボーンに root_name の拡縮をコピーする拡縮コピーをつける。not_scale に拡縮コピーをつけてほしくないボーン名を追加する。たとえば [root_name, 'MCH-arm', 'DEF-hair'] など。

import bpy

root_name = 'root'
not_scale = [root_name]

amt = bpy.context.active_object

# すべてのボーンのスケールの継承を無効化
# disable inherit_scale
old_mode = amt.mode
bpy.ops.object.mode_set(mode='EDIT')
for b in amt.data.edit_bones:
    b.use_inherit_scale = False
    
bpy.ops.object.mode_set(mode=old_mode)

# not_scale に指定されていないボーンに拡縮コピーをつける
# add copy scale to bones except for a root
for b in [b for b in amt.pose.bones if not b.name in not_scale]:
    c = b.constraints.new('COPY_SCALE')
    c.name = 'root_scale'
    c.target = amt
    c.subtarget = root_name
    c.use_offset = True
    c.target_space = 'LOCAL'
    c.owner_space = 'LOCAL'

スクリプトで付加した拡縮コピーの削除

上記のスクリプトで付加した拡縮コピーは名前が 'root_scale' なので名前で検索して削除する。

import bpy

for b in bpy.context.active_object.pose.bones:
    for c in b.constraints:
        if c.name == 'root_scale':
            b.constraints.remove(c)

.blend ファイルダウンロード

関連記事

Blender 記事の目次


広告
広告

カテゴリ