ふとした思いつきで、キャラクタが全自動で歩くXPressoを作りました(XPressoというのはCINEMA 4Dについてるノードベースのエクスプレッションです)。単純な自動歩行ではなく、動作にランダムな要素を加えて「ヨッパライ」にできるのがおもしろポイントです。
サンプルファイル
今回作ったXPressoの中身はかなり込み入っていて、詳しく説明すると非常に長くなってしまうので、ひとまずサンプルファイルを公開しておきます。この数年以内のC4Dならどのエディションでも開けると思います(C4D Lite以外)。個人の非商用目的の範囲内でご自由にお使いください。何かありましたらtwitterの@hirotsu162まで。
サンプルファイル:20181227_XPresso_auto_walk.zip(zipを解凍すると.c4dファイルが入っています)
・C4Dユーザでない方は
興味がおありでしたらC4Dの体験版を試してみてはどうでしょうか。オブジェクトベースのMoGraphは有名ですが、ノードベースのエクスプレッションがついてるのって案外知られていないのでは? 中身はこんな感じです。Unreal EngineのBlue Printにちょっと似ていますが、こっちのほうがだいぶ簡単です。
・C4Dユーザの方は
シーンファイルをいじって、笑ったりXPressoの可能性を感じたりしてください。XPressoについて多少ご存じのC4Dユーザの方は、XPressoタグ(歩行関連は6つあります)を開くと中にコメントを書いてあるので(各ノードにも書いてあります)、何やってるかはそこそこわかるんではないかと思います。楽しんでいただければ幸いです。
普段からXPressoでキャラクタを動かしているC4Dユーザの方は……。同志よ! XPressoの中身とかキャラクタとのつなげ方とかを見て、アドバイスなんかあったら教えてください。まあこれ、普通のキャラクタアニメーションと違いすぎて、見て笑う以外の用途あまりないですけど……。
基本的な原理
このXPressoの歩行動作の基本的な原理は、左右の足を交互に上げ下げして、足が地面に着いているときはその場にロックするというものです(ロック動作自体にはコンストレイントを使っています)。そうやってる最中に体が前に移動すると、地面に着いているほうの足はその場にとどまり、上体と浮いているほうの足は前に進むので、結果として歩いている格好になるわけです。
体の各部分の動きは足の動きを基準にして同期しています。進むスピードや足踏みするテンポはパラメータで加減できます。
また、ランダムな動きを加えて「ヨッパライ」動作にする部分には、「振動」タグとXPressoの「ノイズ」ノードを使用しています。
ファイルの使い方
アニメーションを再生すると歩きます。アニメーションのレンダリングもできます。アニメーションの最初のほうで多少ギクシャクしたり、アニメーションさせていないときでもビューを更新すると何か動いたりしますが、仕様です。レンダリングには支障ありません。
HUDの「use_motion_path」スイッチがオンのときは「スプラインに沿う」でパス(緑色のスプライン)に沿って歩きます。オフの時は前に向かって歩き、時間を延ばせば無限に歩き続けます。
「スプラインに沿う」タグの「パススプライン」のリンクはXPressoでオーバーライドされていて、XPressoタグ「XPresso_motion_path」にあるユーザデータの「motion_path_spline」リンクスロットに登録されているものが反映されます。ここで設定すればパスを別のスプラインに差し替えることができますが、その場合には「スプライン上の位置」のアニメーション設定で進むスピードを調整する必要があると思います。
歩き方はHUDに出ているパラメータ(後述)で調整できます。パラメータのアニメーションもできます。上記の動画やサンプルファイルの状態では最初はヨッパライで、アニメーションの終わりのほうでシラフに戻るように設定されています。
ビューが重いときは
「タイムライン」や「XPresso編集」ウィンドウを開いていると、ビューでのアニメーション再生が非常に遅くなる場合があるようです。それらのウィンドウを閉じると直ります(たぶん)。
HUD項目について
XPressoで設定してある制御用のユーザデータは、HUDに出してあります。項目名だけのものはオンオフスイッチ(オレンジ色がオン)です。スライダがついているものは値が変更でき、アニメーションさせることもできます。項目に数字だけがついているものは、監視用にXPressoから出力させている表示です。
レンダリング設定のオプションで「HUDをレンダリング」をオンにしておくと、これらのデータがレンダリング結果にも表示されるので、XPressoの動作を詳細に確認することができます。
これらのパラメータが実際にどういうふうに機能しているかは、XPressoの中身のコメントにだいたい書いてあります。項目を右クリックして「属性を表示」すると、属性マネージャにそのユーザデータが表示されるので、そこで項目の先頭のアイコンにマウスポインタを置くと、ポップアップ表示から接続先のXPressoをたどることができます。
以下、それぞれの項目について簡単に説明します。
・Renderer_is_Physical(中央上、文字列をクリックでオンオフ)
「フィジカルレンダラーでのみ発生するXPressoの動作の差異」(バグっぽいです)を吸収するためのスイッチです。フィジカルでレンダリングするときだけオンにします。ビューでのアニメーション再生にも影響するので、「レンダリングするときだけ」オンにしてください。また、レンダリングの開始フレームが「0」でない場合はこのスイッチを使ってもタイミングに若干のズレが生じます。
本当は自動で切り替わるようにしたかったんですが、複数あるレンダリング設定からXPressoで「アクティブなもの」を引っ張ってくる方法がみつかりませんでした。あとまあ、ビューでの動作が変わってしまうので、切り替えは自動じゃないほうがいいというのもありますね。
・use_motion_path(文字列をクリックでオンオフ)
歩行を「スプラインに沿う」で行う場合にオンにします。歩くペースはXPressoではなく通常どおりに「スプラインに沿う」の「スプライン上の位置」の値のアニメーションで制御されています。
このスイッチがオフの時はまっすぐ前に歩きます。
このスイッチに合わせてカメラもそれぞれ専用のものに切り替わりますが、切り替えが不要な場合は「ステージ」オブジェクトをオフにすれば無効になります。カメラ関連のXPressoは歩行制御とは別のものがカメラの階層のほうについています。
・path_position_prev(表示のみ)
「スプラインに沿う」のスピード監視用の表示で、10フレーム前の値を表示しています。
・スプライン上の位置
「スプラインに沿う」タグの値そのものです。
・pre_pos_Z、post_pos_Z(表示のみ)
前進した距離の監視用の表示です。「pre」は前のフレームでの値、「post」はこのフレームでの値です。
・root_advance_Z(制御パラメータ)
「スプラインに沿う」を使わずにまっすぐ前に歩くときの、1フレームあたりで進む基本の距離です(cm)。
・speed_Z(表示のみ)
ランダム要素を加味した、このフレームで実際に前に進む距離です(cm)。「スプラインに沿う」オンのときはスプライン上を進む距離(直近10フレームの平均値)です。
・root_shift_X(制御パラメータ)
左右にランダムにふらつく割合です。
・root_Rot_H(制御パラメータ)
左右にランダムに回転する割合です。
・overall_random_raito(制御パラメータ)
いろいろなパラメータによりランダムに動作する割合を一括管理するマルチプライヤです。ゼロにするとそれらのランダムな効果がなくなります。つまり「ヨッパライメーター」ですね。
・pre_step_cycle、post_step_cycle(表示のみ)
開始から「何歩進んだか(小数含む)」の監視用の表示です。1単位は歩行モーションの1サイクル、すなわち2歩です。「pre」は前のフレーム、「post」はこのフレームでの値です。
・step_interval(制御パラメータ)
足を1歩動かすのに何フレームかかるかという基準値です。20なら20フレームで1歩、足を動かします。
前に進むスピードに対して足を動かすテンポが遅いと歩幅が広くなり、逆に速いと歩幅が狭くなります。
・step_random_ratio(制御パラメータ)
歩くテンポにランダムなゆらぎを加える割合(最大値)です。値が大きいほど歩幅がばらつきます。
・step_random(表示のみ)
歩くテンポに生じているゆらぎの実際の値です。単位は「step_cycle」と同じです。
・step_var_Z、step_var_X(制御パラメータ)
足が空中にあるとき前後左右にぶれる距離の最大値です(cm)。
・slip(制御パラメータ)
足が滑る割合です。滑らせすぎるとスケートみたいになります。
・Hips_delay(制御パラメータ)
上半身の移動が遅れる基準値です(フレーム)。
・Hips_delay_mix(制御パラメータ)
上記の上半身の遅れを実際に反映させる割合です。ゼロだと遅れがなくなります。
・spine、arms(文字列をクリックでオンオフ)
背骨・頭と、腕の揺れを一括でオンオフするスイッチです。
・spine_vib、arms_vib(制御パラメータ)
背骨・頭と、腕の揺れる割合です。これも「ヨッパライ値」ですが、先のoverall_random_raitoとは独立しています。上半身と下半身でヨッパライ具合に差がつけられます。
サンタ帽(おまけ)
これを作ってるときクリスマスだったのでつけました。「ジグル」デフォーマで揺れます。「ジグル」による揺れはメッシュが伸び縮みしてしまうので案外使いどころが難しいのですが、これはアリかなと思います。