前回のフォールオフプローブの続きで、カーブプローブを使用したアニメーション制御について書いてみたいと思います。
カーブプローブはカーブとアイテムの「距離」や「パーセンテージ」を抽出して、他のチャンネルで使用することができるようにするノードです。このカーブプローブとリプリケータを使用すると、カーブの特定の位置にあるアイテムを制御することができます。
例えばモーショングラフィックでよく見かける、オブジェクトがシーケンシャルに組み上がるようなアニメーションを作ることができるようになります。
■ サンプルファイル
カーブプローブを使用したアニメーション制御
簡単にテストしたところ、カーブプローブとリプリケータを使用して制御できるのは表示の「可視」、「ローカル」「ワールド位置」「ワールド回転」「ワールドスケール」のような、リプリケータの機能が使用しているチャンネルのみのようです。
可視の制御
見てわかりやすい、アイテムの「可視」の制御例です。
スケマティックはこんな感じです。
サンプルファイルがあるので、ザックリした解説です。
- カーブを作成してCurve Probeノードにリンクします。
- 別のメッシュにプロシージャルモデリングのCurve Rebuildノードを追加して、カーブをリンクします。
- Curve Rebuildしたメッシュは Replicator の「パーティクルソース」にリンクします。
- Replicatorの「原型となるアイテム」にはメッシュのない空のアイテムを指定して「子のアイテムを含む」をONに設定するのがポイントです。空のアイテムにペアレントしたアイテムがReplicatorによって複製されます。
- LocatorはユーザーチャンネルにControllerというパーセンテージ型のチャンネルを追加し、アニメーションのタイミング制御用のチャンネルとして利用します。
- 減算ノードを作成して Controllerの値から、Curve Probeの「パーセンテージ」を引きます。
- 減算ノードの出力をRelationshipノードを使用して値をリマップします。
- 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リリース時に公開された草のツルの成長アニメーションと、成長に合わせて葉が生えるチュートリアル動画です。木とかも作れそう。