距離マッチング を使用すると、時間ベースのリニア再生ではなく、計算された距離変数によって アニメーション シーケンス を制御することができます。このドキュメントでは、距離マッチングの概要について説明し、実装プロセスを示すワークフローの例を紹介します。
前提条件
- Animation Locomotion Library プラグイン を有効にする。メニュー バー から[Edit (編集)] > [Plugins (プラグイン)] に移動し、[Animation (アニメーション)] セクションで Animation Locomon Library を特定するか、検索バー を使用します。このプラグインを有効にして、エディタを再起動します。
-
アニメーション シーケンスがある。
-
特定の点までの距離、または特定の点からの距離を解く浮動小数変数がある。
-
距離マッチングは アニメーション ブループリント および アニメーション ノード関数 を活用しているため、両方の基本的な知識が必要です。
概要
距離マッチングを使用すると、キャラクターのターゲットまでの距離、またはターゲットから距離を使用して、アニメーション シーケンスを制御できます。アニメーション シーケンス カーブ はアニメーション ブループリントのロジック内で使用され、時間変位ではなく、特定の距離値での目的のポーズに基づいてアニメーション キーフレームをグラフ化し、選択するために使用します。
以下は、タイムライン上でカーブがハイライトされているアニメーション シーケンス エディタの例です。
カーブをダブルクリックすると、 カーブ エディタ で表示されます。カーブ エディタでは、カーブの詳細情報およびカーブを微調整する編集ツールにアクセスできます。
以下の例は、アニメーション シーケンスのポーズを x 軸で、そして垂直方向の変位の単位を y 軸 (ここで、y = 0 はレベルの地面) でグラフ化した地面距離カーブを示しています。カーブの例では、キーフレームを表す三角形はカーブの軌道 (緑の線) に沿って一貫して変位しています。ただし、ポーズはキーフレームの交点だけでなく、軌道上のどの点でも選択することができます。距離マッチングを使用して、 アニメーション ブループリント はアニメーション カーブを検索して、距離変数で示されるインデックス値を見つけ、対応するアニメーション ポーズを出力します。
以下は、このプロセスの手動によるデモです。地面からの距離値を -100 単位とすると、カーブの 6 番目のキーフレーム付近にポーズが配置され、再生するために選択されます。
[Distance Matchingノード] (#Distance Matching ノードのリファレンス) は、アニメーション距離カーブを使用してアニメーション ポーズを選択し、アニメーション シーケンスの再生を調整します。距離マッチングを使用すると、アニメーションの再生速度をキャラクターの移動速度に合わせて制御できるため、アニメーションを微調整する必要性が減り、アニメーション再生を中断することなくキャラクターの速度を変更することができます。
以下は、 Lyra サンプル プロジェクト での距離マッチングの実装の実例です。
距離マッチングのワークフロー
このワークフローの例では、距離マッチングの基本的な実装について説明します。距離マッチング ロジックでは、Sequence Evaluator ノードを使用して着地アニメーションを評価し、アニメーション距離カーブ を使用して、キャラクターの位置から地面までの残りの距離に基づいてアニメーション ポーズを選択します。
カーブの生成
距離マッチングでは、ターゲットまでの距離またはターゲットからの距離を使用して、アニメーション ポーズをグラフ化するアニメーション カーブが必要です。このカーブを参照することで、動的な距離変数に応じてアニメーション再生ポーズを調整することができます。
たとえば、9 番目のキーフレームが時間単位のしきい値に基づいて 10 番目のキーフレームに遷移するのではなく、距離単位のしきい値に基づいて遷移します。
このカーブは、 ルート モーション が有効になっているアニメーション シーケンスから生成できます。
カーブを生成するには、アニメーション シーケンス エディタでアニメーション シーケンスを開きます。メニュー バー > [Window (ウィンドウ)] に移動して、[Asset Editor (アセット エディタ)] セクションで [Animation Data Modifiers (アニメーション データ モディファイア)]** を選択し、ウィンドウを開きます。
[Add Modifier (モディファイアを追加)] を選択して、ドロップダウン メニューから DistanceCurveModifier を選択します。
DistanceCurveModifier の [Settings (設定)] で、カーブを生成するためのパラメータを設定します。
以下は、DistanceCurveModifier のプロパティ とその機能のリストです。
プロパティ | 説明 |
---|---|
Sample Rate | シーケンス用に生成するカーブ サンプルの数を決定します。大きい値を指定するほど、サンプル数が増え、距離カーブの精度が上がります。30 という値では、ほとんどのユースケースをカバーできます。 |
Curve Name | 生成されたカーブの名前を定義します。 |
Stop Speed Threshold | キャラクターが動きを停止したとき、またはアニメーションの終了ポイントに到達したときのしきい値を定義します。デフォルト値は 0 であるものの、キャラクターがアニメーションが終了する前に常に 0 に到達するとは限りません。このプロパティで終了のしきい値を微調整することで、よりスムーズな遷移を実現することができます。 たとえば、ピボット アニメーションでは、キャラクターは方向を変えますが、決して完全に停止しないことがあります。このしきい値を微調整して、キャラクターが「停止」するために速度をどのくらい落とす必要があるかを指定します。 |
Axis | どの動作軸を考慮するかを決定します。「Z」は、着地アニメーションで役立ちます。「XY」はロコモーション遷移 (停止、開始、ピボット) で役立ちます。 |
Stop at End | 有効になっている場合、カーブはアニメーション シーケンスの最後のフレームでキャラクターが停止するという宣言のみを行います。キャラクターがアニメーション シーケンスの最後のフレームより前で停止する場合、または停止する可能性がある場合は、このプロパティを有効にします。 |
デモでは、アニメーションは高さの変化に応じて距離を合わせるため、Axis プロパティ を Z 軸に変更します。
Stop at End 設定を有効にします。
後で参照するために、Curve Name プロパティを使用してカーブに名前を付けます。
その他の設定はデフォルトのオプションのままにします。
ウィンドウの一番上にある [Apply All Modifiers (すべてのモディファイを適用)] をクリックして、新しいカーブを生成します。
これでアニメーション距離カーブが完成したので、カーブ エディタ ウィンドウの再生ヘッドを使用してカーブ上を前後に移動することで、ターゲットからのさまざまな距離値におけるアニメーション ポーズ出力を確認することができます。このデモでは、キャラクターが近づいてくる地面に向かって脚を伸ばしています。
圧縮
アニメーション シーケンスの距離マッチングでは、デフォルトの圧縮方法の代わりに Uniform Indexable Animation Compression Setting アセットを使用して、ランタイム時に距離カーブを読み取る必要があります。
この圧縮を適用するには、新しい アニメーション圧縮設定アセット を作成します。コンテンツ ブラウザ を右クリックし、[Create Advanced Asset (高度なアセットを作成)] の [Animation (アニメーション)] ドロップダウン メニューに移動して、[Curve Compression Settings (カーブ圧縮設定)] を選択します。
新しい 圧縮アセット をダブルクリックして、[Details (詳細)] パネルを開きます。[Compression (圧縮)] の [Codec (コーデック)] オプションで [Uniform Indexable] を選択します。
距離マッチングを行うアニメーション シーケンス内で、[Details] パネルの [Compression (圧縮)] にある新しい Curve Compression Settings アセットを割り当てます。
アニメーション ブループリント
キャラクターのアニメーション ブループリント AnimGraph で、Sequence Evaluator ノードを作成し、Output Pose ノードに接続します。
Sequence Evaluator ノードの [Details] パネルを開いて、距離マッチングのアニメーションを定義します。
次に、Explicit Time プロパティで、ピンの ドロップダウン メニュー を開き、[Pin (ピン)] カテゴリの Dynamic Value オプションを切り替えます。Dynamic Value オプションを切り替えると、Anim Node 関数を使用して値を設定することができます。このピンはブループリントでは非表示にすることができます。
Should Loop および Teleport to Explicit Time を無効にします。
Start Position を「0」に設定し、Reinitialization Behavior が Explicit Time を活用するように設定します。
Sequence Evaluator ノードのプロパティを定義したら、Sequence Evaluator ノードで アニメーション ノード関数 を作成して、ロジックを制御します。この内部関数を作成するには、Sequence Evaluator ノードの [Details] パネルにある [Functions (関数)] セクションに移動します。On Update プロパティで、ドロップダウン メニュー を開き、[+Create Binding (バインディングを作成)] を選択します。
[Details] パネルで関数の名前を変更することができます。この例では、この関数の名前は「Distance Matching」です。
この関数は ブループリント エディタ ビューポート ウィンドウの新しいタブで開かれます。
関数の In ノードと Out ノードの間に、Distance Match to Target ノードを作成します。
次に、Distance Match to Target ノードの Node 出力ピン からドラッグして、Convert to Sequence Evaluator 浮動小数関数 (緑) ノードを作成します。
Convert to Sequence Evaluator ノードの Sequence Evaluator 出力ピン を Distance Match To Target の Sequence Evaluator 入力ピン に接続します。
ターゲットからの距離を計算する Float Variable のインスタンスを呼び出します。この例では、キャラクターから地面までの距離を測定する変数で、Distance to Ground という名前です。
Distance Match to Target ノードで、Distance Curve Name を定義します。
これで、ブループリントを 保存 して コンパイル すると、アニメーション プレビュー ビューポート で距離マッチングの結果を確認できます。
結果
アニメーションを実行しているときは、[Viewport Settings (ビューポート設定)] の [Scene Setup (シーン設定)] セクションで、Floor Height Offset プロパティを調整して、距離マッチングの活用状況を表示することができます。距離マッチングを有効にして実装すると、キャラクターと地面との間の距離を変更する際に、Sequence Evaluator ノードがカーブからアニメーション ポーズを選択します。これにより、キャラクターが近づいてくる地面に対して動的に反応する、より自然な着地アニメーションが作成されます。距離マッチングを使用すると、アニメーション シーケンスで、キャラクターの落下速度の変更にも対応できます。この際、調整された落下速度に合わせてシーケンスを再アニメートする必要はありません。
以下は、Sequence Evaluator ノード内に距離マッチングを実装するサンプルのワークフローで使用されているアニメーション ノード関数ブループリントの全体図です。
距離マッチング ノードのリファレンス
以下は、アニメーション ノード関数で動作する Distance Matching ノードのリストです。
Distance Match to Target
Distance Match To Target ノードでは、アニメーション カーブと距離変数を使用して、アニメーション ポーズを選択し、アニメーションの再生速度をキャラクターの速度に合わせてスケーリングします。
ワークフロー デモの [アニメーション ブループリント] (#アニメーション ブループリント) セクションでは、Anim Node 関数に Distance Match To Target ノードの実装があります。
Advance Time By Distance Matching
Advance Time By Distance Matching ノードでは、接続されている Sequence Evaluator ノードを、キャラクターが各フレームで移動する距離だけ先に進めることができます。
このノードには、アニメーション ポーズを選択するルート ボーンの移動距離をグラフ化したアニメーション距離カーブと、移動距離を測定する変数が必要です。
Set Playrate to Match Speed
Set Playrate to Match Speed ノードは、アニメーションの速度がキャラクターの移動速度に一致するように、Animation Sequence Player ノードの再生レートを設定します (キャラクターの移動速度が一定であることを前提とします)。