Tips

Tips

modoのインバースキネマティクス

modoのIKについて書いてみたいと思います。
modoには「Dual Joint Planar IK」と「Full Body IK」2種類のIKがあります。それぞれメリットとデメリットがあり、アニメーション用途で安定したIKが必要な場合は「Dual Joint Planar IK」がいいかもしれないという話です。

 

IK とは?

3DCGでアニメーションを作成する場合、ざっくり「FK」と「IK」2種類の制御方法に分かれます。

IKは元々工業用のロボットアーム制御用に開発された技術で、人間の腕のように複数の関節で構成されている階層構造を効率的に制御するための機能です。
ロボットの関節角度を決めるとき、階層構造の親から順に計算する方法を FK (フォワードキネマティクス) 、子の位置から親の関節角度を計算する方法を IK (インバースキネマティクス) といいます。

例えば腕が何かをつかむ場合に、「上腕」「前腕」「手のひら」を個別に回転して姿勢を決める方法が FK です。

 

複数の関節位置を「IKゴール」と「アップベクター(ポールベクター)」を使用して姿勢を決める方法が IK です。「IKゴール」は手の到達位置、「アップベクター」は肘の方向を指定するのに使用します。

FK は関節を個別に回転する必要があるので、関節数が多い場合にアイテムを一つ一つ回転する必要があります。IK は「IKゴール」と「アップベクター」2アイテムで全ての関節を制御できます。

一見FKよりIKの方が便利なように見えますが、それぞれアニメーションの内容によって向き不向きがあります。例えば走るアニメーションの場合、手の振りはFKが使いやすく、脚の動きはIKが向いています。そのため多くのIKはFKとブレンドしたり、切り替えることができるようになっています。

 

さて、ここから本題です。
modoには「Dual Joint Planar IK」と「Full Body IK」2種類のIKがあり、それぞれメリットデメリットがあります。

 

Dual Joint Planar IK

シンプルなIKモディファイヤです。IKで制御可能な関節数が2つに限定されています。

  • 使用できる関節数に制限あり(2関節)
  • アップベクター対応

IKで制御される関節の位置は、IKの始点となる関節位置、IKゴール、アップベクターの3点からなる仮想平面上を移動するように動作します。このためIKの始点、IKゴール、アップベクターのいずれかが完全に重なった(平面が形成できない)場合は、IKは計算することができなくなります。

3DソフトのIKは、だいたいこんな動作になってると思います。

 

Full Body IK

IKinemaというライブラリを組み込んだフルボディーIKシステムです。
Full Body IKはその名の通り、手を引っぱると自動で体全体が自然な姿勢を保ってくれる、聞くだけなら夢のようなIKシステムです。またモーションキャプチャデータを体格の異なるスケルトンにリターゲッティングするのに使用されます。
Dual Joint Planar IK のように関節数に制限はありませんがアップベクターをサポートしていません。

  • 使用できる関節数に制限なし
  • アップベクター非対応
  • モーションのリターゲット

画像ではアップベクターの設定にmodo標準の「方向コンストレイント」を使用しています。IKの始点の関節と全く同じ位置にロケータを作成し、IKを設定するスケルトンをロケータの子の階層におきます。ロケータからIKゴールに方向コンストレイントを設定します。方向コンストレイントの「上方ベクトル (アップベクター)」を設定することで、IKのアップベクターのような動作を設定しています。

 

Full Body IKは不安定?

Full Body IKは高機能で便利そうですが、modoではアップベクターをサポートしていないためリグを構築したりする場合に不安定になるという問題があるようです。

スケルトンの位置にいくつか制限があり、スケルトンが完全に直線的に配置されてる場合に不安定になります。
一般的に直線的に関節が配置されてる場合は、Dual Joint Planar IKを含めIKが正しく動作しないか不安定になります。IKを使用する場合は少し関節を曲げるのがIKのお作法ですが、Full Body IK ではIK制御下にない親の位置も影響するような気がします。IKが上手く動かないときは、スケルトンの位置をずらすと上手く動くようになるかも知れません。

上の画像のように方向コンストレイントを設定する方法はmodo 601のチュートリアルビデオ 「Fireboy」で紹介されていたもので、後にMattさんやMODO JAPAN GROUPさんがビデオで紹介しています。
親が回転するからそれっぽく動いてるだけで、Full Body IK がアップベクターとして計算に使用してるわけではないので、この疑似アップベクターではIKが不安定になるのではないかと思われます。

Full Body IK を安定させる方法として、「精度」を 2 から 3 に上げるといくらか改善することがあります。

 

Full Body IK が不安定という問題は Foundry フォーラムで繰り返し話題になっていて、以下のスレッドでは Sergio さんが Full Body IK についてコメントしています。
https://community.foundry.com/discuss/topic/122645/fbik-leg-rig-is-acting-super-strange

これが私がFBIKソルバを多く使うことができない理由の1つです。
それは気の利いたアップベクターが欠けている!! 誰かがそれを取り上げる前に、Mattの回避策は必ずしも機能しません。

FBIKはやんちゃで、 Planar IKは途方もなく制限されています。
使用可能なIKソルバーを取得するまで、Modoでキャラクターを作成することは苦痛を伴うことになるでしょう。(それは自分のコースのスレッドで述べていますが、これは本当に対処する必要があります。)

Mattの回避策でも作業するのは非常に難しく、アップベクターの位置を常に調整しなければならない。

そのような脚は古い方法が良いと思う。複数のPlanar IKチェーンを重ねる。 1つは脚、2つは足用です。

Sergio Mucino さんは Maya、Modo、Softimage、3ds maxを使用するTD/Riggerの方で、映画「アイアンマン3」や「デッドプール」に参加されてます。有料チュートリアル「キャラクターリギングコース」をリリースしている方でmodoに精通していると思われます。

Sergio さんが難しいと言ってる以上、Full Body IKを使用して安定したアップベクターの設定方法を見つけるのは難しいように思います。

 

 

まとめ

Full Body IK がアニメーションで動作が安定しないなと思った場合には、「Dual Joint Planar IK」を試すといいかもしれません。
アニメーションの作成方法は様々です。アップベクターが不安定でもキーをたくさん打て制御するのが苦にならなければ Full Body IK で問題ないと思います。3ds MaxのBipedはアップベクターもなく「鎖骨」「上腕」「前腕」「手のひら」全部まとめて1つのキーフレームで管理する変わったシステムだったりするので、気にしなければ気にならない問題かもしれません。

 

ちなみにフルボディーIKの特長である「手を引っぱると自動で体全体が自然な姿勢」というのは、手付けのアニメーションでは使われることが少ないようです。フルボディーIKらしいIKを使ったことないので具体的なことは書けませんが、決めたポーズが勝手に動いてしまうのでアニメーターには不評なようです。

Mayaには MotionBuilder 由来の HumanIK  というフルボディーIK機能を搭載していますが、個人サイトや小規模なアプリ開発を除くと、フル3Dの映画やゲームのモーション制作に使われているという事例を見かけることが少ない気がします。

ゲームのようにインタラクティブにアニメーションが変化するものや、アニメーションのリターゲッティング、モーションキャプチャのデータ補正には有用な技術だと思います。

LightWaveもVer 9まではIKが弱くアニメーションでガクガク震えることがありましたが、まさかmodoでもIKに悩まされるとは思いませんでした。

Tips

modoでカメラ ブレンド リグの作り方

トランスフォーム コンストレイントを使用して、複数のアイテムの位置や回転をブレンドするリグの作り方について書いてみたいと思います。

3DCGは意外とカメラの制御が難しかったりします。例えば商品説明のように決められたカメラ位置の間を滑らかに移動したい場合や、宇宙探査機のスイングバイのように異なる運動曲線間をスムーズに繋げるのに苦労することがあります。
複数アイテムのマトリクスをシーケンシャルにブレンドすることで、下の画像のようなカメラブレンド アセンブリを作ることができます。

画像ではカメラ直接使用していますが、カメラをペアレントしたロケータをブレンドした方がいいと思います。
アセンブリの中身です。

左から右に解説します。

  1. グループロケータにユーザーチャンネル「Mixer」を追加しています。チャンネルタイプは「パーセンテージ」、マトリクスのブレンド制御用のチャンネルです。
  2. 同じくグループロケータにユーザーチャンネル「Pos_x」「Rot_x」を追加します。チャンネルタイプは「行列」で、位置と回転用のマトリクスチャンネルです。
    グループロケータ「Item_x」が複数存在するのは、Transform Constraint の仕様に対処するためです。Position Constraint の「Weight.」チャンネルを見るとわかりますが、Transform Constraintは入力されたアイテム名でチャンネルを管理します。このため1つのグループロケータに複数のマトリクス チャンネルを追加して管理しようとしても同じチャンネルとみなされて上手く動きません。
    これらのユーザーチャンネルは「アセンブリ入力」としてチャンネル公開します。
  3. Position Constraint と Rotation Constraint ノードを追加します。
    Constraint ノードの「入力」にマトリクスチャンネルをリンクすると「Weight.アイテム名」チャンネルが追加されます。「入力」には複数のマトリクスをリンクすることができ、各「Weight.」の値でコンストレイントの強さをブレンドすることができます。
  4. Channel Relationship を追加します。
    「Mixer」チャンネルの値を Channel Relationship を経由して「Weight.」チャンネルを制御します。
    制御方法は単純です。「Mixer」が100%のとき「Weight.Item_1」が100%、それ以外の「Weight.」は0%になるようにすれば、Weightを制御できます。同様に「Mixer」が200%のとき「Weight.Item_2」が100%、それ以外の「Weight.」は0%になるようにするため、Relationshipのグラフはリニアな山型に設定します。各ノードで100%ずつシフトしてる感じです。
  5. 最後にConstraint ノードの「出力」を、グループロケータのユーザーチャンネル「Out_Ppos」「Out_Rot」を経由して「アセンブリ出力」します。

Constraint ノードの「Weight.」が全て0とき全て0を出力するようで、 「Mixer」が 0のときアイテムが突然ワールド原点に移動するような挙動になります。

結構単純なアセンブリですが、モーションミキサー作ってるみたいで面白いですね。
今回は位置と回転だけのブレンドですが、Scale Constraintを使えばスケールも対応する事ができます。好みに応じてカスタマイズすると面白いと思います。

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のプロシージャルモデリングで雪の表現

modoのプロシージャルモデリングで雪が積もるやつまねてみた。

  1. 複数のプリミティブをMerge Meshで1つにまとめる。(雪用のメッシュ)
  2. メッシュをPush Influenceで法線方向に縮める
  3. Transform Deformerで位置をオフセットする。
  4. Transform InfluenceのFalloffにNoiseMapを設定して、でこぼこ感を追加する。
  5. 最後にVDBVoxelに雪用のメッシュを設定して、近いメッシュが繋がるようにする。

接地面がふっくら積もった感じにするのが難しかったです。GL上では確認できませんがディスプレイスメントマップで雪を表現することもできます。

 

円錐や球をReplicatorで複製したものをMerge Meshし、VDBVoxelでメッシュ化すると氷柱のような表現もできます。

 

 

参考

 

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」コマンドでロケータの子にしておくと便利です。

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

 

modo 12.2以降ではスケマティック コメントノードを使用してチャンネルの値を確認することができるようになています。

 

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」の記事で使ってる、スライダーのようなコントローラの作り方について書いてみます。こういうコントローラがあると一気にリグ作ってる感じがしますね。

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倍移動します。そんなときは位置継承を「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のトランスフォーム配列ツールでアニメーション作成

今回はトランスフォーム配列ツールを使用して、複数のアイテムに手軽にキーを設定する方法を紹介します。

modoはメッシュ生成ツール以外は、アイテムモードでも同じツールを使用することができるという特長があります。
例えば変形タブの「ジッター」「ツイスト」「ベンド」などのツールを使用してアニメーションを作成することができます。その中でも複製タブにある「スキャッタ トランスフォーム」「カーブ トランスフォーム」「トランスフォーム ラディアル 配列」を使うと幾何学的にアイテムを配置出来るので、手軽にフライングロゴっぽいアニメーションを作成することができます。

作成手順です。

  1. テキストツールで適当に文字を入力します。
  2. 「厚み」ツールでテキストに厚みをつけます。
  3. アイテムツリーのメッシュで右クリックして「選択メッシュの統合解除」します。
    「選択メッシュの統合解除」は連結したポリゴン単位を、別のアイテムに分解する機能です。
  4. アルファベット単位に分かれたアイテムを全て選択し、メッシュの中心に「センター」を移動します。
    ファイルメニュー / 編集 / センターをバウンディングボックスへ / センター
    これでアニメーションを作成する準備が整いました。
  5. 全てのアイテムに位置と回転キーを作成します。
  6. 今回は最後にロゴが決まるようにしたいので、綺麗にアルファベットが並んだ状態でタイムラインで後ろのほう、とりあえず90フレームにキーを作成しました。
  7. タイムラインを0フレームに設定します。全てのアイテムを選択して「スキャッタ トランスフォーム」を実行します。
    「スキャッタ トランスフォーム」は指定した範囲内に、アイテムをランダムに配置するツールです。
  8. タイムラインを15フレームに移動して「カーブ トランスフォーム」を実行します。
    「カーブ トランスフォーム」はカーブ状にアイテムを配置するツールです。ツールがアクティブなときは、自由にカーブを編集することができます。
  9. 15フレームのキーをコピーします。タイムラインでキーを選択してCtrl+Cでキーをコピーします。
  10. タイムラインを30フレームに移動して、キーをペーストします。
    タイムラインをスクラブして正しくキーがペーストされたか確認します。今回はキーを設定しやすいように、15フレーム単位で移動と停止を繰り返すように設定しました。
  11. タイムラインを45フレームに移動して「トランスフォーム ラディアル 配列」を実行します。
    「トランスフォーム ラディアル 配列」はアイテムを円状に配置するツールです。位置がずれてるので調節します。配置が決まったらアイテムの回転にキーを作成します。
  12. 45フレームのキーをコピーします。タイムラインでキーを選択してCtrl+Cでキーをコピーします。
  13. タイムラインを60フレームに移動して、キーをペーストします。
    タイムラインをスクラブして正しくキーがペーストされたか確認します。modoは移動ツールがアクティブのときにキーをコピーすると、位置のキーのみがペースト対象になります。タイムラインスクラブして回転のコピーがミスってたのに気がついたので、回転ツールをアクティブにしてペーストしました。
  14. 最後のテキストが完成するキーが90フレ-ムにあるので、タイミングを変更します。
    タイムラインでキーを選択して、タイムラインでマウス右ドラッグしてキーを75フレーム移動します。ちなみに複数のキーをセント無くしている場合は、Ctrl+マウス右ドラッグ でキーをスケールすることができて便利です。これだけでも十分アニメーションしてますが、「ソフトラグ」デフォーマを使用して自動で揺れる動きを設定してみます。
  15. スケマティックビューの「追加」メニューを表示し、アイテムを選択してから「Soft Lag」をダブルクリックします。
    この作業はアイテム1個ずつおこなう必要があります。複数のアイテムを選択した状態で「Soft Lag」を実行すると、なんか上手く動きません。あと必ずスケマティックビューの「追加」メニューを使用してください。アイテムツリーにも同じようなメニューがありますが、アイテムツリーのメニューからはメッシュに「Soft Lag」が適用されません。

アニメーションを再生すると、アイテムがスプリングのように振幅しているのが確認できると思います。ソフトラグの「強さ」は値が大きいと揺れが停止するまでの時間が早く、低いと長く揺れ続けます。ソフトラグは「デフォーマキャッシュ」と相性がよくないので、必ずデフォーマキャッシュをOFFにした状態で調節するといいです。

画面キャプチャだとフレーム数が足りないので、フレームレートの高い画像も貼っておきます。簡単にそれっぽいアニメーションが作成できたのではないでしょうか?
単純なキーフレーム制御なので細かな微調整も簡単です。「Soft Lag」の変わりに「Lag Effector」を使ってみるのも面白いかも知れません。

今回はテキスト使ってフライングロゴっぽくしてみましたが、同じ手法で機械的な物が組み上がるようなアニメーションも作れるんじゃないかと思います。直線的に配列したアイテムをベンドして~とか、ツールの組み合わせでいろんなアニメーションが作れると思います。

たとえば「スキャッタ トランスフォーム」と「カーブ トランスフォーム」を交互に使用して、カーブで文字を書くと下の画像のようにカウントダウンのようなアニメを作れます。ボックスなので寂しい感じですが、ちゃんとしたモデルを使用すると面白い画面になると思います。

下の画像は「トランスフォーム配列」を使用して立体的に並べた例です。最初の下から上にアイテムがスケールして現れる動きはトランフォームデフォーマとリニアフォールオフをアイテムインフルエンスに接続して表現しています。揺れはソフトラグの「強さ」を何パターンか値を変えてランダムさを設定してみました。

パーティクルを使用して同じようなアニメーションを作成することもできますが、MoGraph的な使い方はまたの機会に書いてみたいと思います。

Tips

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

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

作成手順です。

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

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