個々のボーンをスケールできるリグ
カテゴリ: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)