[miRA]モジュラーリギングシステム「miRA(ミラ)」

2017年05月08日 06:32

久しぶりのCGトピックスです。

miRAについて
開発のきっかけですが、CG業界でスタンダードになりつつあるプログラミング言語「パイソン」を勉強するため、数年前から題材として「リグシステム」を趣味で書き始めました。結果面白くなってしまいC++にも手を出してしまいましたが・・・
(元々別の名前で開発していたのですが、コアの設計に問題があったため一度全て捨てて書き直したという経緯があったりします。)

もう一つの開発理由として、いわゆるハイエンド系のCG用に設計されたリグはアニメ業界での運用にマッチする部分もあればそうでない部分もあると長年感じていました。
そういった部分も含め、何か一つ自分なりの回答となりうるリグを作りたいというのが最も大きな開発理由だと思います。

細かい話は置いておき、とりあえずデモリールをご覧ください。
(※HD720でアップしていますので、可能であれば画質を上げてご覧ください。)

なお、リグのサンプル用としてモデリングしたのは響けユーフォニアムから麗奈さんです。ファンアート兼ねて作ってみました。
reina.jpg


■モジュラーリギングについて
モジュラーリギングは兼ねてより提唱されている、腕や背骨や手といった部位をバラバラにセットアップし、それを組み合わせて複雑なリグ構築を可能にするという考え方です。
概念としては、英語ですがこちらのスライドで分かりやすく説明してあります。
http://halo.bungie.net/inside/publications.aspx
Modular Procedural Rigging

最近では、スクウェアエニックスの佐々木さんが「CRAFT」という素晴らしいモジュラーリグシステムの情報をCESECで発表されていたり、海外では「mGear」というオープンソースのリグシステムが公開されていたりと、勉強する上での情報はだんだん出てきたなという印象です。

DFtalkさんでも、よい情報をたくさんまとめてくださっています。
https://dftalk.jp/?p=17463


■リグの軽量化
上記CRAFT開発者佐々木さんが以前のCEDECで発表されていた内容がすごく参考になりました。
http://cedec.cesa.or.jp/2014/session/VA/971.html
ここで発表された「ローカルコンストレイン計算」をモジュール内では基本とし、可能な限りワールドでの計算を行わないようにマトリックス接続を最適化しています。
そのためサンプルのように大量のリグを構成しても、現実的な速度でリグが動きます。


■Module(モジュール)とUnit(ユニット)
miRAの特徴として、リグが大きく分けて「モジュール」「ユニット」の2つにカテゴライズされます。
--モジュールの例--
・root
どのリグにも必ず作られる基礎モジュールです。
WorldリグとLocalリグ、セッティングノード(表示非表示やリグのステータスを変更するための歯車のようなリグ)が最低一つづつ作られます。
WorldとLocalはそれぞれ9個までオフセットを増やせます。

・chain
尻尾や背骨など汎用的に使えるリグ。
たとえば、背骨は4本。肩や頭、首は1本で作成する等することで色々と使いまわしています。
(本数はカスタマイズ可能)
IKスプラインハンドルなどアドバンスドビルドも可能。
スカートやヘア、顎やベロ。視線などもこれで作成している非常に汎用性の高いモジュールです。

・limb
腕や脚に使う、いわゆる2ボーンIKを基礎としたリグです。
3本モードといういう特殊モードも用意していますが、こちらは指などに使っています。


--ユニットの例--
・parentSwitch
IKハンドルや色々なリグの親を切り替えられるスイッチを作成します。
移動のみ、回転のみなどのカスタマイズも可能。

・adjustInfluence
肘の突き出しや脇下の補助骨など、コントローラを持たない補助インフルエンスを作成するためのユニット。
フラグがたくさんあり、自分でドリブンキーを組むためのシンプルなものからパラメータで複雑な動きを作れるものまで色々と作れるようにしています。

・physicalChain
チェーンと書いていますが、limbや他エンドジョイントが存在するリグなら全てに実装できるダイナミクス。
詳しくは後述

・meshAttach
ボタンやリベット、ジッパーなど変形するものの表面に変形しない硬いものを追随させる際に使います。
フェイシャルリグのセレクタなど顔のメッシュに追随させたい場合にも使います。
--------------------

モジュールは上記+いくつか専門的なものが数個ある程度ですが、ユニットは他にもかなりたくさんあります。

なぜモジュールとユニットをカテゴライズしたかを家の建設に例えてみます。
家を建てるには、まず柱を立てて壁を塗り、天井を塞いだりと「家としての基礎」を最初に作ります。これがモジュール。
その後、カーテンをつけたり冷蔵庫やテレビを置いたりと、実用に向けてのカスタマイズを組み合わせて運用していきます。これがユニット。

なぜこのようにカテゴライズしたかというと、一つ一つの機能をシンプルにすることによって汎用性を高めようという狙いがあったからです。
例えば、ダイナミクスを実装するための機能をチェーン専用ではなくユニット化することで、指や背骨、首などにもダイナミクスを実装できるようになります(やらないと思いますが・・・)
他にも、adjustInfluenceをチェーンモジュールとlimbモジュールにまたがって構成できたりとモジュール内のオプション機能にしてしまわずに独立させることで汎用性がぐっと上がり、さらに組み合わせた際の多様性が非常に広がります
(最初に紹介したデモリールのサンプルキャラクタに使っているモジュールは、セカンダリやフェイシャルを含めてもたったの5種類。多様性を出すためいかにunitとの組み合わせが重要かが理解できるかと思います。)

■GUIベースとスクリプトベース
モデラーやアニメータでも簡単にセットアップができるという敷居の低さを目標として開発しているのがmiRAです。
スクリプトの知識がなくとも、GUIからモジュールやユニットの作成。ビルドデータやウエイトデータ等の書き出し、リグの再構築などプロダクションパイプラインに必要とされる物を満たせるように設計しています。
(例)chainモジュール作成GUI中、スプラインIKのオプション
ik_201705080652594cd.jpg


ただし、GUIから作成可能とはいえ例えばスカートなど、繰り返し処理でモジュールを作った方が便利な場合があります。
そういった場合には全てスクリプトからのアクセスも可能としています。
さらにそのスクリプトを所定のテンプレートフォルダに配置すれば、GUI上から読み込みと再構築を実行できるようにしてあります。
(例)表情リグ関連のテンプレート
template.jpg


例えば、標準的なbiped(二足歩行)リグを作る場合以下のモジュールを使用して作成します。
-----
・背骨:chain
・首:chain
・頭:chain
・鎖骨:chain
・腕:limb
・手首:chain
・手の甲:chain
・指:limb
・腰:chain
・脚:limb
・足:step(リバースフット用モジュール)
-----
上記のような構成をイチイチGUI上から一個一個作っていると非常にめんどうですので、テンプレートスクリプトを記述して登録しあとはGUI上からボタン一個でbipedとして構成できるようにしてあります。

■その上で・・・
ここまで紹介したお話は「シンプルな機能の組み合わせで多様性を出していく」というモジュラーリギングのロジックをmiRAなりに解釈した内容です。

その上で、どのようなリグを設計するか。アニメータが何を求め、案件ごとにどのようなリグを提供していくか。
会社やチームによって、リグに求められる要素は想像以上に違います。
(例えばmiRAの売りとして、ほぼ全関節をトランスレート、ローテート、スケール、ローテートオーダーをkeyable開放しています。
これは会社によってはロックしろと嫌われることもあったりします。)

そういった状況の中でイチイチ機能をプログラミングしなくても、既存のモジュールやユニットの組み合わせで要望に対応していく事のできる仕組みを、今後も時間をかけて作って行ければと考えています。
スポンサーサイト


トラックバック

この記事のトラックバックURL
http://cieloblog.blog75.fc2.com/tb.php/26-a92830a2
この記事へのトラックバック


最新記事