UDN
Search public documentation:

AnimationOverviewJP
English Translation
中国翻译
한국어

Interested in the Unreal Engine?
Visit the Unreal Technology site.

Looking for jobs and company info?
Check out the Epic games site.

Questions about support via UDN?
Contact the UDN Staff

アニメーション システムの概要

ドキュメントの概要: 新しい UnrealEngine3? アニメーション システムで使われているクラスおよび構造の概要。

James Golding により作成。 Laurent Delayen によりアップデート。

概要

Unreal Engine アニメーションシステムはレンダリングされたオブジェクトと構成要素にモーションを追加します。アニメーション化されたオブジェクトは 骨格メッシュ と呼ばれます_静的メッシュ_ (Matinee を通してのみアニメーション化される)とは異なり、骨格メッシュは 骨格 を作成するボーンのセットを有します。それらはオブジェクトのモーションを操作やメッシュ上のオブジェクトの配置に使用されます。

アニメーションシステムには2つの主要部分があります。 - キーフレーム化されたアニメーションデータのプレイバックおよびアニメションのブレンディングです。

パイプライン

アニメーションシステムは Unreal Engine パイプラインの一部です。まず最初に、通常のアニメーションがプロセスされます(アニメーションのブレンディング)。次に、Inverse Kinematic (逆運動学)が適用されます。次にボーンコントローラ (Inverse Kinematic など) を適用します。物理サブシステムは残りの物理を処理し、グラフィックスサブシステムはすべてをレンダーします。

Animation-Pipeline.JPG

ワークフロー

一般的にプログラマーおよびアニメーターは必要なアニメーションコンテンツの製作活動を一緒にします。アニメーターは規約にのっとった骨格とラベルボーンを設定します。プログラマーはパイプラインに基づきそれらをまとめます(クラス、関数、フラグなど)。

アニメーション化されたメッシュ

Unreal Engine においてボーンベースの骨格アニメーションは、ゲームにあるオブジェクトのアニメーションの処理用の主要なメカニズムとして、アニメーション化されたメッシュは 骨格メッシュ と呼ばれます。以前は、それらはまた頂点ベースのアニメーションでした。

アニメーションのブレンド

UnrealEngine3 では、さまざまなアニメーション データのソースをブレンドするために、「ブレンド ツリー」という考え方を使っています。この方法を使うと、多数のアニメーションのブレンド方法を分かりやすく指定することができると同時に、処理の際に予測可能な方法で簡単にアニメーションを追加することができます。SkeletalMeshComponent (骨格メッシュ コンポネント) が使うアニメーションブレンド ツリーを設定するには、コンポネントの中の [アニメーション] ポインタが、ツリーのルートを指すように設定します。

ブレンド ツリーの概要

これは、簡単なアニメーション ブレンド ツリーの例です。:

animtreediagram.gif

ブレンド ツリーはノードのツリーから構成されます。ノードには、主に次の2種類があります:

ブレンド ノード (円) 複数の子ノードをもち、それらを特定の方法でブレンドします。ブレンド ノードの基底クラスは、AnimNodeBlendBase です。
データ ノード (四角) 子ノードを持たないツリーのリーフで、実際にはボーン変換を生成します。

この例の中の 'Directional Blend' (方向ブレンド) ノードは、接続された方向アニメーションを、アクタの速度および方向に基づいてブレンドします。これにより、特定方向への歩行や、走行のアニメーションが生成されます。その後、このアニメーションは 'Speed-based' (速度ベース) のブレンドに渡され、このブレンドが 2 つの子ノードをアクタの速度に基づいてブレンドします。そして最後に、Firing-based Blend'(発砲ベースのブレンド)に渡されます。

エンジンの中に定義された、わずかな種類の基本的なブレンド ノードを使えば、特定の機能を持つブレンドを簡単に作成することができます。

エンジンにて利用可能なデフォルト アニメーションノードについては、 アニメーションノード をご覧ください。

ブレンド ツリーの構築

アニメーション ツリーは、UnrealEd の一部である AnimTree エディタを使って構築されます。汎用ブラウザをダブルクリックすると、新しい空のツリーを表示した AnimTree エディタが開くので、そこで新しい AnimTree を作成することができます。

作成したアニメーション ツリーを、次のようにdefaultproperties ブロックの中で指定すれば、SkeletalMeshComponent で使うことができます。:

defaultproperties
{
   Begin Object Class=SkeletalMeshComponent Name=SkeletalMeshComponent
      SkeletalMesh=SkeletalMesh'BigCritter.CritterMesh'
      AnimSets(0)=AnimSet'BigCritter.CritterAnims'
      AnimTreeTemplate=AnimTree'BigCritter.CritterAnimTree'
   End Object
}

AnimTree は Animation ではなく、AnimTreeTemplate プロパティに割り当てることが重要です。再生が始まると、AnimTreeTemplate の参照する AnimTree がコピーされ、このコピーされたインスタンスがアニメーションに割り当てられます。実際の状態を保持し、ゲームのプレイ中に使われるのは、このコピーの方です。

AnimTree エディタの詳細は、AnimTreeEditorUserGuideJP に掲載されています。

AnimTree ノード

AnimTree ノードは、新しい AnimTree が作成されるときに使われるデフォルトのノードです。アニメーション、Blend ノード、ボーンコントローラ、モーフ ノードの接続はここで行います。重要なプロパティの設定も行うことができます。

Blend ノード と AnimSequences によって最終的なアニメーションが生成されたら、次のステップはボーンコントローラの適用です。これはワンステップで実施されるので、ボーンの順序が大切です。次のシナリオを考えてみましょう。キャラクターは IK を使って腕を動かし、手続き型コントローラを使って腕のロールボーン (回転骨) を処理します。IK を先に適用し、ロールボーンがその後から処理されるようにして、最終ポーズに変化をつけるとします。これを解決するには、3 回のパスでボーンに順番を付けます。

ComposePrePassBoneNames 最初に作成されるボーン (およびその子)。通常は IK ボーンのチェーンです。
ComposePostPassBoneNames 最後に作成されるボーン (およびその子)。通常はロールボーンです。

Blend ノード

エンジンにて利用可能なデフォルト アニメーションノードについては、 アニメーションノード をご覧ください。

アニメーションプレイバック

AnimSequence (アニメーション シーケンス)

AnimSequence とは、通知 (notifies) などの関連メタデータ情報を含む単独のアニメーション、つまりキーフレームのコレクションです。

AnimSet (アニメーション セット)

AnimSet は、AnimSequence の集合です。これらはパッケージの中に格納され、マテリアルやメッシュと同様に、汎用ブラウザで表示することができます。

animsetinbrowser.jpg

アニメーション集合の中の AnimSequence は、すべて同じ数のトラックを持ち、そのトラックはすべて同じボーンを参照している必要があります。特に、PSA ファイルを AnimSetViewer にインポートする際には、このことに注意する必要があります。 AnimSetViewer やアニメーションのインポートについての詳細は、 アニメーションシステムを使う を参照してください。 AnimSequence とは、通知 (notifies) などの関連メタデータ情報を含む単独のアニメーション、つまりキーフレームのコレクションです。

ボーンからトラックマッピング

AnimSet のトラックは、骨格メッシュ中のボーンに名前によって関連付けられています。これは、同一のアニメーション集合を、ボーンの数や順序が異なる別の骨格メッシュで再生したいことがあるからです。AnimSet は、探索を容易にするために、AnimSetMeshLinkup 構造体の集合をキャッシュします。特定の骨格メッシュのボーンと、AnimSet のトラックとの間には、マッピング テーブルが存在しています。

AdditiveAnimation

デフォルトでは、AnimSequences は完全な骨格アニメーションを格納しますが、additive (加算的) アニメーションを作成して使用することもできます。 Additive アニメーションは AnimSet エディタ内で 2 つのアニメーションを減算することによって作成します。AnimTree ではいくつかのノードを使って、この Additive アニメーションを追加して戻すことができます。 圧縮の手段として Additive アニメーションを用いて、冗長なデータを除去することができます。(例えば、くつろいで歩くのと、狙いを付けて歩く場合で、歩行を抜き出し、くつろぐ様子と狙いを付けた様子の差を付加分として保持します)。扱いにくいところもありますが、アニメーションの使用数が減り、メモリ使用も削減します。

Additive アニメーションーションについて学ぶには、 アニメーション シーケンス ページを参照してくください。

AnimSet ビューアでは、アニメーションはそのままでもきれいに表示されますが、ゲーム内ではベースポーズを追加しなければ何かの形には見えません。 AnimNodeAdditiveBlending ノード AnimationNodes#AnimNodeAdditiveBlendingJP を使用するか、または AnimNodeSlot AnimationNodes#AnimNodeSlotJP をオンデマンドで再生することにより Additive アニメーションを追加します。

2009 年 12 月 QA 承認ビルド現在、Additive、Target および Base アニメーションはすべて相互参照を保持します。これらのアニメーションを異なる AnimSets に移動して、それぞれの参照を (パッケージではなく) 管理する方が安全です。エディタで Target または Base ポーズのアップデートバージョンをインポートするときに、関連する Additive をリビルドするかどうかの確認を求められます。AnimSetViewer におけるアニメーションのインポートの詳細は、ImportingAnimationsTutorialJP を参照してください。

既存のデータをアップデートして参照を作成する必要がある場合は、FixAdditiveReferences コマンドレットを実行することができます。

AnimNodeSequence (アニメーション ノード シーケンス)

このクラスは、AnimNode のサブクラスで、AnimSet に保存されたキーフレーム データの再生方法が保存されています。通常このクラスは、ブレンド ツリーのリーフを構成します。

AnimNodeSequence の中では、再生する AnimSequence を名前で指定します。指定されたAnimSequence を見つけるために、AnimNodeSequence は、SkeletalMeshComponent の中の AnimSet 配列を検索します。ポインタではなく名前で AnimSequence を参照する利点は、同一のツリーをまったく異なるメッシュやアニメーションに対して利用できるということです。AnimSet 配列を検索する際には、最後の要素から逆方向に検索を開始し、該当する名前をもつ AnimSequence をもつ AnimationNode が見つかるまで検索が続けられます。したがって、配列の後方に同じ名前をもつシーケンスを含む新たな AnimSet を追加すれば、特定のシーケンスをオーバーライドすることができます。

AnimNodeSequence (アニメーション ノード シーケンス)プロパティ

bPlaying 現時点でアニメーションが再生されている場合、設定される。アニメーションが一時停止されると、非設定になる
bLooping アニメーションがロープする場合に設定し、永続的に再生する
Rate 再生レート
bNoNotifies これが設定されると、アニメーション通知がトリガされない
bShowTimeLineSlider 時間位置をコントロールするためドラックバーをトグルする

AnimGroups (アニメーション グループ)

多数の異なるアニメーションを一緒に管理するとき、より高いレベルでそれらを敏速にまとめ、管理する必要があります。これを行うには、アニメーションシステムは、 AnimGroups の概念を使用します。

AnimGroups において、たくさんのノードを一緒に動機かすることは可能で、 最も重要なグループトリガ通知のノードを持ち、 それらのノードの再生レートをグローバルに調節します。それらのオプションの組み合わせになりますが、すべてのノードが同期化される必要はありません。

同期化

これは、AnimNodeSynch と呼ばれる特別なノードを使用する前に行われます。 これは、このAnimGroup システムに統合されており、 AnimNodeSynch を除くことを推奨しています。

アニメーション同期化の背後の論理は、異なる長さのアニメーションの同期化を可能にすることです。これは特に移動サイクル、歩行から走りへの移行をシームレスに行ったりなどに便利です。相対的に同期化されたアニメーションを持つという発想です。例えば、 移動サイクルにおいて、0% で左あしを下げ、50% で右足を上げるとします。 そこで、歩行と走りのサイクルを一緒に同期化すると、キャラクターの速度やシームレスな方向サイクルの遷移により再生レートを変更することができます。足部は同期化されます。

通知

同類のアニメーション間で移行時、通知処理の問題があります。例えば、移動アニメーションでの フットステップなどです。 異なるサイクル間の移行や、通知をトリガするシステムに基づいた重量の閾値を使用時、通知が発動しない(または、ある場合では、複数のものが一度にトリガされうこともあります)というケースに至ることがあります。 弊社で一番望んでいることは、最も重要なアニメーショングループが通知のトリガを制御することで、厳密に言えば、これが AnimGroups の行っていることです。

グループ 再生 レート 制御

AnimGroups は、グループレベルでアニメーションの再生レートを制御することができます。これは、アニメーション ノード レートごとに加えていることに注意してください。アニメーション ノード は異なる/変数レートを持つことができ、グループレートは、個別の再生レートの上部にあるグループのアニメーションすべてをスケールします。

セットアップ

新しいグループを作成するには、AnimTree ノード (ブレンディング ツリーのルートノード) を選択します。AnimGroups を展開し、新しいエントリを追加します。n 「GroupName」 プロパティにあるグループ用にご希望の名前を入力します。 The RateScale プロパティは、このグループのグローバル再生レートをスケールするためのものです。

次に、このグループに追加したい AnimNodeSequence ノードを追加します。グループセクションを展開します。これで次のプロパティが表示されます。:

bForceAlwaysSlave ノードは同期化されるが、決してマスターノードとして選択されない。
bSynchronize TRUE にデフォルト設定。ノードは同期化される。同期化したくない場合はこのノードのチェックをはずす。
SynchGroupName このノードが属するグループの名前。AnimTree AnimGroups 配列で作成した同じグループ名に設定される。
SynchPosOffset アニメーションが相対的に他のもの(左足、反転した右足)と同期化するよう描かれていない場合は、アニメーションをオフセットすることが可能。オフセットは相対位置で、 0.f から 1.f の範囲。

実装予定

システムのグループ化は、すべてのノードがティックされた後、グループにあるすべてのノードを第2 パスでアップデートするよう強制します。このため、すべてのノードは、ブレンディング ツリーで最新の重量を持ちます。 次に各グループは、2 マスターノードを検索します。1つは同期化用で、もう1つは通知用です。 2つのマスターをもつ理由は、すべてのノードが同期化されず、通知をトリガできないためです。各カテゴリのリーダーは、最適なノードです (ツリーで最も重い重量をもつものは、同期化または通知のトリガのどちらかが可能)。 マスターノードが選択されると、すべてのグループノードはアップデートされます。同期化が必要なノード、また、通知のトリガが必要なノードです。 また、スクリプトコードからグループをコントロールするため、便利なスクリプト機能が AnimTreeThere でご利用になれます。 フライ、同期化位置の制御、レートスケールの再生などでのノードの追加/削除の機能です。

ルートモーション

ルートモーション ページをご覧ください。

ボーンコントローラ

アニメーションを解凍してブレンドしてから、IK (Inverse Kinematics) のようなボーンコントローラを適用できます (このステップおよび使用できるノードタイプの詳細は、SkeletalControllers のページ (UsingSkeletalControllersJP) を参照してください)。

物理アニメーション

物理とアニメーションの一体化については 物理アニメーション のページをご覧ください。

役に立つコンソールコマンド

show bones - 骨格メッシュのレンダーに使用したボーン位置を表示する