Rigging

Tips

modoのマトリクスチャンネル

チャンネルタイプの続きで、modoのマトリクス(行列)チャンネルについて書いてみます。
普通に3Dソフト使ってたときはマトリクスって何?という感じでよくわかってませんでした。今も正確なとことろは全くわかってませんが、リグを構築するにはマトリクスチャンネルの使い方を知っておくと便利です。

 

マトリクスチャンネルとは

マトリクスチャンネルはアイテムの「位置XYZ」「回転XYZ」「スケールXYZ」が全部セットで格納されてるようなチャンネルです。

もう少し詳しく書くと、マトリクスは3Dの座標変換になくてはならないもので、これがなければ親子関係も何もはじまらないくらい3Dの根源的な物っぽいです。
一般的に3DCGでは「位置XYZ」「回転XYZ」「スケールXYZ」と便利関数がセットになった、4×4の行列を使用するそうです。正しく理解したい人は座標変換に詳しい人に聞いてください (´Д`υ)

 

何ができるの?

リグ作ってるとアイテムの回転や位置が欲しいことが多々あります。そんなときマトリクスチャンネルを使用して「位置」「回転」「スケール」を取り出すことができます。逆に「位置」「回転」「スケール」を行列にすることもできます。
コンストレイント系モディファイヤはマトリクスチャンネルを使用してるので、マトリクスの分解と再構築方法を知ると様々なリグに応用できると思います。

modoには便利なノードが用意されてるので、マトリクスが何かという難しいことを知らなくてもリグを作ることができます。よく使う便利なノードについて書いておきます。

 

Matrix Vecto

マトリクスから位置を取り出すことができます。回転行列をリンクすると正規化された方向ベクトルを取得できます。

 

Matrix To Euler

マトリクスから角度を取り出すことができます。
オイラーは「回転順序」によって回転結果が変わるので注意が必要です。数学的にそういう物らしいので、出力した角度がなんか違うなと思ったら「回転順序」を変えてみるといいかもしれません。

 

Matrix Construct

「位置」「スケール」をマトリクスにすることができます。

 

Matrix From Euler

角度を回転行列にすることができます。

 

座標変換の知識があれば「ワールド回転からローカル角度を計算する方法」のように3D空間で必要な様々な値を取り出したり便利に使えるみたいです。
マトリクスチャンネルは「ワールド位置」「ワールド回転」「ローカル」など色々ありますが、チャンネルにどんな値が入ってるかは「マトリクスの計算順」が参考になると思います。

次はマトリクスチャンネルを使って、アイテムやカメラの位置をシーケンシャルにブレンドするマトリクスミキサー的なリグについて書いてみます。

Tips

modoでアイテムのスナップ移動

Channel RelationShipで紹介したグリッドにスナップしたように移動する方法で思い出しましたが、演算の「切り上げ」「切り下げ」ノードを使って正数を出力しても同じ表現ができるので、その方法について書いてみます。

「切り上げ」「切り下げ」そのままだと、スナップする間隔が指定できません。
任意の大きさでスナップする計算方法は以下の通りです。

  1. 「位置」÷「スナップする間隔」の値を「切り上げ」ます。これで何マス移動したかを求めます。
  2. 「切り上げ」の出力値を「スナップ間隔」でかけてやります。これでアイテムの位置を求めます。
  3. グループロケータの「SnapSize」と「XYZ」はユーザーチャンネルです。
    「SnapSize」は浮動小数点数タイプのチャンネルで、スナップする間隔を入力します。例えば 1 を入力すると 1m 間隔でスナップします。

ロケータの位置をアセンブリを経由してトーラスの位置に出力すると、トーラスがスナップしながら移動するようなアニメーションになります。

このスナップ計算は以前ゲーム作ろうと思ってマップチップ移動調べたときに、チュートリアル見て覚えました。こういう計算は自分では全く思いつかないので、ゲーム系の解説しているサイトはすごくためになります。

modoのパーティクルはアイテムと同様にモディファイヤで制御することができます。パーティクルに今回作ったスナップ アセンブリを使用すると、パーティクルの位置をスナップさせることができます。

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

トーラスからSurface Emitterを使用して、寿命が1フレームのパーティクルを発生します。
Particle Operatorを使用してパーティクルの「位置」を、Collector / Emitterを使用して別のParticle Simulationに継承します。このときスナップアセンブリを使用して、パーティクルの位置が一定間隔にスナップする設定しました。
右下のParticle Operatorは「寿命」と「サイズ」をChannel RelationShipを使用して、発生後30フレーム経過したら小さくなって消えるようしています。

パーティクルのスナップの処理はレゴ風エフェクトに使えないか試したのですが、パーティクルの発生数が多いと同じ座標に複数のパーティクルを重なった状態になって使えませんでした。パーティクル制御の参考になるかと思ったので失敗例として公開しておきます。

アイテムとパーティクルの両方で同じアセンブリが使えるのは、機能ごとに似たような別の仕組みを覚え直す必要がなくてとても便利ですね。

Tips

modoでトラックパッド コントローラーを作る方法

今回はスライダーの作り方の続きで、トラックパッドコントローラーの作り方について書いてみたいと思います。

スライダーはY軸のみ使用しましたが、トラックパッドコントローラーはXYの2軸を使用します。作り方は基本的に同じです。違いがあるとすれば、平面の位置にどのように値をマッピングするか?という部分を少し考える必要があります。

顔などのモーフマップを制御することを想定して、値のマッピングのしかたをいくつか紹介してみたいと思います。スライダーのときと同じで、トラックパッドの平面のサイズは1m (-500mm~500mm) の範囲を制御領域としています。

Clampノードやチャンネルのロックなどの説明は省くので、Clampは何に使ってるの?という方は前回のスライダーの作り方を参照してみてください。

 

2モーフを制御する方法

上下の位置で2つのモーフマップを制御する方法です。単純に上下2つのモーフならスライダーでもできますが、左右の位置をMorph InfluenceのFalloffの制御に使用してみました。

これは目のまばたきのような左右対称のモーフで使用することを想定したマッピングです。
一般的に目のモーフを作成する場合は「両目閉じ」のモーフを1つ作り、そこから「左目閉じ」「右目閉じ」と複数のモーフに派生させると思います。modoのデフォーマはFalloffを使用して変形する範囲を制御できるので、両目閉じのモーフ1つあれば「左目閉じ」「右目閉じ」のモーフを作らなくていいかもしれません。

モーフマップは以下のような2種類です。

マッピングのイメージは以下の通りです。
グラデーションはモーフマップの数と、モーフインフルエンスの「強さ」の段階をイメージしています。

アセンブリの中身は以下の通りです。グラフはChannel Relationshipの設定です。

コントローラーの「位置Y」をChannel Relationshipを使用して Morph Influence の「強さ」に出力しています。
「位置X」を使用してFalloffの方向を指定しています。画像では条件式ノードの「A は B より大きい」を使い、「位置X」が0より大きい場合は「出力True値」として「90」、0より小さい場合は「出力False値」として「-90」を出力します。この出力をFalloffの「回転Y」にリンクすることでモーフの領域を左右どちらかに制限しています。画像ではわかりやすくFalloffのサイズを大きめに設定していますが、小さく設定すればキッチリ左右でモーフをわけることができます。
「アセンブリ出力」するチャンネルには、ユーザーチャンネルを経由したものを使用しています。

 

4モーフを制御する 1

左右の位置、上下の位置で4つのモーフマップを制御する方法です。
比較的単純なマッピング方法で、隣り合う2つのモーフマップを制御できます。目のウインクと同時に、口元や頬のモーフを制御するような使い方でしょうか。

モーフマップは以下のような4種類です。

マッピングのイメージは以下の通りです。

アセンブリの中身は以下の通りです。

XYの2軸ですが特別な設定はなく、ほぼスライダーと同じ感じで作れると思います。
Channel Relationshipの出力先が少しこんがらがるかも知れませんが、1つずつ確認すれば難しくないと思います。これもアセンブリ出力にユーザーチャンネルを経由させています。

 

4モーフを制御する 2

左右上下の4つの象限それぞれ独立してモーフマップを制御する方法です。象限ごとに出力値が独立しているので、モーフ以外にも色々使える気がします。

マッピングのイメージは以下の通りです。

アセンブリの中身は以下の通りです。

各象限ごとにX軸とY軸用のChannel Relationshipを用意し、出力値をかけた値をモーフインフルエンスに出力しています。位置はChannel Relationshipを使用することで0~1の範囲にリマッピングされているので、X軸とY軸の出力値ををかけることでコントローラーがいる象限の値のみが出力されます。
個人的にこの制御方法を一番作りたかったのですが、どう計算すればいいのかわからなくてしばらく悩んでました。完成してみると凄く単純ですね。

この記事ではChannel RelationShipを使用していますが、Expressionノードや演算ノードの組み合わせでも同じ事ができると思います。好みに合った方法を選択するといいと思います。

また、今回紹介した制御方法は1軸ごとに1モーフのような単純な物です。コントローラーが便利になるのは複数のモーフマップをミックスして制御するときだと思います。たとえば目のまばたきの中間状態を制御したり、眉毛の移動に合わせて額のシワを制御したりという感じです。

 

おまけ

複数のモーフマップをどのようにすれば自由自在に制御できるのか?というマニアックな電子書籍「The Art of Moving Points」を紹介しておきます。
国内の制作事例を見ると最終的な表情のモーフがずらり並んでる事が多いですが、決め打ちではなく汎用的に使用できるモーフとは?みたいな内容です。

The Art of Moving Points

フェイシャルリグで参考になりそうな記事へのリンクも貼っておきます。1つのコントローラーで複数のパラメータを同時に制御することで、とてもリアルなフェイシャルを表現している気がします。
資料をブログで管理してると検索が楽でいいですねー

Tips

modoで数値チェッカーの作り方

リグを作ったりノードの機能を調べてるときに、チャンネルが出力してる値を確認したいことがあると思います。今回はそんなときに便利な数値チェッカーの作り方について書いてみます。

ノードの出力チャンネルを「チャンネルセット」に追加してビューポートに表示する方法もありますが、アセンブリプリセットとして再利用できるようにロケータの「注記」表示を使います。作り方は簡単です。

作成手順です。

  1. ロケータを作成して、表示タブから「注記を追加」します。
    注記は「ライン1~8」に入力した文字列をビューポートに表示するメモ機能です。「表示」をオンにして、アイテムを選択していない状態でも注記が表示されるようにします。「不透明度」を100%にして見やすくしました。
  2. チャンネルビューポートに「ライン」チャンネルをスケマティックに追加します。
  3. Encode String ノードを追加してラインチャンネルにリンクします。
    Encode String は「値」を「文字列」 に変換するノードです。ラインチャンネルを見ると「abc」アイコンがついてますが、これはチャンネルタイプが「文字列」であることをあらわしています。「値」と「文字列」ではチャンネルタイプが異なるので、「位置X」を直接「ライン1」にリンクすることができません。そんなときはチャンネルタイプを合わせる必要があります。
  4. Encode String の「値」に「位置」チャンネルをリンクすると、文字列として値が表示されます。
    値の桁数は Encode String の「小数桁数」で変更できます。見た目はロケータの「シェイプ」や「ワイヤフレームの色」でカスタマイズすると見やすくなります。

こんな感じでアセンブリプリセット保存すれば、いつでもシーンに読み込んで使用できます。

ロケータを削除したときシーンに Encode String ノードが残らないよう、Encode String ノードは「item.parent」コマンドでロケータの子にしておくと便利です。

出力値が確認できると複雑なリグを作る場合でもデバッグしやすくて便利なのでおすすめです。

Tips

modoでスライダーコントローラーを作る方法

今回はキャラクターリグでよく見かけるスライダーコントローラーの作り方を書いてみます。
作り方は簡単で前回の記事で紹介した Channel Relationship と Clamp ノードを使用します。アセンブリプリセットとして保存したとき便利なように、いくつか追加のステップがあります。

作成手順です。

  1. スライダーバーと、スライダーノブを準備します。スライダーバーとスライダーノブは移動しやすいように親子関係を設定しています。
    スライダーはアイテム位置を取得できれば基本的にどんなアイテムを使用しても問題ありません。今回はロケータのカスタム シェイプを使用してスライダーバーとスライダーノブにしました。
    スライダーバーには平面の「サイズY」は1mです。サイズは好きに設定して問題ありません。
  2. スライダーノブの「位置X」「位置Z」チャンネルをロックします。
    プロパティで「位置X」「位置Z」チャンネルを選択して、右クリックメニューから「ロック/ロック解除」を設定します。これでノブが左右に移動することはありません。
  3. スライダーノブの「位置Y」をスケマティックに追加します。
  4. Clamp ノードを追加し、「入力」と「出力」を「位置Y」にリンクします。
    Clamp のプロパティで「最小」を-0.5、「最大」を0.5に設定します。位置チャンネルでは 0.5=500mm としてあつかわれます。スライダーバーの高さは1mに設定しているので、ノブの移動範囲を-500mm~500mmに制限したことになります。
  5. スライダーバーアイテムに「ユーザーチャンネル」を追加します。
    好きな名前をチャンネルを追加します。チャンネルタイプは「浮動小数点」を使用しましたが、数値をあつかえればどのタイプでも大丈夫だと思います。「ユーザーチャンネル」を追加するアイテムも好みで選んで問題ないです。
  6. Channel Relationship ノードを追加し、「入力」を「位置Y」とリンクします。「出力」を作成した「ユーザーチャンネル」にリンクします。
    なぜ Channel Relationshipを「ユーザーチャンネル」にリンクしたかというと、スライダーを「アセンブリプリセット」として再利用するためです。
    ノードのチャンネルを直接「アセンブリ出力」にリンクした場合、アセンブリのロードで出力チャンネルが消えてしまうことがあります。消える理由は謎ですが、「ユーザーチャンネル」を経由させることでアセンブリの保存と読み込みが正常にできるようになります。
  7. Channel Relationship と Clampノードをアイテムにペアレントします。
    アイテムツリーで Channel Relationship 、 Clamp 、スライダーバーアイテムの順番選択して、コマンド行に「item.parent」を入力してEnter。チャンネル モディファイヤノードの親子関係を設定します。こうすることでアセンブリプリセットとして他のシーンにアイテムを読み込んだ場合に便利になります。modoのチャンネル モディファイヤはデフォルトでシーンアイテム(カチンコ)以下にノードを生成します。チャンネルモディファイヤをアイテムにペアレントしておくことで、スライダーバーアイテムを削除したとき同時にチャンネルモディファイヤも削除されるためシーンに未使用ノードを残さずに済みます。

 

ノードが組み上がったら「スケマティックアセンブリ」を新規に追加して、スケマティックのマウス右クリックメニューから「ノードの移動先」を使ってアセンブリ内にノードを移動します。

上の画像にはグループロケータが含まれています。個人的な好みですが、アイテムツリーではスケルトンもロケータも同じアイコンで見づらいので、アセンブリを保存するときはアイテムをグループロケータにまとめています。グループロケータはアセンブリ内に入れておくことで、親子関係を維持したままアセンブリを読み込むことができます。

アセンブリに「サムネイルを置換」でサムネイルを追加して、「アセンブリプリセットの保存」すると、いつでもシーンにスライダーを読み込んで再利用することができます。

 

最後に指をスライダーで制御するデモです。
スライダーバーの高さを1mで作りましたが、スケールを使ってシーンで見やすいようにサイズを調整できます。なかなか便利なんじゃないかと思います。

次回は引き続きボックス型のスライダー?トラックパッド コントローラの作り方について書いてみたいと思います。

Tips

modoのチャンネル リレーションシップ

リギングで凄く便利な最強ノード、Channel Relationshipについて書いてみます。Channel Relationshipは入力されたチャンネルの値にもとづいて、出力の値を変えることができる便利なノードです。

例えばロケータの位置を使用して別のアイテムを回転することができます。

上の画像ではロケータがY軸に1mに移動しとき円柱は180°回転しています。
それの何が便利かというと、Relationshipはチャンネルタイプによって単位の異なる値をリマップすることができるからです。
Relationshipを使用せずに「位置Y」を「回転Z」に直接リンクした場合は、1m=1 という値が回転に出力されるため 1° しか回転しません。Relationshipを使用することで、1m=180°という異なる単位の値を簡単に変換して制御することができるようになります。

さらにRelationshipが便利なのは、入力と出力のマッピングにグラフエディタを使用できることです。
値をマッピングするためのカーブはベジェハンドルで編集できるので、位置が移動するにつれて徐々に回転数が上がっていくという設定が手軽にできます。
グラフエディタでは「入力」が横軸、「出力」が縦軸で表示されます。

 

Channel Relationshipの使用例として、角度によってスケルトンが移動するリグを作ってみました。簡単に作れて便利です。

作成手順です。

  1. バインド済みのモデルとスケルトンを準備します。
  2. スケルトンを選択して、「回転Y」「位置Z」チャンネルをスケマティックにドラッグアンドドロップします。
  3. Channel Relationship を追加し、「回転Y」を「入力」にリンクします。
  4. スケルトンの「位置Z」の値をコピーします。
  5. Channel Relationshipの「出力」を「位置Z」にリンクします。
  6. グラフエディタの「値」チャンネルでキーを選択し、キーにコピーした「位置Z」の値を設定します。
  7. -90°にキーを作成し値を調節します。
    これはスケルトンが-90°に回転したとき、スケルトンの位置Zをどのくらい移動するかを指定しています。

 

この例ではFKを使用してますが、IKを使用したい場合には「ワールド回転からローカル角度を計算する方法」または「角度測定ノードで360°測定する方法」が参考になると思います。
もしスケルトンはスライドさせず回転の基点になる位置を変えたい場合は、ピボットを使うとよいです。

Channel Relationshipを使うと手の回転にあわせて腕をひねったり、アイテムの位置でライトの色を変えたり、アイテムの回転でパーティクルの放出量を制御したり、アイデアしだいでいろんなリグを作ることができて楽しくなりますね。

 

おまけ

modoは1ノードまでのループなら「依存ループ」にならず機能するという便利な特長があります。「依存ループ」というのはチャンネルの値を他のノードで計算して、その計算結果が同じチャンネルに戻ってループした状態を言います。値がループしてるので通常は計算不能でエラーになる処理なのですが、modoでは1ノードのループ限定で動作するようです。

下の画像のように自分の「位置Y」から「位置Y」にループしてリンクすると、Y軸の移動範囲を制限することができます。同じ事は Clamp ノードでもできるので好きな方を使ってみてください。

 

カーブを1m間隔のステップにすると、1m感覚でナップ移動するような動作になります。昔の2Dゲームにあったマップチップ単位で移動するような動きですね。モーショングラフィックなんかにも使える気がします。

次はRelationshipを使って「ホーミングミサイル」や「Sculpt Layer」の記事で使ってる、スライダーのようなコントローラの作り方について書いてみます。こういうコントローラがあると一気にリグ作ってる感じがしますね。

CG News

modo用プラグイン「Channel Chimp 2」リリース

MIDIコントローラ、ゲームパッド、スマートフォンを使用してリアルタイムに操作したアニメーションを記録することができるプラグイン「Channel Chimp 2」がリリースされました。
http://www.apptastic.com/chimp/

 

概要

Channel Chimp 2はこれまで以上にModoをコントロールすることができます!
新しいWebブラウザインターフェイスでは、スマートフォンやタブレットがModoのインタラクティブコントローラになります。リアルタイムのパフォーマンス、キーアニメーション、およびModoの機能を制御できます。

Channel Chimp 2はバーチャルリアリティコントローラをModoにもたらし、クリエイティブな可能性の新しい世界を開きます。使いやすいアセンブリを使用することで素早くオーガニックカメラの動きを作成したり、車両のアニメーションを作成したり、フェイシャルアニメーションを作成したり、Modoのタイムラインを制御したりできます。

また、手頃な価格のインディー・プライス・オプションを導入しました。

 


直感的な操作で素早くキャラクターをアニメートします。手動でキーポーズ、またはリアルタイム操作をモーションキャプチャして有機的なアニメーションを作成します。

 


リアルタイムのモーションキャプチャ録画で、車両のアニメーションやウォークスルーを作成します。

 


あなたのアニメーションに手持ち式カメラモーションを追加します。 スマートフォンやタブレットを搭載したジャイロスコープからのリアルタイム モーションキャプチャで、リアリスティックで自然なカメラの動きを作成します。

 


Channel Chimpはバーチャルリアリティコントローラをサポートします。 VRヘッドセットとコントローラの動きを記録して、モーションキャプチャしたアニメーションを作成します。

 



カスタムインターフェイスを使用すると、Modoの使用に新しい効能が得られます。 Modoの任意のチャンネルを制御できるだけでなく、さらに多くの可能性のためにコマンド、スクリプト、マクロをトリガーすることもできます。

Tips

modoで参照アイテムを統合する方法

参照アイテムをシーンに統合する方法について書いてみます。参照は便利な機能ですが、アイテムの参照をやめたいときがあります。

参照アイテムをシーンに統合したいときは、「参照アイテムを統合」をONにしてファイルを保存します。ファイルを開き直すと参照アイテムがシーンに含まれた状態に変わります。
ファイルを保存したら「参照アイテムを統合」をOFFに戻さないと、参照が使えなくなるので注意が必要です。

  • 初期設定 / デフォルト / シーンの保存/書き出し / 参照アイテムを統合

 

参照とは

modoには「参照」というシーンの構築に便利な機能があります。
例えばアニメーションを作成するとき、カット単位でファイルを保存していたとします。「Cut_01.lxo、Cut_02.lxo、Cut_03.lxo… 」みたいな感じです。シーン内では全て同じ椅子や机を使用していますが、カット作成が進んだ段階で椅子のデザインを変更したい時があります。
当然すべてのカットの椅子に変更を加えたいと思います。カット数が少なければファイルを開いてポリゴンのペーストを繰り返せばいいのですが、数が多いと大変です。そんな問題を解決する機能が「参照」です。

あらかじめシーン内のアイテムを「Chair.lxo」「Desk.xlo」のように個別のファイルとして保存しておき、「参照を読み込み」を使用してシーンを構築することで、「Chair.lxo」に加えた変更が各カットのファイルに反映される仕組みです。

多くの3Dソフトには参照機能があります。ソフトによって機能は様々ですがMayaの参照機能が強力で有名です。例えばMayaではほとんどの機能や設定がノードとして管理されているのですが、チャンネルのキーフレームも個別のノードとして存在しているので、必要であればキーフレームを参照するような使い方ができます。
modoの参照には制限があるのでキャラクターリグのような複雑な構造やアクションの参照にはお勧めしませんが、モデルの参照は使えるかもしれません。

Tips

modoのチャンネルタイプ

チャンネルの基本の続きで、チャンネル タイプについて書いてみたいと思います。

modoのチャンネルには下の画像のように様々なタイプが存在しています。正数、浮動小数点数、パーセント、色、チェックボックス、リストボタンなどプロパティに表示されてるので、普段から何気なく使ってると思います。
プロパティに表示されないチャンネル タブには「行列」と「クォータニオン」がありますが、これらのチャンネルはチャンネル ビューポートから確認することができます。

○アイコンのあるチャンネルは全て数値で制御することができます。
数値のチャンネル通しはもちろんですが、例えばブーリアンタイプ(チェックボックス)のチャンネルは「0」のときはOFF、「1」のときはONのように制御することができます。
下の画像はChannel Relationshipを使用して、ロケータの位置 0~1mの範囲をTrueとFalseに設定しています。

アイテムの「可視性」のようなリストも、リストの順番で0~4のような値で制御することができます。

数値のチャンネルだけでなくチェックボックスやリストも制御できるのは便利ですね。数値で制御できないチャンネルタイプとして「行列」「クォータニオン」「文字列」があります。これらのチャンネルは専用のノードを使用することで値を取り出したり、値を文字列に変換することができます。
アイテムの「ユーザーチャンネル」タブでは、これらのチャンネルを自由に追加してリグで利用することができます。
この仕組みはMayaの「追加のアトリビュート」と同じなので、興味があればMayaのサイトを見てみるといかもしれません。

次回はリギングに欠かせない便利ノード、Channel Relationship について書いてみます。

Tips

modoのスケルトンをダイナミクスで動かす方法

スケルトンによる変形と物理演算を併用する方法について書いてみます。
結論から言うとそれっぽく動くけど、スケルトンのフリップを回避できませんでした。用途によっては使えるかもしれないので問題点を含め手順を書いておきます。

今回試した方法はソフトボディ計算したメッシュに、スケルトンを「ポリゴンの位置」「ポリゴンの法線」コンストレイントする方法です。

作成手順です。

  1. スケルトン、バインド済みのメッシュ、ソフトボディ計算用のメッシュを準備します。
    ソフトボディはあらかじめ「シミュレーションを演算」でキャッシュを作成しています。
  2. セットアップモードをONにして、スケルトン、メッシュの順に選択して「ポリゴンの位置」コンストレイントを適用します。このとき補正オプションはONです。
  3. 同じ要領で「ポリゴンの法線」コンストレイントを適用します。
    「ポリゴンの位置」コンストレイントは位置をポリゴンにくっつけてくれますが、スケルトンに回転の情報は伝わりません。「ポリゴンの法線」コンストレイントを使用することで位置と回転をスケルトンに与えています。
  4. セットアップモードをOFFにしてアニメーションを再生すると、スケルトンによってバインドしたメッシュが変形します。
    ここでスケルトンは動くのにバインドしたメッシュが変形しない場合は、シーンを「保存」した後に「ファイル / 復帰 」を使用してシーンをリロードすると正しく動くようになります。おそらくダイナミクスのキャッシュとデフォーマの評価順に問題があって、シーンロード時にだけ正しく動作してる気がします。

一見それっぽく動いてる用に見えますが、よく見るとスケルトンがフリップしてるのがわかります。ソフトボディの計算でポリゴンがゆがんでるのが原因だと思いますが、ソフトボディでポリゴンを安定させるのは大変な気がします。

ポリゴンにスケルトンをコンストレイントする方法はスカートのように厚みのないメッシュに向いてると思います。厚みのあるモデルはチェーンの作り方のように、パスコンストレイントしたカーブに「ダイナミックカーブ」を使用すると、メッシュの「半径グラディエント」を衝突判定に使用することができるので便利かも知れません。

 

スケルトンとダイナミクスの問題点

modoのダイナミクスはメッシュかカーブがないと衝突判定の範囲を制御できません。スケルトンに「アクティブリジッドボディ」を適用して「衝突実行」をONにすると物理計算はできますが、コリジョンサイズが 1m 固定になってしまいます。
どこかでコリジョンサイズを変更できれば、ピンやスプリングコンストレイントを使ってスケルトンを物理計算できるようになる気がします。下の画像はシーン全体を1mのコリジョンにあわせたものです。

スケルトンを使うとアニメーションをベイクできるので、他のソフトにモーションを出力できるというメリットがあります。modo内で完結するならラップデフォーマのケージメッシュにソフトボディを適用する方法が手軽かもしれません。

Tips

modoで親アイテムの回転をキャンセルする方法

今回はアイテムが親子関係にありながらも、観覧車のゴンドラのように子アイテムが親アイテムの回転をキャンセルする方法をいくつか紹介します。

親アイテムの回転キャンセルはキャラクターリグやメカニカルな物のアニメーションで便利に使えます。
たとえばキャラクターリグでは、3dsMaxのBipedは胸を回転しても頭や腕に回転が影響しないようなリグになってます。modoのACSもデフォルト設定では胸の回転から頭が独立しています。メカニカルな物だと観覧車のゴンドラや自転車のペダル、ジャイロスコープのような表現に使えると思います。

 

トランスフォームの継承

modoは位置、回転、スケールごとに継承するトランスフォームをキャンセルすることができます。ソフトによって動作は異なりますが、MaxやMayaも同じようにトランスフォームの継承に関する設定があります。歴史的に古くからある方法の1つだと思います。
「回転コンストレイント」を使用した場合と違い、ゴンドラを直接回転して編集することができます。

作成手順です。

  1. 円盤にゴンドラが4機ペアレントされているシーンを準備します。
  2. グループロケータを4つ作成します。
    グループロケータを1つ追加したら、残りはCtrl+Dで複製します。
  3. グループロケータを円盤にペアレントします。
  4. グループロケータをゴンドラの位置に配置します。
    ドロップアクションから「一致」を選択し、グループロケータをゴンドラにドラッグアンドドロップします。ドロップアクションはアイテムをドラッグアンドドロップしたときの動作を指定する機能です。ポリゴンやセンターにアイテムを配置するときは、スナップ機能よりもドロップアクションが便利です。
  5. ゴンドラをグループロケータの子にします。
    アイテムツリーでゴンドラをグループロケータにドラッグアンドドロップします。modoのトランスフォーム継承は、親が継承するトランスフォームを子のアイテムがキャンセルするような動作になっています。このためゴンドラと回転する円盤の間にロケータをはさむ必要があります。
  6. ゴンドラアイテムを全て選択して「回転継承」を 「False」 に設定します。
    チャンネルビューポートで「回転継承」を探して、「True」をクリックして「False」に変更します。modoにはプロパティに表示されないチャンネルビューポート専用のパラメータがいくつか存在します。このトランスフォームの継承はそんな隠れた機能の1つです。

円盤を回転すると、ゴンドラが円盤の回転の影響を受けていないのを確認することができると思います。
位置継承や回転継承は、スケルトン変形とアイテムのトランスフォームが2重に掛かってしまう場合にも便利に使えます。たとえばスケルトンとバインドしたメッシュが同じ親に属してるとき、親アイテムを移動するとメッシュが2倍移動します。そんなときは位置継承を「False」にすると解決します。

 

回転コンストレイント

ゴンドラを別のアイテムの回転にコンストレイントする方法です。3Dソフトでよく使用されるのがこの方法だと思います。1つのアイテムで複数のアイテムの回転を制御したい場合にも使えます。「出力オプション」で回転のブレンド量を設定できるのも便利です。

コンストレイントを使用するとアイテムの「ワールド回転」が上書きされるため、トランスフォームの回転は無視されます。ゴンドラに個別の動きをつけたい場合は、「トランスフォームの継承」と同じくロケーターにゴンドラをペアレントして、ロケーターに対して回転コンストレイントを設定するのが一般的な使い方だと思います。

作成手順です。

  1. 円盤にゴンドラが4機ペアレントされているシーンを準備します。
  2. ゴンドラを全て選択します。最後に回転コンストレイントの参照元になるアイテムを選択します。
  3. 回転コンストレイントを適用します。
    Ctrlキーを押しながら回転コンストレイント(複数)を実行します。

手順が簡単ですね。

 

リプリケータ

リプリケータを使用して、頂点にゴンドラを複製する方法です。キャラクターリグなんかには活用できませんが、おまけです。
ゴンドラのように同じアイテムを複製するには手軽で便利ですが、ゴンドラを個別に制御したい場合には向いてません。

作成手順です。

  1. 円盤にゴンドラが4機ペアレントされているシーンを準備します。
  2. 円盤からリプリケータが参照するための頂点をコピー(Ctrl+C)します。
  3. 新しいメッシュを作成(Nキー)し、円盤アイテムにペアレントします。
    新しいメッシュが原点に作成されるので、ペアレント後にアイテム位置を0に変更して円盤と重なるようにします。アイテムの作成位置はアイテムの選択状態によって変わるので適当に合わせてください。
  4. 新しいメッシュに頂点をペースト(Ctrl+V)します。
  5. リプリケータを追加します。
    「原型となるアイテム」にゴンドラ、「ポイントソース」に頂点をペーストしたアイテム、「ソースモード」を「パーティクルデータ」に設定します。またリプリケータの位置がずれていたため、円盤と重なるように位置を0に変更しました。

この他にもスケマティックで親の回転値に-1かけたものをゴンドラの回転にリンクする方法や、ゴンドラの「ワールド回転」チャンネルに0を設定する方法もあります。例によってどれが一番いい方法かは場合によるので、好みの方法を試してみるといいかと思います。

Tips

modoでスプラインIKの作り方

キャラクターリグに欠かせないスプラインIKの作り方について書いてみたいと思います。
基本的にはチェーンの作り方と同じで、スケルトンをパスコンストレイントするだけと簡単です。

作成手順です。

  1. スケルトンとカーブを準備します。
    スケルトンは円柱にバインド済みでメッシュを変形できる状態です。
  2. 全てのスケルトンとカーブメッシュを選択し、セットアップモードをONの状態でCtrlキーを押しながらパスコンストレイント(複数)を適用します。このとき補正オプションもONにする必要があります。
    セットアップモードでパスコンストレイントする理由はバインド済みのスケルトンだからです。バインドされたスケルトンはセットアップ/静止値が設定されているため、セットアップモードOFFの状態でパスコンストレイントを実行するとセットアップモード内のスケルトン位置がおかしくなります。
  3. カーブメッシュを選択してスプラインデフォーマを適用します。
    このとき「選択メッシュを使用」をONにして、カーブのポイントの数だけロケータを作成します。
  4. スプラインデフォーマのロケータを動かすと、円柱にねじれが発生してるのが確認できます。
  5. パスコンストレイント モディファイヤの「上方ベクトル」を設定します。
    シーンアイテムの+アイコンをクリックし、パスコンストレイント モディファイヤを全て選択します。このシーンの場合は「上方ベクトル」 Zを1に設定します。

これでスプラインIKの完成です。ロケータを極端に移動するとフリップが発生する事もあると思います。その場合はチェーンの作り方と同様にアップベクトルを設定すると細かく制御できるようになると思います。

Tips

modoで自転車のチェーンを作るデフォーマ版

前回と同様に自転車のチェーンの作り方について書いてみます。今回はスプラインデフォーマを使用した方法です。

デフォーマを使用したチェーン作成 1

まずはメッシュ全体を変形する古典的なチェーンの作り方です。他の3Dソフトでも定番的に使用される方法です。

作成手順です。

  1. チェーンとカーブを用意する。
    カーブはスプラインデフォーマのターゲットカーブとして使用するので、ポイントが少ないと変形が破綻するので注意が必要です。
  2. チェーンをコンポーネントモードで「ラディアル配列」で円環状に複製します。
    プロシージャルモデリングの「Radial Array」を使ってもいいけど、次の工程のセンターをメッシュ中心に移動するのが面倒なので直接ポリゴンを複製しました。
  3. チェーンアイテムのセンターをメッシュの中心に移動します。
  4. スプラインデフォーマのソースカーブを作ります。
    真円のカーブが必要なので、プロシージャルモデリングの「Cycle」を追加してチェーンに沿うようにあわせます。
    スプラインデフォーマはプロシージャルモデリングのカーブを参照できないっぽいので、アイテムツリーから「メッシュメッシュオペレーションをフリーズ」します。
  5. チェーンアイテムに「スプラインデフォーマ」を適用します。
    スプラインエフェクタのプロパティで「ソースカーブ」と「ターゲットカーブ」を設定します。
    ソースカーブとターゲットカーブの長さの違いによってチェーンが崩れてるので、「伸縮」でメッシュの変形を調節します。
  6. チェーンアイテムを回転すると、チェーンがスプラインに沿って回転します。

これでデフォーマを使用したチェーンを作ることができました。デフォーマを設定したメッシュのトランスフォームを使用してアニメーションするのは「modoでアニメ風の眼球制御」と同じですね。

はじめはチェーンを直線状に並べようかと思いましたが、modoのスプラインデフォーマは残念なことに閉じたスプラインとして変形することができません。綺麗に回転させるには真円のソースカーブを使用するのが最適なようです。
このアイデアはWilliam Vaughanさんのビデオによる物です↓。

 

デフォーマを使用したチェーン作成 2

デフォーマとリプリケータを使用したチェーンの作り方も紹介してみます。全メッシュをデフォーマで変形する方法に比べて動作が軽く、手続き的にチェーン数を変更することができます。

作成手順です。

  1. チェーンとカーブを用意する。
    今回は真円のカーブをあらかじめ作りました。
  2. シリンダーを作成する。
    プロシージャルモデリングの「Cylinder」を追加して上下のキャップを消して、シリンダーの直径をカーブに合わせます。
  3. リプリケータを作成します。
    「原型となるアイテム」にチェーン、「ポイントソース」にシリンダー、「ソースモード」を「ポリゴンを使用」に設定します。これでポリゴンの中心にチェーンが複製されます。
    プロシージャルモデリングの「Cylinder」を使うことで、後から「サイド」の分割数を変更できるのが便利です。
  4. シリンダーメッシュに「スプラインデフォーマ」を適用します。
    スプラインエフェクタのプロパティで「ソースカーブ」と「ターゲットカーブ」を設定し、「伸縮」でメッシュの変形を調節します。
  5. シリンダーアイテムを回転するとチェーンがスプラインに沿って回転します。

 

カーブの長さに応じてチェーンの数を増やす

ついでにターゲットカーブにスプラインデフォーマを適用して、カーブの長さに応じて自動的にチェーンの数を増やすリグの作り方を紹介します。カーブの長さに応じて、シリンダーの分割数を変えるだけなので手軽に作れます。

作成手順

  1. ターゲットカーブにスプラインデフォーマを適用する。
    ロケータを移動してカーブを変形するとチェーンにすき間ができてしまいます。パスの長さが変わっているので当然ですね。
    すき間を自動的に埋めるために 「パスの長さ ÷ チェーンの長さ = サイドの数」という計算をスケマティックで構築していきます。
  2. ターゲットカーブの「メッシュ」チャンネルをスケマティックに追加します。
    メッシュオペレータ Cylinder の「サイド」をスケマティックに追加します。
  3. 「パスコンストレイント」を追加し、カーブの「メッシュ」を「長さ」チャンネルにリンクします。
    パスコンストレイントはパスの長さを出力するために使用することができます。
  4. 「乗算」「除算」ノードを追加します。
  5. パスコンストレイントの「長さ」を乗算ノードで100倍にします。
    「長さ」はメートルを出力するので100倍して値をセンチにします。単位を統一したほうが感覚的にわかりやすい気がするので100倍しましたが、無くても問題ないです。
  6. 「乗算」の出力をチェーンの長さで割ります。
    チェーンの長さを定規ツールで計って「除算」に入力します。今度はミリメートルで表示されたので、センチに直した値を入力しています。
  7. 「除算」の出力を「サイド」にリンクします。

これでパスの長さに応じて自動的にチェーンの数が変わるようになりました。微妙なすき間や、閉じたパス変形ができないため一部がフリップしてしまうところは微調整が必要です。
プロシージャルモデリングはこういった使い方ができるので便利ですね。

 

まとめ

パスコンストレイントを使用した方法は実際のチェーンのように一つ一つ別アイテムでした。自由度の高いリグを構築できますが、実用上不便なところもあります。
例えばパスの長さを変えるとアイテムにすき間ができたり重なったりします。後からチェーンの数を変更しようとすると、パスコンストレイントからやり直しになり面倒です。
効率化のためスクリプトを書けば気にならないかも知れませんが、私のようにスクリプトが書けない人はお手上げです (´Д`υ)

今回のスプラインデフォーマを使用した方法はチェーンが変形してしまいますが、パスの長さが変わってもチェーンにすき間ができるようなことはありません。極端にターゲットパスを変形しなければ、ある程度フリップを抑えることができますしチェーンの数も比較的簡単に変更できます。欠点はmodoのデフォーム処理が重いことですね。他のソフトでは気にならない変形でもmodoではストレスに感じます。

スプラインデフォーマとリプリケータを使用した方法は、変形も軽くてチェーンの数も手続き的に増やせるので調整が楽かも知れません。

チェーンという同じような表現でもアプローチが複数あり、それぞれメリットとデメリットがあります。作りたい物によってどの方法が適しているかも変わるので、色々試して好みの法を選択するのがいいと思います。