広告
広告

Rigify の拡張方法

カテゴリ: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 記事の目次


広告
広告