Rigify の拡張方法
この記事は Rigify スクリプトの大まかな動作手順の説明と、自作のリグスクリプトを実行させる方法を解説する。Rigify の使用法や設定方法はRigify の使い方 を参照。
Rigify 自体は大したことはしない。Rigify は大雑把にいうと以下のことしかやらない。
- armature をコピー
- コピーしたすべてのボーンの頭に"ORG-"をつける
- コピーしたすべてのボーンを調べて型付きのボーンを探す
- 型のついたボーンに対し、型に対応したスクリプトを実行する
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__ で取得し保存しておかなければならない。このメソッドにも以下の制限がある。
- 既存のボーンを変更してはならない。ただし頭に"ORG-" のついたボーンは変更してもいい。
- "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")
を呼び出している。