Search Unity

高度な Animation Rigging:キャラクターとプロップのインタラクション

, 9月 5, 2019

今年の早い時期に、Animation Rigging パッケージをリリースしました。当初の目標は、実行時にアニメーションを変更するための各種リグの作成に使用できる、一連のコンストレイントを提供することでした。

Unity では、このパッケージがもたらす数多くの可能性を探り、実行時と開発時の間の境界線を押し広げようとしています。このブログ記事では、最近 Animation Rigging を使って行った実験のいくつかを紹介します。下記の例で使用しているステートマシンは実験的な機能であり、実用に耐えうる制作例を表したものとは限らないことに留意してください。単に、テクニカルアニメーターがコードを書かずにコンストレイントとステートマシンのインタラクションを作成する方法を検討しているだけです。

この記事によって、皆さまが日頃直面しているアニメーションの課題に対処する新しい方法を探ったり、発見したりするうえでのインスピレーションを得られれば幸いです。実用に耐えうる完全なアニメーションソリューションを構築するため、皆さまが発見したことや必要なことを Unity にお知らせいただけると大変助かります。

基本情報

このブログでは、3 種類のコンポーネント(Rig Builder、リグ、各種コンストレイント)を取り上げます。これらのコンポーネントになじみがない場合は、Animation Rigging に関する前回のブログ記事をご覧ください。

実際の機能を簡単に確認するには、この記事で参照しているプロジェクトをこちらからダウンロードしてください。

簡単な状況説明

最初にやろうと決めたのは、既存の Animator のコンテキスト(読み取り専用クリップが設定されたステートマシンロジック)内で、ユーザーコードによる直接的な介入なしでリグのコンストレイントをアニメーション化できる方法を探すことでした。解決策はステートマシン(Animator)レイヤーにありました。

アニメーションリギングと既存のステートマシンの統合

リグとコンストレイントのアクティブ化を既存のステートマシンの読み取り専用クリップと適切に同期するために、Animator ステートマシンレイヤーを利用しました。

 

レイヤーと「Sync」機能を使用して、リグのアクティブ化/非アクティブ化クリップを、既存の移動ステートマシンの任意のステートに追加できます。

アニメーションウィンドウを使用して、リグとコンストレイントのプロパティをアニメーション化するアニメーションクリップをいくつか作成しました(*Rig レイヤーに格納)。再び、さまざまなリグとコンストレイントの Weight プロパティと Source Weight プロパティだけをアニメーション化します。

銃の握り方を切り替える Weight レイヤーのプロパティをアクティブ化/非アクティブ化するために、「Player」スクリプトも使用しています。これは、銃を握るポーズを変更する Player スクリプトのスライダーです。

忍者の銃

Ninja Rig の構築

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

Shoulder Correction Rig は、Right Arm Two Bone IK コンストレイントと組み合わせて使用し、AR_Idle アニメーションと Pistol_Idle ポーズのポーズデルタと一致するように RightShoulder ボーンのポーズを修正します。

ピボットモードで RightShoulder (Transform) の Override Transform を使用し、Y および Z トランスフォームに追加の回転値を適用します。「Position Weight」を 0 に設定することで、Rotation だけに影響を与えています。

Assault Rifle Rig

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

Weapon Rig ゲームオブジェクトでは、Override Transform を使用して、Weapon_Bone アニメーションストリームをハイジャックし、ソースオブジェクト(Weapon Ctrl)を使用してリダイレクトできます。

その後、同じソースオブジェクトを Multi Referential Constraint で参照オブジェクトとして使用して、マルチピボット操作を実現できます。「Multi Referential Constraint」>「Driving」の値を調整すると、これを実際に確認できます。

UpperBody IK Rig

Two Bone IK は、スケルトンの両腕の IK 解決を提供します。Multi Parent Constraint は、RHIK EffectorLHIK EffectorWeapon_Bone の子 IK ターゲットゲームオブジェクト(AR_LHIK_TargetAR_RHIK_Target)にアタッチするために使用されています。

 

Pistol Rig

元の Idle アニメーションをピストルの構えに変換するために、一連のアニメーションリギングのコンストレイントを使用します。Pistol Ctrl エフェクターから Weapon_Bone へのデータを、ピボットモードオプションを使用して Override Transform でオフセットします。その後、Multi Parent Constraint の「Position and Rotation」を「Maintain Offset」に設定して、ソース(Weapon_Bone)とターゲット(Pistol Offset)ゲームオブジェクトの間のグローバル座標の違いを解消します。

Weapons Source Rig

アサルトライフル(AR)のスケルトンとピストルのスケルトンを異なるアンカーポイントにアタッチするには、Multi Parent Constraint のマルチソース機能を活用します。

Assault Rifle Attach Rig では、Multi Parent Constraint のマルチソース機能がうまく活用されています。AR_Holster ソースを 1(Weapon_Bone ソースを 0)に設定すると、AR_Grip_BoneAR_Holster に自動的にアタッチされます。

 

アサルトライフル(AR_Grip_Bone)が Weapon_Bone を追いかけるようにするには、Weapon_Bone ソースを 1(AR_Holster ソースを 0)に設定するだけです。

任意のコンストレイントのほとんどのプロパティにキーフレームを設定(今回の場合、各 Multi Parent Constraint のソースウェイトに設定)すると、目的の結果を得ることができます。

これが鍵です。これらの新しいアニメーションクリップは、「同期済み」ステートのアニメーターコントローラーレイヤーで使用され、既存の移動(または他の)ステートマシンの特定のステートで特定のリグステートを適用します。

次の例は、Multi Parent Constraint を使用して実行時に 3 つの異なるソース(Pistol_HolsterPistol OffsetRightHand_PistolGrip)を操作している様子を表しています。

この結果は、Pistol_Equipベースレイヤーで再生される読み取り専用の .fbx)と Rig_Pistol_EquipRig Pistol レイヤーで再生されるネイティブ Unity アニメーションクリップ)の 2 つのアニメーションクリップを複数のステートマシンレイヤー上で同期することで実現されています。

 

Legs IK Rig

Ninja の .fbx には、LeftFootIK オブジェクトと RightFootIK オブジェクト(いずれも LowerBody ゲームオブジェクトの子)が含まれています。これらのオブジェクトは、スケルトンの脚アニメーションと一致するように DCC でアニメーション化されています。

Multi Parent Constraint を使用して、Leg IK Rig の Feet IK エフェクターが LeftFootIK および RightFootIK ゲームオブジェクトにアタッチされています。これによって、両脚がルートレベルでロックされ、下半身が地面に潜ってしまうことなく腰を操作できるようになります。

 

最後に説明するのは Two Bone IK コンストレイントです。これは、下半身(脚とヒントの位置)に適切なアニメーション修正を生成するために必要な IK 解決を提供するものです。

 

脚のセットアップ

素晴らしい発見だったのは、脚のリグに Multi Referential Constraint を使用することです。マルチピボット制御リグを作成することで IK エフェクターの操作を活用でき、今後のアニメーションオーサリングソリューションへの示唆が得られました。

LeftHandGrip Rig

左手のゲームオブジェクト階層を複製して、別の握りポーズを作成しました。リグコンポーネントの「Weight」スライダーを使用して、ローカルモードで複数の Override Transform コンストレイント(指のゲームオブジェクト 1 つにつきコンストレイント 1 つ)を有効/無効にして、各指のローカル回転をオーバーライドできます。

 

 

LHIK EffectorAR_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_TargetAR_LHIK_Target_B)を同期して、左手の握りポーズと武器の位置を変更します。

TwistCorrection Rig

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 EakesSimon Bouvier-ZappaOlivier Dionne、Dave Hunt、Sven Santema

18 コメント

コメントの配信登録

コメント受付を終了しました。

  1. Are you guys going to make available for download this project or at least the rigged ninja? It was mentioned in the comments in the previous article in the comments (in May) it would be later this year.

    1. Hi Len,
      here is the link to the github project: https://github.com/Unity-Technologies/animation-rigging-advanced-character-interaction.
      It’s also mentionned in the blog post if you haven’t seen it :)

  2. Radoslav Radivojevic

    10月 3, 2019 1:20 am

    How about using this rig with full body trackers like 8 HTC vive trackers.
    https://forum.unity.com/threads/using-animation-rigging-package-instead-of-finalik-vrik-component.754649/

  3. Some really interesting details you have written.Helped me a lot,
    just what I was looking for :D.

  4. Jassica Avla

    9月 20, 2019 11:00 am

    You Guys doing a great job.

    https://themawto.com

  5. really you ask people to give feed back on the forum but the thread closed ,unity never change

    1. Please use the following link if you want to leave feedback: https://forum.unity.com/forums/animation-previews.141/. This is the animation preview sub-forum where AnimationRigging was first announced.

  6. You guys have done a great job explaining despite this being a particularly tricky subject. Someone else has done some interesting design work in this area too:

    https://forum.unity.com/threads/freeform-animation-modular-rigging.648088/#post-4880768

    That thread should really be looked through carefully. The author has put a lot of work into devising some interesting ideas and solutions to these tricky design issues while still being flexible and not requiring code. Particularly the modularity of the rig being swappable is necessary, and I think your current design makes that difficult. You can’t use separate “modules” (like in the thread I linked) for different parts of the rig if you are overlaying on top of the old AnimationController. It simply isn’t designed for that.

    Have you guys looked into incorporating any of the ideas from that topic yet? What about using curves to animate from one position to the next? For example, I like the idea of using an oscillating AnimationCurve as a parameter that animates across a set length of time on a particular layer (or against some physics-based input in a logic-based state-machine type solution). That guy from that thread goes way out of his way to avoid having to use large number of keyframes by aiming at the logic-based approach you guys seem to be going for with constraints.

    Are you planning anything like this with the new DOTS-based approach?

  7. The Monarch

    9月 7, 2019 8:59 pm

    How close is this to being a verified package? I assume it is still 6 months to a year out?

    1. Ans Beaulieu

      9月 9, 2019 8:07 pm

      Because Animation Rigging is closely related to other features that are still in development, like Freeform Animation and DOTS Animation, it is difficult to say for sure at the moment. A year (for 2020 LTS) is not unreasonable but it could be longer so it would be imprudent to commit to a date yet. This will really depend on the feedback we get and the complexities of the fully verified implementation. Rest assured that we are actively working on Animation Rigging and that we will share every step of the development with the community.

      Thanks!

  8. Isaac Surfraz

    9月 6, 2019 11:05 am

    This post is so in depth its practically a tutorial – I love it!

  9. I am just wondering why create so many layers per object instead of creating a generic “Prop” one and then using AnimatorOverrideControllers? I am asking because I’m rebuilding our game’s main character with override controllers to fasten the integration of new equipables, and wonder if there is a reason why you avoided using them?

    For instance, a rifle and a pistol both have the same behaviour in term of animation graph, so I don’t see why this isn’t reused.

    1. Jean-Sebastien Campagna

      9月 5, 2019 9:37 pm

      We are using the animation rigging constraints to insert an additive correction on top of the animator output. For example, It allows us to repurpose the whole rifle locomotion and modify it (using rig constraints) to match the desired pistol locomotion pose. Using Animation override controller seems like a valuable solution but might requiered an extra set of animation clips. Using the animation rigging package would help you streamline your animation library by sharing the same basic animation through different props (that probably required a different posing) that could potentially help you better manage your animation memory budget.

      I hope this would help clarify the subject and, maybe, be helpful for your production.

      Thank you

      Jean-Sebastien Campagna

  10. Very cool! Wondering how this fit in with DOTS , will Unity have its own rigging system that runs on DOTS. Another key feature for rigging is PDS. Can we get a PSD system for deformations

    1. Olivier Dionne

      9月 5, 2019 10:27 pm

      Yes our goal is to provide an extensible rigging system that runs on DOTS and was actually the intent from the start. In regards to a PSD, we certainly would like to eventually ship an out-of-the-box solution in the future.

      1. DOTS performed rigs would be fantastic. Keeping rigs at 30fps is really challenging with some rig having to evaluate 50k nodes.