今年の早い時期に、Animation Rigging パッケージをリリースしました。当初の目標は、実行時にアニメーションを変更するための各種リグの作成に使用できる、一連のコンストレイントを提供することでした。
Unity では、このパッケージがもたらす数多くの可能性を探り、実行時と開発時の間の境界線を押し広げようとしています。このブログ記事では、最近 Animation Rigging を使って行った実験のいくつかを紹介します。下記の例で使用しているステートマシンは実験的な機能であり、実用に耐えうる制作例を表したものとは限らないことに留意してください。単に、テクニカルアニメーターがコードを書かずにコンストレイントとステートマシンのインタラクションを作成する方法を検討しているだけです。
この記事によって、皆さまが日頃直面しているアニメーションの課題に対処する新しい方法を探ったり、発見したりするうえでのインスピレーションを得られれば幸いです。実用に耐えうる完全なアニメーションソリューションを構築するため、皆さまが発見したことや必要なことを Unity にお知らせいただけると大変助かります。
最初にやろうと決めたのは、既存の Animator のコンテキスト(読み取り専用クリップが設定されたステートマシンロジック)内で、ユーザーコードによる直接的な介入なしでリグのコンストレイントをアニメーション化できる方法を探すことでした。解決策はステートマシン(Animator)レイヤーにありました。
リグとコンストレイントのアクティブ化を既存のステートマシンの読み取り専用クリップと適切に同期するために、Animator ステートマシンレイヤーを利用しました。
レイヤーと「Sync」機能を使用して、リグのアクティブ化/非アクティブ化クリップを、既存の移動ステートマシンの任意のステートに追加できます。
アニメーションウィンドウを使用して、リグとコンストレイントのプロパティをアニメーション化するアニメーションクリップをいくつか作成しました(*Rig レイヤーに格納)。再び、さまざまなリグとコンストレイントの Weight プロパティと Source Weight プロパティだけをアニメーション化します。
銃の握り方を切り替える Weight レイヤーのプロパティをアクティブ化/非アクティブ化するために、「Player」スクリプトも使用しています。これは、銃を握るポーズを変更する Player スクリプトのスライダーです。
Rig Builder コンポーネントには Rig Layers があります。この順番を変更して、リグ/リグパーツの間で目的の評価/解決結果が得られるようにします。これにより、リグの組み合わせと解決の順番を柔軟に処理できます。たとえば、忍者の例で Shoulder Correction Rig の順番をわざと間違えたらどうなるかを見てみましょう。
Shoulder Correction Rig を Rig Builder 評価スタックの一番下に移動して、期待される解決を壊してみました。
Shoulder Correction Rig が Rig Builder 評価スタックの一番上にある場合は、適切な解決動作が得られます。
上の画像では、Shoulder Correction がスタックの一番下に置かれ、手の配置が不適切になっています。正しい順序になっていると、肩が解決された後で残りの腕が解決されるため、手が正しくピストルを握ります。その後は、RightArm IK で提供されている補正を使用して、UpperBody Rig を解決するようにピストルの握りを調整できます。
注意:以下のリグとコンストレイントのセットアップに関する説明は、上記の画像で示した順番と必ずしも一致しません。
Shoulder Correction Rig は、Right Arm Two Bone IK コンストレイントと組み合わせて使用し、AR_Idle アニメーションと Pistol_Idle ポーズのポーズデルタと一致するように RightShoulder ボーンのポーズを修正します。
ピボットモードで RightShoulder (Transform) の Override Transform を使用し、Y および Z トランスフォームに追加の回転値を適用します。「Position Weight」を 0 に設定することで、Rotation だけに影響を与えています。
Hips Constraint ゲームオブジェクトとその子をチェックしてください。Hips ボーンに影響を与える Override Transform のソースとしてピボットモードで Hips Ctrl を使用すると、忍者の階層全体をオフセットできます。その後、コンストレイント(Multi-Aim と Override Transform)の組み合わせを使用して、背骨セクションと腰部を処理する上半身のエイムとなるリグを作成します。さまざまなエイムウェイトのコンストレイントの値を設定(いずれの場合にも、「Multi Aim Constraint」>「Source Objects」で背骨 0.35、胸部 0.5、上胸部 0.75、ヘッド 1.0 を設定)することで、すべての背骨エフェクターへの回転の分散が処理されます。これらすべてが、Target ゲームオブジェクトにさまざまな度合いで効果を生み出します。
Weapon Rig ゲームオブジェクトでは、Override Transform を使用して、Weapon_Bone アニメーションストリームをハイジャックし、ソースオブジェクト(Weapon Ctrl)を使用してリダイレクトできます。
その後、同じソースオブジェクトを Multi Referential Constraint で参照オブジェクトとして使用して、マルチピボット操作を実現できます。「Multi Referential Constraint」>「Driving」の値を調整すると、これを実際に確認できます。
Two Bone IK は、スケルトンの両腕の IK 解決を提供します。Multi Parent Constraint は、RHIK Effector と LHIK Effector を Weapon_Bone の子 IK ターゲットゲームオブジェクト(AR_LHIK_Target と AR_RHIK_Target)にアタッチするために使用されています。
元の Idle アニメーションをピストルの構えに変換するために、一連のアニメーションリギングのコンストレイントを使用します。Pistol Ctrl エフェクターから Weapon_Bone へのデータを、ピボットモードオプションを使用して Override Transform でオフセットします。その後、Multi Parent Constraint の「Position and Rotation」を「Maintain Offset」に設定して、ソース(Weapon_Bone)とターゲット(Pistol Offset)ゲームオブジェクトの間のグローバル座標の違いを解消します。
アサルトライフル(AR)のスケルトンとピストルのスケルトンを異なるアンカーポイントにアタッチするには、Multi Parent Constraint のマルチソース機能を活用します。
Assault Rifle Attach Rig では、Multi Parent Constraint のマルチソース機能がうまく活用されています。AR_Holster ソースを 1(Weapon_Bone ソースを 0)に設定すると、AR_Grip_Bone が AR_Holster に自動的にアタッチされます。
アサルトライフル(AR_Grip_Bone)が Weapon_Bone を追いかけるようにするには、Weapon_Bone ソースを 1(AR_Holster ソースを 0)に設定するだけです。
任意のコンストレイントのほとんどのプロパティにキーフレームを設定(今回の場合、各 Multi Parent Constraint のソースウェイトに設定)すると、目的の結果を得ることができます。
これが鍵です。これらの新しいアニメーションクリップは、「同期済み」ステートのアニメーターコントローラーレイヤーで使用され、既存の移動(または他の)ステートマシンの特定のステートで特定のリグステートを適用します。
次の例は、Multi Parent Constraint を使用して実行時に 3 つの異なるソース(Pistol_Holster、Pistol Offset、RightHand_PistolGrip)を操作している様子を表しています。
この結果は、Pistol_Equip(ベースレイヤーで再生される読み取り専用の .fbx)と Rig_Pistol_Equip(Rig Pistol レイヤーで再生されるネイティブ Unity アニメーションクリップ)の 2 つのアニメーションクリップを複数のステートマシンレイヤー上で同期することで実現されています。
Ninja の .fbx には、LeftFootIK オブジェクトと RightFootIK オブジェクト(いずれも LowerBody ゲームオブジェクトの子)が含まれています。これらのオブジェクトは、スケルトンの脚アニメーションと一致するように DCC でアニメーション化されています。
Multi Parent Constraint を使用して、Leg IK Rig の Feet IK エフェクターが LeftFootIK および RightFootIK ゲームオブジェクトにアタッチされています。これによって、両脚がルートレベルでロックされ、下半身が地面に潜ってしまうことなく腰を操作できるようになります。
最後に説明するのは Two Bone IK コンストレイントです。これは、下半身(脚とヒントの位置)に適切なアニメーション修正を生成するために必要な IK 解決を提供するものです。
素晴らしい発見だったのは、脚のリグに Multi Referential Constraint を使用することです。マルチピボット制御リグを作成することで IK エフェクターの操作を活用でき、今後のアニメーションオーサリングソリューションへの示唆が得られました。
左手のゲームオブジェクト階層を複製して、別の握りポーズを作成しました。リグコンポーネントの「Weight」スライダーを使用して、ローカルモードで複数の Override Transform コンストレイント(指のゲームオブジェクト 1 つにつきコンストレイント 1 つ)を有効/無効にして、各指のローカル回転をオーバーライドできます。
LHIK Effector を AR_LHIK_Target_B ゲームオブジェクトに揃えるには、AR_LHIK_Target の「Weight」を 0 に設定し、AR_LHIK_Target_B の「Weight」を 1 に設定します。
その後、MonoBehaviour スクリプトで LeftHandGrip Rig の Weight プロパティーと LeftArm IK/Multi Parent Constraint のソースの Weight プロパティ(AR_LHIK_Target と AR_LHIK_Target_B)を同期して、左手の握りポーズと武器の位置を変更します。
TwistCorrection Rig は、プロシージャル変形リグとして機能します。これが影響を与えるのは、各腕の上部と下部および各脚の上部です。手根骨のロール回転を抽出し、特定のウェイト値に従って各ツイストボーンのローカル X 軸に沿って分散させます。
この例では、TwistCorrection が Rig Builder Rig Layers の一番下にあります。これで、TwistCorrection は、先行するリギングのコンストレイントによって生じたそれまでの変更によるメリットを享受することができます。
Animator ステートマシンを使用してコンストレイントのプロパティ(浮動小数点数のウェイト)を操作しているため、それに伴う遷移とブレンドエフェクトが継承されます。たとえば、値はブレンドが終了するまでは完全な値にはならず、0.998 のような値が表示される可能性があります。この問題を回避するには、コンストレイントのウェイトアニメーションを開始する前に、ブレンド遷移が終了するまでの時間を確保しておくようにします。
このアプローチにはもう 1 つ副作用があります。プロパティが前のステートの影響を受けており、そのプロパティがデフォルトの値やステートに戻らないようにするには、そのプロパティにキーを設定する必要があることです。これは、ステートが同期レイヤー上にクリップを持たない場合、特に重要です。
これらの問題に対処し終えると、十分に機能する有望なプロジェクトができあがりました。
この実験の結果を皆さんにご報告でき、うれしく思います。この Animation Rigging パッケージを使ってみた感想や、どのように使ってみたいかなどのご意見をぜひお寄せください。
Animation Rigging Advanced Character Interaction プロジェクトは GitHub からダウンロードできます。
ぜひ、試してみてください。Animation Rigging パッケージフォーラムでご質問やご意見をお待ちしております。
スペシャルサンクス: Yang-Hai Eakes、Simon Bouvier-Zappa、Olivier Dionne、Dave Hunt、Sven Santema