Rigify の拡張方法―Blender アニメーション

カテゴリ:blender

この記事は Rigify スクリプトの大まかな動作手順の説明と, 自作のリグスクリプトを実行させる方法を解説する. Rigify の使用法や設定方法は Rigify の使い方 を参照.

Rigify 自体は大したことはしない.Rigify は大雑把にいうと以下のことしかやらない.

  1. armature をコピー
  2. コピーしたすべてのボーンの頭に"ORG-"をつける
  3. コピーしたすべてのボーンを調べて型付きのボーンを探す
  4. 型のついたボーンに対し,型に対応したスクリプトを実行する

Rigify における型

ボーンの型は Pose モードのカスタムプロパティの rigify_type に指定する. 下の画像では biped.leg が型だ. Edit モードのカスタムプロパティと Pose モードのカスタムプロパティとは別物であることに注意する.

ボーンの型
ボーンの型

型のほかにもレイヤーなどの様々な情報を渡せる. これは rigify_parameters プロパティを作成して渡す. 決まった形式はないが,ふつうは dictionary である. 例えば次のようにして使う.

{'layer':1,'ik-fk layer':3}

実行されるスクリプト

実行されるスクリプトは

Blenderのインストールディレクトリ/scripts/addons/rigify/rigs

にある. 自作のスクリプトもこのディレクトリに入れる. rigify_type が spine のとき,spine.py が実行される. pitchipoy.super_face のとき pitchipoy/super_face.py が実行される.

Rigify の generate を押したときに実行されるメソッドはrigify/generate.py の generate_rig() だ.

Rigify スクリプトの書き方

スクリプトにはクラス Rig と次のメソッド2つを定義する.

__init__(self, obj, bone_name, params)

このメソッドはボーンの情報収集のためのメソッドだ. リグを構築する前に呼ばれる. よってこのメソッドで armature に変更を加えてはならない. 後の generate() では armature から情報を入手できないので必要な情報はここでローカルに保存しておく.
obj は armature オブジェクト
bone_name は型のついていたボーン名
params は rigify_parameters による追加の引数

generate(self)

リグを生成する.シグネチャを見ればわかるとおり,引数がない. よってリグの生成に必要な情報は __init__ で取得し保存しておかなければならない. このメソッドにも以下の制限がある.

  1. 既存のボーンを変更してはならない.ただし頭に"ORG-" のついたボーンは変更してもいい.
  2. "ORG-" ボーンであっても,許されるのは子の追加と Constraint の追加のみ. リネーム,既存ボーンの親子関係の変更,Constraint の削除等をしてはならない. これらを行うとスクリプトの実行順序に依存性が発生してしまう.

自作スクリプトを実行する

以下のテスト用スクリプトを Rigify から実行する.

import bpy

class Rig:
  def __init__(self, obj, bone, params):
    print('\n test init\n')
  def generate(self):
    print('\n test generate\n')

このスクリプトを test.py として保存し, Blenderのインストールディレクトリ/scripts/addons/rigify/rigs に配置する. Blender で Human(Meta-Rig) 作成し,Edit モードですべてのボーンを削除する. そのまま Edit モードでボーンをひとつ作成し,ポーズモードで test 型を指定する. スクリプトが Rigify から認識されていれば Rig type:: が test になる.

型の指定
型の指定

あとは Generate を押せばスクリプトが実行される. 出力はコンソールに表示される.

出力結果

Encode Sample to Python と Encode Metarig to Python

リグが複雑になるとそのためのボーンを作成するのに時間がかかる. そこでリグのためのボーンを生成するスクリプトがあると便利だ. Encode Sample to Python と Encode Metarig to Python とは, 現在の armature を再現するようなスクリプトを出力するスクリプトだ.

違いはレイヤー情報の有無だけだ. Encode Metarig to Python はボーンのレイヤー情報も出力されるが, Encode Sample to Python はそうではない.

これらの実態は utils.py の write_metarig() にある. Encode Metarig は ui.py の EncodeMetarig() から

write_metarig(context.active_object, layers=True, func_name="create")

を呼び出し,Encode Sample は EncodeSample() から

write_metarig(context.active_object, layers=False, func_name="create_sample")

を呼び出している.

関連記事
Blender 記事の目次

Rigify の GitHub