Rigging

Tips

modoのデフォーマリスト

modoのデフォーマリストについて書いてみたいと思います。デフォーマリストを使用するわかりやすい例はキャラクターのスケルトン変形やモーフィングですが、幾何学的なメッシュ変形のアニメーションを作ることもできます。

サンプルファイル

 

デフォーマリストとは

modoには非破壊的にメッシュ変形する「デフォーマ」機能が搭載されています。デフォーマはいつでも変形を調整できるので、アニメーションのような用途に向いています。1つのメッシュに複数のデフォーマを適用した場合に、デフォーマの計算順を指定するのがデフォーマリストです。

望んだ変形結果を得るにはデフォーマの計算順は重要です。デフォーマリストはリストの下から順に計算されます。例えば Linear Falloffで波のように変形してからベンドするのと、ベンドしてから波のように変形する場合では変形結果が変わります。

 

正規化フォルダ

デフォーマリストで重要な機能がNormalizing Folderです。デフォーマリストはデフォーマを順番に計算しますが、複数のデフォーマを順番にでなく一度に加えたいときがあります。例えばキャラクターのように複数のスケルトンでメッシュを変形する場合です。

modoのバインドを使用したスケルトン変形は「トランスフォームエフェクタ」による変形と同じで、アイテムのトランスフォームを使用してメッシュを変形します。このとき変形の影響範囲が重なると、2重トランスフォームが発生します。この問題を解決するのがNormalizing Folderです。

下の画像では真ん中のボックスにウェイトマップ値を100%ずつ重複するように設定しています。スケルトンを回転や移動したとき2倍変形しているのが確認できます。General InfluenceをNormalizing Folderに入れることで正規化されて、意図した変形になります。

Normalizing Folderには変形の正規化の他に、メッシュ変形の補完法を「クォータニオン」にしたり、影響するウェイトマップの上限を設定する「最大ソース」を設定することができます。ちなみに、Normalizing Folderはベンドなど他のデフォーマでも正規化が動作します。

modoでつまずきやすいのがスケルトン変形とモーフィングの計算順です。バインドで生成されたNormalizing Folderと、Morph Influenceの順番が適切でないと望んだ結果になりません。

FBX形式でバインドされたキャラクターモデルをmodoに読み込んだ場合も変形結果がおかしくなりがちです。変形結果がおかしいなと思ったら、デフォーマリストやNormalizing Folderを確認して見るといいと思います。
ちなみにデフォーマリスト右の#をクリックすると、ウェイトマップが設定された頂点を選択することができます。

デフォーマの変形順は、modo 10.1以降のプロシージャルモデリング用の「メッシュオペレータ」からも編集することができます。

 

デフォーマの計算順はmodoに限らず3dsMaxの「モディファイヤスタック」Mayaの「入力の操作リスト」など、3Dソフトでは一般的に搭載されている機能です。下の画像のような円柱のトランスフォームとデフォーマの計算順を利用したアニメーションは3DCGの古典的な手法です。

 

デフォーマの計算順を変えるとモーショングラフィックなんかで見かける幾何学的な変形が得られて面白いんじゃないかと思います。以前公開した「アニメ風の眼球制御」なんかもトランスフォームとデフォーマを利用したものでした。

Tips

modoのカーブプローブでアニメーション制御

前回のフォールオフプローブの続きで、カーブプローブを使用したアニメーション制御について書いてみたいと思います。

カーブプローブはカーブとアイテムの「距離」や「パーセンテージ」を抽出して、他のチャンネルで使用することができるようにするノードです。このカーブプローブとリプリケータを使用すると、カーブの特定の位置にあるアイテムを制御することができます。

例えばモーショングラフィックでよく見かける、オブジェクトがシーケンシャルに組み上がるようなアニメーションを作ることができるようになります。

サンプルファイル

 

カーブプローブを使用したアニメーション制御

簡単にテストしたところ、カーブプローブとリプリケータを使用して制御できるのは表示の「可視」、「ローカル」「ワールド位置」「ワールド回転」「ワールドスケール」のような、リプリケータの機能が使用しているチャンネルのみのようです。

 

可視の制御

見てわかりやすい、アイテムの「可視」の制御例です。

スケマティックはこんな感じです。

サンプルファイルがあるので、ザックリした解説です。

  1. カーブを作成してCurve Probeノードにリンクします。
  2. 別のメッシュにプロシージャルモデリングのCurve Rebuildノードを追加して、カーブをリンクします。
  3. Curve Rebuildしたメッシュは Replicator の「パーティクルソース」にリンクします。
  4. Replicatorの「原型となるアイテム」にはメッシュのない空のアイテムを指定して「子のアイテムを含む」をONに設定するのがポイントです。空のアイテムにペアレントしたアイテムがReplicatorによって複製されます。
  5. LocatorはユーザーチャンネルにControllerというパーセンテージ型のチャンネルを追加し、アニメーションのタイミング制御用のチャンネルとして利用します。
  6. 減算ノードを作成して Controllerの値から、Curve Probeの「パーセンテージ」を引きます。
  7. 減算ノードの出力をRelationshipノードを使用して値をリマップします。
  8. Relationshipノードの出力をアイテムの「表示属性」チャンネルにリンクします。

「表示属性」はプロパティでは「可視」と表示されます。modoはチャンネルタイプがリストの場合、0からの数字でリストの項目を制御できます。Relationshipを使用したリマップの値が2と1のリニアカーブなのは、「可視」が「いいえ」の2、「はい」の1に切り替えてるからです。


modoのカーブ関連の機能はあまり使いやすいとは言えませんでしたが、徐々に強化されて12.1のCurve Rebuild はだいぶ使いやすい状態になってる気がします。

 

位置の制御

基本的には「可視」と同じです。Relationshipノードの出力をアイテムの「ローカル」チャンネルにリンクすることで位置を制御しています。Relationshipと「ローカル」の間にMatrix Composeノードを使用しているのは、「ローカル」がマトリクスチャンネルだからです。位置のマトリクスを出力したいので、Matrix Composeのマトリクスタイプを「位置」にします。

 

回転の制御

回転のマトリクスを出力したいので、Matrix From Eulerを使用します。

 

スケールの制御

スケールのマトリクスを出力したいので、Matrix Composeのマトリクスタイプを「スケール」にします。

今回参考にしたmodo 801のCurve Probeの紹介ムービーでは「ワールドスケール」を使用していますが、「ローカル」がお勧めです。「ローカル」を使用すると Replicator の「ばらつき」にあるランダム系パラメータを使用してランダムさを加えることができるからです。「ワールドスケール」を使用するとマトリクスの計算順の関係で、Replicator のランダム系のパラメータを上書きしてしまいます。

 

 

ランスフォームを制御

Matrix Compose ノードを使用して位置、回転、スケールを「ローカル」にリンクする方法です。

Matrix Composeはチャンネルをリンクする順で計算するので、スケール、回転、位置の順番でリンクします。リンクする順番が違うとアイテムの位置が変わります。この計算順は座標変換の数学的な問題らしい。

 

カーブプローブを使用したアニメーション制御

上で紹介した方法でも十分アニメーションを制御できると思いますが、普通にアイテムにキーを設定して動かしたものを制御する方法について紹介したいと思います。方法は単純でTime Offset:Matrix ノードを使用します。

まずは普通にアイテムのトランスフォームにキーを設定してアニメーションを作成します。

あとは、アニメーションを設定した各アイテムの「ローカル」チャンネルをTime Offset:Matrixで循環させ、Curve Probeの「パーセンテージ」をTime Offseの「タイム」に入力すると、個々のアニメーションをオフセットできるようになります。

Time Offseは数が多くなるとアニメーションの再生に負荷がかかるようです。ハンバーガーを構成する6アイテムくらいなら問題ありませんが、ハンバーガー、ポテト、ドリンクの計23個のアイテムにTime Offseを設定したら、そこそこ重くなりました。12.1で追加された Driven Action を使って制御できたら便利だなと思ってテストしましたが、Driven Action では上手く行かなかったです。

ちなみにTime Offseはリンクしたらたまたま動いた感じで、正直なところCurve Probeの「パーセンテージ」が出力してる値がよくわからないです。出力先が「タイム」チャンネルの時だけアニメーションに関する何かが出力されてる気がします。上のスケマティックではCurve Probeの「パーセンテージ」を適当な値で割ってアニメーションの再生タイミングを遅くしようとしてますが、なぜかカーブの始点から終点に向けて徐々にアニメーションの再生間隔が遅くなっていきます。

 

簡単にアニメーションを設定するとこんな感じです。それっぽいんじゃないかと思います。

 

カーブプローブとリプリケータを使用すると、modoでもモーショングラフィック的なアニメーションを手続き的に作ることができたのは驚きですね。ノードを理解できれば、もっといろんな表現ができそうです。

 

参考

modo 801リリース時に公開された草のツルの成長アニメーションと、成長に合わせて葉が生えるチュートリアル動画です。木とかも作れそう。

Tips

modoでマッスルボーンの作り方

チャンネル リレーションシップを使用したリグの応用として、マッスルボーンの作りかたについて書いてみたいと思います。

 

マッスルボーンとは

ボーン(スケルトン)を使用して筋肉の伸縮を表現するリグのことです。デフォーマやシミュレーションで筋肉を揺らしたりする表現が高コストだった時代に、簡易的に筋肉表現をおこなうために利用されていました。今でもリグのデモリールを見ると、肩の変形制御用に伸縮するスケルトンを見かけることがあります。

 

マッスルボーンの作り方

スケルトンを使用する普通のマッスルボーンはチャンネルリレーションシップで簡単に作れるので、今回はこれまで紹介したセットアップの基本機能を組み合わせながら、フォールオフを使用した編集が手軽にできるマッスルボーンを作ってみました。

セットアップモードに入るとフォールオフが表示され、セットアップモード内のフォールオフの位置のメッシュを伸縮します。ウェイトマップを使用せずに変形してるところ面白いんじゃないかと思います。

サンプルファイル

スケマティックはこんな感じで単純です。スケマティックの左から右に解説してみます。

  1. 上腕と手のスケルトンの「ワールド位置」をMeasure Distanceノードに繋いで、アイテム間の距離を求めます。
  2. Measure Distanceの「距離出力」をRelationship ノードに接続してアイテムを制御します。
  3.  Relationshipの「出力」をRadial Falloffの「位置Z」と「スケールY/Z」に接続して、距離に応じてスケールするように設定します。位置はトランスフォームゼロで追加されるトランスフォームアイテムに接続しているので、セットアップモードではマスタートランスフォームで位置の編集ができます。
    フォールオフはデフォーマやダイナミクスのフォースを制御するアイテムのような印象がありますが、単体でデフォーマとして使用することができます。「セットアップ使用」というセットアップモードでアイテム位置を使用して変形する機能があり、この機能を使用することでセットアップモードのフォールオフ位置に変形を加えることができます。
    「セットアップ使用」を使うので、Radial Falloffはスケルトンの親子関係と関係ない構造になっています。スケルトン変形とフォールオフの変形は「デフォーマリスト」の順番で計算されます。このサンプルではフォールオフの変形後にスケルトンの変形を加えています。セットアップモードでの表示の切り替えは、Radial Falloffの「可視」チャンネルにセットアップ静止値を設定することで切り替えています。

Measure Distanceノードの変わりに Measure Angleノードを使用して前腕の角度を使う方法もありますが、人間の腕や脚のように3関節であれば距離を使用することもできますよ。という感じのサンプルにしてみました。
単純に伸縮する筋肉表現したい場合は「スケルトン角度でモーフを制御する方法」のようにモーフを使用して表現することもできます。どの方法を使用するかは好みの問題ですね。

 

LightWaveのボーンには手軽に力こぶを発生させる「筋肉の発生」という専用機能が搭載されていました。ソフトを覚えはじめの頃に1度だけさわっただけですが、変形形状を指定するような設定があれば便利な機能になったのかもなと思います。

参考資料

Incredibles 2のエンジニアリングに忠実な髪

Pixar が Incredibles 2 向けに開発したヘアワークフローを紹介するビデオをアップロードしています。 SIGGRAPH 2018でおこなう講演用らしい。プレビューでの再現性が高そうですね。

Tips

modoのセットアップ/静止値の使い方

リギングでの「セットアップ/静止値」の使い方について書いてみます。
modoのセットアップモードには、セットアップモード専用の値として「セットアップ/静止値」があります。スケルトンに位置コンストレインなどを提供してリグを構築する場合は、セットアップモードでチャンネルを右クリックして「セットアップ/静止値に適用」することで、セットアップモード内に値を設定することができます。

■ サンプルファイル

 

セットアップモードの記事で書いた通り、バインドしたスケルトンのトランスフォームには自動的に「セットアップ/静止値」が設定されます。

もし手動でリグを構築しているときに、シーンの編集がセットアップモードに影響をあたえてしまう場合は、「セットアップ/静止値」を明示的に適用してあげるといいと思います。

 

キャラクターリグ用のプラグイン、CharacterBoxではセットアップモードONとOFFでトランスフォームの値が変わります。このためトランスフォームチャンネルに直接チャンネルをリンクするとセットアップモード内の値を上書きしてします。

こういうリグには条件式の「A は B と等しい」を使用するとよいです。「値 A」のチャンネルに「セットアップ/静止値」として1を設定し、セットアップモード OFFのとき 0 に設定します。
以下の画像は足の角度でスカートを自動的にアニメーションさせるためのリグをテストしたものです。

■ サンプルファイル

 
尾リグはプライマリ トランスフォームの値を使用して遅延したアニメーションを実行します。プライマリ トランスフォームのチャンネルを直接書き換えるとセットアップモードの値に影響をあたえてしまうので、条件式を使用してセットアップモードを判断してます。
条件式の「A は B と等しい」を使用することで、セットアップモード ONのときは「出力 True 値」としてスケルトンの「セットアップ/静止値」が出力され、セットアップモード OFFのときは「出力 False 値」として Relationship の値を出力するようにしてます。

 

再利用可能なリグを作る場合はシーンでの編集がセットアップモードの位置に影響をあたえないように、トランスフォームに「セットアップ/静止値」を設定しておくといいような気がします。

Tips

modoで重心制御リグ

modoで重心を制御するリグの作り方について書いてみたいと思います。両足の位置から、自動的に腰の位置を移動してくれるリグです。

■ サンプルファイル

 

スケマティックはこんな感じで、処理自体は単純です。

両脚のIKゴールの「ワールド位置」を Matrix Blend にリンクします。Matrix Blend はその名の通りマトリクスをブレンドするノードです。「ブレンド」を50%にするとIKゴールの中間の位置を出力することができます。

Matrix Blend の「マトリクス出力」を Matrix Vector にリンクして、マトリクスを「移動」の XYZ軸に分解します。分解した「出力 X」と「出力 Z」はそのまま腰のスケルトンの「位置X」「位置Z」にリンクします。これでIKゴールを移動したときに、腰の位置は2つのIKゴールの中間に位置するようになります。

腰のプライマリのトランスフォーム「位置X」「位置 Z」に直接リンクすると、移動ツールで自由に腰の位置を調整できなくなりアニメーションの作成で不便です。そこで腰のスケルトンにトランスフォームアイテムを追加して、追加したトランスフォームを制御用に使用します。 画像だと「CenterControlTransform」が追加したトランスフォームアイテムです。

腰のY軸を制御するために Measure Distance を使用します。 Measure Distance はその名の通り距離測定ノードで、IKゴール間の距離を出力できます。IKゴール間の距離が離れた場合に腰の位置を下げたいので Measure Distance ノードを使用しました。
Measure Distance の「距離出力」と Matrix Vector の 「出力 Y」を Relationship を使用して値を調整します。2つの Relationship を足した値を腰の「位置 Y」にリンクします。

2点間であれば Matrix Blend は便利ですね。値を足したり割ったりしなくてよいのでスケマティックが単純です。

 

このリグで雑に歩行サイクルをつけてみました。IKゴールに1サイクルのキーを設定して、カーブの繰り返しで前進しています。画像のように腰の位置をつねに中間にすると機械的で不自然な動きになります。Matrix Blend のブレンド チャンネルを使用して腰の位置を細かに制御を加えてみると面白いかもしれません。あとは骨盤の回転やタイミングのズレを再現とかでしょうか。

最終的には手動で調節するとして、アニメーションの補助として組み込んでみると面白いかも知れません。

 

この重心制御は Project:Messiah のサンプルファイルに入っていたT-Rexが元ネタです。リギングという言葉が一般化する少し前の時代、自動制御されたキャラクターセットアップに衝撃を受けました。現在ではFullBodyIKのように自動制御で動くとポーズ設定しづらいのであまり好まれないのかも知れませんが、リグの研究としては面白いジャンルだと思います。

T-Rexでは腰の位置の制御の他に、ゴールの高さで足が自動で回転するエクスプレッションが書かれてました。懐かしい。

参考資料

The Food Thief RIGG

Mayaの猫のリグブレイクダウン。自由度が凄い。目と口が体と別メッシュなのが面白い。

Tips

modoのタイムノード

modoのタイムモディファイヤについて書いてみたいと思います。タイムモディファイヤはその名の通り時間に関係したチャンネルモディファイヤです。

下の画像は砲台が出てくるアニメーションを設定した後に、Time Offsetを使用してアニメーションの再生速度を制御したものです。メカの変形アニメーションの速度をカットごとに変えたい場合に、リグとして組んでおくと便利に使える気がします。キーフレームは等間隔になるよう設定しておくと、タイミング調節がしやすくなると思います。

 

Time

現在の時間またはフレーム数を出力するシンプルなノードです。何に使うのかイメージしにくいかもしれませんが、毎フレーム値をカウントアップしたい場合や、条件式と組み合わせてタイマー的にパーティクルを制御したりに使用できます。

 

Time Cycler

アニメーションの繰り返し再生を制御するノードです。グラフエディタの「動作」にも同じような設定がありますが、Time Cycler の場合は「完了」の値で繰り返し回数を制御できます。
「オフセット反復」は「入力マトリクス」に対応していなようで、「入力値」から「出力値」を使用した場合に動作するようです。

 

Time Offset

アイテムのアニメーションをオフセットするノードです。残像のようにアイテムが追従するアニメーションを作成することができます。タイプを「定数」にすると、アニメーションの再生速度を制御できます。

単純にアイテムを追従する場合はmodo10.2から追加されてた Simulation Follower の方が加速度がついていい感じになると思うので、アニメーションの再生速度を制御する使い方の方が便利な気がします。
Time Offset で少し残念なのが、マトリクスチャンネルが複数のリンクに対応していないことです。modoのスケマティックは1ノードまでは循環参照を許可しているのですが、位置、回転、スケールのそれぞれをTime Offsetしたい場合は、各チャンネルの数だけTime Offsetノードが必要になります。

循環参照しなくてよい場合は、Matrix Composeを使用して位置、回転、スケールを1つのマトリクスにするといいです。Matrix Compose の「マトリクス入力」はリンク順で計算するの、スケール、回転、位置の順番でリンクする必要があります。

 

Time Warp

カーブを使用してアニメーションを制御するノードです。Time Offset と同じような機能ですが、再生を反転したりカーブで細かな制御ができます。

 

Time Offsetで砲台のアニメーションを制御するのは、Project:Messiahのサンプルファイルを思い出したので作ってみました。modo 12.1からは Driven Actions というアクションの再生速度を制御する機能が搭載されているので、今となってはノードを使う機会は少ないかも知れません。

CG News

MODO – CharacterBox tutorials

CharacterBoxを使用したキャラクターのセットアップ方法を解説した動画が公開されています。フェイシャルのセットアップやアクションなどCharacterBoxの使用にかかわらず参考になる動画シリーズです。
作者の方は日本のCMも制作されてて、ナブテスコの企業CMでもmodoとCharacterBoxを使用していました。

 

 

Tips

modoのリプリケータでモーフ制御

modoのリプリケータで複製したアイテムのモーフ制御する方法について書いてみます。
modoにはリプリケータという、アイテムを頂点やパーティクルの位置に複製する機能があります。この複製したアイテムのモーフを制御したいことがあります。

modo 12 からは MergeMesh を使用することで、リプリケータのモーフを制御できるようになりました。モーショングラフィックなんかで、シーケンシャルにモーフを変更したい場合にフォールオフを使用してアニメーションすることができます。

 

Radial Falloff を使うとこんな感じです。

スケマティックはこんな感じです。

Cube には球体になるモーフマップを作成しています。背景コンストレイントで適当に作った物です。MergeMeshを使用すると、Morph Influence にはCube のモーフマップを設定できるようになります。Morph Influence に設定したフォールオフをアニメーションするとモーフをアニメーションさせることができます。

もちろんParticleにも使えます。花や傘が開くアニメーションなんかに使えそう。

難点は MergeMesh を使用するので、ポリゴンが多いと処理が重くなります。リプリケータのモーフを直接制御できれば便利で軽そうなんですけどね。

 

参考

https://community.foundry.com/discuss/topic/139207/using-falloff-to-control-morph-animation-along-replicas-solved-using-modo-12?mode=Post&postID=1121667

Tips

modoでグリッドアセンブリの作り方

手続き的にグリッドを表示するアセンブリの作り方を書いてみます。

modoのロケータはデフォルトで十字アイコンですが、「シェイプ」を「カスタム」にすることで、リギングに使えるプリミティブ形状を設定することができます。LightWaveには「Item Shape」という同じような機能があるのですが、modoに搭載されていないシェイプ形状として「 グリッド 」があります。

modo11.0からプロシージャルメッシュを「ワイヤフレーム」表示することができるようになったので、プロシージャルのCubeをリギングすれば簡単にグリッドのアセンブリを作ることができます。

アセンブリの中身はこんな感じです。

作り方で迷いそうなのは、軸XYZを切り替えたときにCubeのサイズXYZへの出力を切り替える部分でしょうか。
軸の切り替えはチャンネルタイプ「軸」の値を、条件式ノード「A は B と等しい」を使用してスイッチしています。値が等しい場合は「1」を、値が異なる場合は「0」を出力します。
あとは条件式ノードの出力値を演算ノードで乗算することで、指定された軸にみえるCubeの「サイズ」にのみ「Scale X」「Scale Y」の値が流れるようにしています。

スクリプトとかプログラム的なことはよくわからないので、条件式を使った切り替え方法としてこういう使い方が正しいのかわかりませんが、やりたいことはできている気がします。

補足ですが、ビューポートでアイテムをワイヤフレーム表示するには「3Dビューポートプロパティ / アクティブメッシュ」で、「描画スタイルの独立」をONのする必要があります。

 

Cubeの大きさに合わせてセグメントの分割数を増やす動作は、モデリング系のアセンブリにも使えるんじゃないかと思います。