43.3K Views
August 23, 18
スライド概要
CEDEC2018の講演資料を公開します。
Unreal Engineを開発・提供しているエピック ゲームズ ジャパンによる公式アカウントです。 勉強会や配信などで行った講演資料を公開しています。 公式サイトはこちら https://www.unrealengine.com/ja/
アニメーションシステム総おさらい Epic Games Japan / Support Engineer Yutaro Sawada
自己紹介 Epic Games Japan Support Engineer 澤田 祐太朗 2
備考 検証バージョンはUE4.20です。 スライドは公開します。 3
アニメーションシステム総おさらい 4
そもそもアニメーションとは? 5
ポリゴン 3つの頂点つないだ ポリゴン 6
ポリゴンの移動 素直にやるとそれぞれの頂点に 移動量を加える 7
複雑に 制御やデータ量が多い 8
ボーンアニメーション B A ボーンB: 1.0 ボーンA: 1.0 ボーンA: 0.5 ボーンB: 0.5 9 頂点には、参照するボーンと どれだけ影響を受けるかWeight値
ボーンアニメーション B A ボーンB: 1.0 ボーンA: 1.0 ボーンA: 0.5 ボーンB: 0.5 10 ボーンを動かすことで アニメーション
ボーンアニメーション 11
データ量が大きくなりがち ランタイムの処理負荷も高い 12
しっかり理解して機能を使うために 総おさらい 13
本日の内容 UE4で使用するアセットやシステムの紹介 アニメーション処理の流れ Tipsの紹介 14
UE4で使用するアセットやシステムの紹介 15
アニメーションアセットやシステム 1. 外部からインポートして利用するアセット 2. UE4内部で作成するアセットや機能 16
外部からインポートして利用するアセット Skeletal Mesh Skeleton Animation Sequence Morph Target Alembic - Geometry Cache(Experimental) 17
外部からインポートして利用するアセット FBX 18
Skeletal Mesh(スケルタルメッシュ) アニメーションを行うための機能を持ったメッシュアセット ポイント • メッシュやボーンの情報を保持 19
Skeleton(スケルトン) アニメーションを適用させるためのボーンの情報をもつアセット ポイント • メッシュ情報とは別に、 独立したアセットとして保存している 20
Animation Sequence(アニメーションシーケンス) アニメーションのデータを持つアセット ポイント • Skeletonをアニメーションさせる情報 • Animation SequenceはSkeletonに紐づく 21
ボーンアニメーションで使用するアセットまとめ Animation Sequence Skeletal Mesh Skeletonのアニメーション 動きを適用 22 アニメーション
Morph Target 頂点ごとのアニメーションを行う ポイント ・ボーンアニメーションは影響を受け る骨の数が限定されているため、もっ と複雑な変形アニメーションを行いた い場合に利用する。 ※InfluencesBoneは4か8 23
Alembic - Geometry Cache(Experimental) アニメーションする頂点位置をすべて保存したもの ポイント • SK_Manequin(Animation Stater Pack) 24フレームで約50MB • 処理速度やファイルサイズの問題で、 ランタイムで使用するのは現状難しい 24
UE4内部で作成するアセットや機能 Animation Blueprint Sub Animation Blueprint Post Process Animation Blueprints Anim Composite Anim Montage Anim Notify Anim Notify State Anim modifier State Machine State Machine Blend Spaces Pose Assets Virtual Bones 25
Animation Blueprint アニメーションのロジックを組むアセット ポイント • Skeleton毎に作成が必要 26
Animation Blueprint アニメーションのロジックを組むためのBlueprint Animation Blueprint Event Graph Anim Graph 27
Sub Animation Blueprint AnimationBlueprintを部品化し別のAnimation Blueprintから呼び出す仕組み ポイント • 同じSkeletonの指定が必要 • 複数人で同時に作業が可能 • 作成するアセットは通常のAnimBPと同じ • 入力としてSub-Graphを作成し繋げる 28
Post Process Animation Blueprints Animation Blueprintの結果を調整するためのAnimation Blueprint ポイント • Mesh毎に設定が可能 • 同じSkeletonの指定が必要 • 作成するアセットは通常のAnimBPと同じ • 入力としてSub-Graphを作成し繋げる 29
Animation Blueprintの運用について 30
Anim Composite(コンポジット) 複数のAnimation Sequenceを繋げて 1つのシーケンスとして扱えるようにするアセット ポイント • ブレンド機能は無い • アニメーションブループリントでは、 Anim Sequenceと同様に扱われる 31
Anim Montage(モンタージュ) 複数トラックでAnimation Sequenceを保持し、ブレンドなども行える ポイント • ブレンドを行う機能がある • GroupやSlotといった単位で、複数 のアニメーションを管理する Montage 映画用語で、視点の異なる複数のカットを 組み合わせて用いる技法のこと。(wikipediaより) 32
Anim Notify Animation中に発生させるイベントの通知 ポイント • Animation SequenceやMontageで設 定することができる • 音やパーティクルを発生させるため の通知 33
Anim Notify State 単純な通知だけではなく、開始や終了のイベントを作成することで、 Begin、Tick、EndといったBPの処理を行うことが出来るNotify ポイント • AnimNotifyStateBlueprintの作成が必要 • Anim Notifyと同様に通知として 呼び出す。 34
Anim Modifier Animation SequenceにCurve情報やNotify情報を追加することができる機能 ポイント • 他のアセットに依存せず 独立して作成が可能 • Skeletonまたは、 Animation Sequence単体に適応可能 (Skeletonに適応を行った場合、そのSkeletonに紐づく すべてのAnimation Sequence適応されます。) 35
State Machine(ステートマシン) 状態遷移を構築しAnimationの状態を決める機能 ポイント • Animation Blueprint内で作成する • 個別のAsset化などはできない 36
Blend Spaces1D(ブレンドスペース) 1次元のグラフにアニメーションをプロットして、ブレンドを行う ポイント • 例:歩くスピードを軸に考える 0に通常状態 1を走る状態 間に歩く状態 37
Blend Spaces2D(ブレンドスペース) 2次元のグラフにアニメーションをプロットして、ブレンドを行うアセット ポイント • 2軸でアニメーションのブレンド が可能 • ブレンドは処理が重いので 注意が必要 38
PoseAssets アニメーション中ある1フレームのボーン状態を保存し利用できる ポイント ・AnimationSequenceから作成できる ・PoseAssetを組み合わせて新たな アニメーションを作ることも可能 39
Virtual Bones SkinningしないボーンをUE4で作成できる機能 ポイント ・DCCツールに戻ることなく作成可能 ・既存のSkeletonの2つのボーン間で拘 束することが可能 ・LookAtなど制御用のターゲットとし て利用可能 40
アニメーションシステムまとめ Skeletal Mesh Skeleton Animation Blueprint Animation Sequence Anim Composite Anim Montage Blend Space State Machine 41
アニメーションシステムまとめ Skeletal Mesh Skeleton Animation Blueprint Animation Sequence Anim Composite Anim Montage Blend Space State Machine 42
アニメーションシステムまとめ Skeletal Mesh Skeleton Animation Blueprint Animation Sequence Anim Composite Anim Montage Blend Space State Machine 43
アニメーションの内部処理について 44
CPUのスレッドについて Game Thread ゲームのメイン処理を行う Task Thread 非同期でGame Threadの補助的処理 Pool Thread UDP通信やシェーダーコンパイル等 Render Thread RHI Thread レンダリングに関わる処理 GPUへのコマンド転送 45
CPUのスレッドについて Game Thread Task Thread Render Thread ゲームのメイン処理を行う 非同期でGame Threadの補助的処理 レンダリングに関わる処理 46
スレッド処理のポイント Game Thread Function Function Task Thread Task Thread Task Thread 47 Function
スレッド処理のポイント Task Thread Task Thread Task Thread DoTask DoTask DoTask Game Thread Function Function Function 48
アニメーション処理の流れ Animation Update Skinning 49
アニメーション処理の流れ Animation Update Skinning 50
アップデート処理 Animation Update Event Update Graph Update 51 Graph Evaluate
Animation Blueprintから見たときのUpdate Animation Blueprint Event Graph Anim Graph Event Update Graph Update 52 Graph Evaluate
アップデート処理 Event Update Graph Update Graph Evaluate アニメーションの パラメーターなどを更新 AnimGraphの 更新 骨のMatrixを更新 53
各ノードの処理について Updateの場合は、FAnimationUpdateContext Evaluationの場合は、FPoseContext 上記でソースコードを検索すると、実際の実装処理が探しやすい 54
スレッド上での動き 55
各処理のスレッド Event Update Game Thread Graph Update Task ThreadまたはGame Thread Graph Evaluate Task ThreadまたはGame Thread 56
CPU処理のポイント Event Update Graph Update DoTask Task Thread DoTask Game Thread Event Update Graph Evaluate Graph Update Task Thread できるだけTaskThreadに逃がすべき 57 Graph Evaluate
CPU処理のポイント Event Update Graph Update DoTask Task Thread DoTask Game Thread Event Update Graph Evaluate Graph Update Task Thread できるだけTaskThreadに逃がすべき 58 Graph Evaluate
Root Motionが有効な場合 59
Root Motion ルートボーンが動くようなアニメーション時、Actor自体の位置を動かす機能 Animation SequenceやAnim Montageで 設定が可能 60
CPU処理のポイント Event Update Graph Update DoTask Graph Update DoTask Game Thread Event Update Graph Evaluate Task Thread Grap Evalu Task Thread できるだけTaskThreadに逃がすべき 61
CPU処理のポイント Event Update Graph Update DoTask Graph Update DoTask Game Thread Event Update Graph Evaluate Task Thread Grap Evalu Task Thread できるだけTaskThreadに逃がすべき 62
Animation Updateまとめ ・アニメーションにはUpdateとEvaluateの二段階がある ・Game Threadで、全て動いてしまうと重い処理となってしまう ・RootMotionを設定するとAnimGraphのUpdateが、 GameThreadで動いてしまう 63
スキニングについて Animation Update Skinning 64
スキニング処理の分岐 USkinnedMeshComponent:: CreateRenderStateConcurrent GPUスキニング CPUスキニング FSkeletalMeshGPUSkin FSkeletalMeshCPUSkin 65 スキニング無し FSkeletalMeshObjectSt atic
スキニング処理の分岐 USkinnedMeshComponent:: CreateRenderStateConcurrent GPUスキニング CPUスキニング FSkeletalMeshGPUSkin FSkeletalMeshCPUSkin Render Thread スキニング無し FSkeletalMeshObjectSt atic CPU側の処理はRenderThreadで走る 66
GPUスキニング 67
アップデート処理 FSkeletalMesh GPUSkin Update Skin Cache Vertex Shader Compute Shader 68
アップデート処理 FSkeletalMesh GPUSkin Update Skin Cache Vertex Shader Compute Shader 69
Updateのみ行うGPUスキニング Pose情報 バッファにセット Render Thread FSkeletalMeshGPUSkin Update GPU Base Pass Base Pass Skinning Draw メッシュ描画(BasePass)の VertexShader内でスキニング 70
Base Pass描画時の流れ GPU Base Pass Base Pass VertexShader PixelShader ベースのボーズ 71
GPUスキニング BasePassのVertexShaderから実際の処理を確認できる(CalcBoneMatrixで検索) 内部的には4つのボーンの影響を受ける処理と、 8つまでのボーンの影響を受ける処理(EXTRA_INFLUENCES)で別れている オプションとして2ボーンまでしか影響を与えないモードがある .¥UE_4.20¥Engine¥Shaders¥Private¥BasePassVertexShader.usf .¥UE_4.20¥Engine¥Shaders¥Private¥GpuSkinVertexFactory.ush 72
ボーン数を制限 ProjectSettingsからRenderingのOptimaization [Limit GPU Skinning to 2bones influence] 73
アップデート処理 FSkeletalMesh GPUSkin Update Skin Cache Vertex Shader Compute Shader 74
Skin Cacheとは Skin Cacheは、ComputeShaderで予めスキニングを行い、 スキニング済みのVetex情報を使い回す方法 75
Skin CacheGPUスキニング SkinCache用 ComputeShaderの用意 Render Thread FSkeletalMeshGPUSkin Update ComputeShader SkinCacheUpdate GPU Base Pass Draw ConputeShaderでスキニングを行い、 BasePass時にはスキニング済み 76
Base Pass描画時の流れ GPU Base Pass Base Pass VertexShader PixelShader スキニング済み ボーズ 77
Skin Cacheの効果 モーフィングなどで変形量が多く スキニングにコストがかかる場合に有効な可能性はある ComputeShaderの作成コスト、またメモリも使用することから 多くのケースでは、期待する効果がでない 78
SkinCache(実装) ComputeShaderも内容としては通常のスキニング処理と同じ 79
CPUスキニング 80
CPUスキニング RenderThread内でスキニン グ Render Thread FSkeletalMeshCPUSkin Update Base Pass GPU Draw スキニング済みの頂点を描画 81
Base Pass描画時の流れ GPU Base Pass Base Pass VertexShader PixelShader スキニング済み ボーズ 82
CPUスキニングが走る条件 ・Chunk(Section)毎の最大ボーン数が、 FeatureLevelで指定された個数を超えた場合 ・ES3.1未満の環境でInfluencesBoneの 最大が4を超える場合 ChunkはMaterial単位なので、マテリアル単位で対象となる ボーン数が指定値を超えるとCPUスキニングになる 83
CPUスキニング(実装) Render Thread で走る Section毎の最大InfuluenceBone数で処理を切っている VectorRegister、VectorMultiplyなどは 128bitのSIMD命令をラップしたもの 84
スキニング無し FSkeletalMeshObjectStatic 85
スキニング無し(FSkeletalMeshObjectStatic) Staticオプションが付いている場合は、スキニング処理がスキップ MeshのDetailsから設定できる 86
スキニング処理まとめ GPUスキニング FSkeletalMeshGPUSkin CPUスキニング FSkeletalMeshCPUSkin スキニング無し FSkeletalMeshObjectStatic GPUでスキニング処理を行う。 SkinCacheが有効の場合ComputeShaderが走る。 GPUスキニングがデータの条件により実行できな い場合、CPUのスキニング処理となる Staticオプションが付いている場合、 スキニング処理の無いパスとなる 87
アニメーションの内部処理 Animation Update Skinning 88
Tips アニメーションアセット制作における注意点 89
アニメーションアセット制作における注意点 ・データ量の肥大化 ・アニメーション処理の増大 90
データ量の肥大化 → データ量の削減 ・アニメーション圧縮 ・Skeletonの共通化 91
アニメーション圧縮 92
アニメーションの圧縮 ランタイムメモリの削減や、パッケージサイズの削減に有効 表現したいアニメーションを崩さないように 適宜設定が必要 93
アニメーションの圧縮設定はAnimation Sequenceから • DetailsのCompression [Edit Compression Settings] 94
Anim Compress • • • • • • • Automatic Bitwise Compress Only Least Destructive Per Track Compression Remove Every Second Key Remove Linear Keys Remove Trivial Keys 95
Anim Compress • • • • • • • Automatic Bitwise Compress Only Least Destructive Per Track Compression Remove Every Second Key Remove Linear Keys Remove Trivial Keys ビットレベルでの圧縮等 96
Anim Compress • • • • • • • Automatic Bitwise Compress Only Least Destructive Per Track Compression Remove Every Second Key Remove Linear Keys Remove Trivial Keys 圧縮せずに 生のデータに近い状態 97
Anim Compress • • • • • • • Automatic Bitwise Compress Only Least Destructive Per Track Compression Remove Every Second Key キーの削除 Remove Linear Keys Remove Trivial Keys 98
Animation Compression Content Browerで圧縮率とサイズが確認できるす
Animation Compression 圧縮率: 小 圧縮率: 大 例はThirdPersonTemplateで6個のAnimSequence 割合で言うと50%以上の差がある場合も 圧縮設定でメモリ消費量が大きく変わる可能性があるため要チェック
圧縮フォーマットの設定 ProjectSettingsのAnimationから設定 101
Animation Compression Libraryの紹介 ・圧縮率、メモリ使用量、精度で UE4標準のものよりも、かなり良い結果 ・現在ランタイムのDecompress時間が、 UE4と同等なので更に改善を行っているとのこと https://github.com/nfrechette/acl-ue4-plugin 現状プラグインとしての提供で公式サポートではない 102
Skeletonの共有化 103
Skeletonの共通化(利点と注意点) ・1つのアニメーションを複数のキャラクタに適用できる ・アニメーションデータやメモリの削減が可能 ・ロジックの使い回しが可能 104
Skeletal Meshをインポートする時の挙動 Skeletonを指定しない Import 新規Skeletonを作成 骨の構成が同じ場合は、 そのまま登録 既存のSkeletonを指定 骨の構成が違う場合は、 Skeletonの更新処理 105
Skeletal Meshをインポートする時の挙動 Skeletonを指定しない Import 新規Skeletonを作成 骨の構成が同じ場合は、 そのまま登録 既存のSkeletonを指定 骨の構成が違う場合は、 Skeletonの更新処理 106
骨構成が違う場合Skeletonの更新処理 Reimportが走らずマージ Skeleton共有ルールを 守っている状態 骨の構成が違う場合は、 Skeletonの更新処理 Skeleton共有ルールを 守っていない状態 Reimportが走ってしまう 107
Skeleton共有ルール ・名前と階層構造で一致を行っている ・新しいボーンを間に挟むことはできない ・末尾に新規ボーンを追加可能 ・末尾のボーンが足りないケースも共有可能 マッピング情報で保持している情報が、 一次元の配列なため 108
Skeleton共有の際に気をつけること 注意 更新した場合、そのSkeletonを参照している すべてのAnimation Sequenceが更新される 対応策 できるだけ必要なBoneは最初から含まれるように、 設計しておく 109
アニメーション処理の増大 110
アニメーション処理の増大 → 細かい最適化 ・アニメーションに関するLOD ・Animation Blueprintに関する注意点 111
・アニメーションに関するLevel Of Detail ・Bone LOD ・Anim NotifyのLOD ・AnimGraphのLODThureshold ・Update Rate Optimization(URO) 112
BoneのLOD LODによってBoneを指定して削除対象にしておくことで、 スキニングから除外することが可能 113
Anim NotifyのLOD Animation Sequenceに設定しているAnim Notifyに MeshのLODの状態によって呼び出し可否を変える事が可能 114
AnimGraphのLODThureshold AnimGraphで評価を行うか、各ノードでLODを設定 設定したLOD以下の状態の場合ノードが無効になる。 115
Update Rate Optimization(URO) 116
Update Rate Optimizations (URO) アニメーションの更新が過剰にならないようにを調整し、 最適化する機能。LODと組み合わせると、効果的 117
UROは設定項目がUI化されていません UActorComponent USceneComponent FAnimUpdateRateManager UPrimitiveComponent UMeshComponent USkinnedMeshComponent USkeletalMeshComponent 118
Animation Blueprintに関する注意点 119
Animation Blueprintに関する注意点 AnimGraphでは、できるだけBlueprintの演算を呼ばないことが 高速化のために必要 120
Fast Path(ファストパス) Anim Graph評価時にBlueprintの演算を実行しない場合に、 値を直接参照することでBPの呼び出しコストを削減する方法 Fast Pathが適応されているノードは、右上に⚡のマークが表示されます。 121
Fast Path(ファストパス) 以下のノードは乗算をしようしているので、 ⚡のマークがなく、Fast Pathでは実行されません。 122
Fast Path(ファストパス) Fast Pathが適応出来ない場合にWarningを出力するオプション 123
スレッド上の動作(Fast Path) 124
アップデート処理 Event Update Graph Update Evaluate アニメーションの パラメーターなどを更新 AnimGraphの 更新 骨のMatrixを更新 125
Animation Updateの動き Event Update Graph Update DoTask Task Thread DoTask Game Thread Event Update Graph Evaluate Graph Update Task Thread Graph Evaluate Fast Pathが関わっていくるのはTask ThreadのUpdate 126
Animation Updateの動き Event Update Graph Update DoTask Task Thread DoTask Game Thread Event Update Graph Evaluate Graph Update Task Thread Graph Evaluate もともと不必要な処理を整理して適応できるのであれば、非常に有効 127
Fast Path適応のためにEventでパラメータを更新 Event Update アニメーションの パラメーターなどを更新 Graph Update AnimGraphの 更新 128 Evaluate 骨のMatrixを更新
Animation Updateの動き Event Update Graph Update DoTask Task Thread DoTask Game Thread Event Update Graph Evaluate Graph Update Task Thread Graph Evaluate もともと不必要な処理を整理して適応できるのであれば、非常に有効 129
Animation Updateの動き Event Update Graph Update Task Thread DoTask DoTask Game Thread Event Update Graph Evaluate Graph Update Task Thread Game Threadで動いているEventUpdateが重くなってしまう 130 Graph Evaluate
Fast Pathまとめ • もともと過剰な処理を整理して適応できるのであれば、非常に有効 • すべてを適応させるためにEvent Graphに処理を持っていくのは危険 131
アニメーションブレンドの注意点 132
アニメーションブレンドの注意点 ・2つのアニメーションをブレンドする時に起きること アニメーションA アニメーションB それぞれアニメーションの評価処理が行われ、 その結果がブレンドされる。 LOREM 133
アニメーションブレンド極端な例 LOREM 134
アニメーションブレンドの極端な例 ・常に2回評価されてしまっている アニメーションA アニメーションB LOREM 135
Animation Sequence Node LOREM 136
アニメーションの評価処理 137
アニメーションに関するCPUの処理 Event Update Graph Update DoTask Task Thread DoTask Game Thread Event Update Graph Evaluate Graph Update Task Thread Graph Evaluateで評価されている 138 Graph Evaluate
アニメーションの評価 指定の時間でのポーズを作る UAnimationSequence GetBonePose LOREM 139
アニメーションの評価 Skeletal Meshのボーン Skeletonのボーン Animation Sequence ボーンの移動データ LOREM 140
アニメーションの評価 Skeletal Meshのボーン Skeletonのボーン Animation Sequenceのデータは、 Skeletonがベース Animation Sequence ボーンの移動データ LOREM 141
アップデート処理 トラック:ボーン毎の移動、回転、スケール毎にある 動かすボーンが Meshにあるかチェック 各トラックで 補完処理 アニメーションデータはSkeletonベースなので、 実際にメッシュのボーンに存在するもののみ評価を行う 指定された秒数(タイミング)の 周りのキーを探して補完 142
Animation Sequence Node LOREM 143
アニメーションブレンド極端な例 LOREM 144
アニメーションブレンドを減らす アニメーションA アニメーションB アニメーションA アニメーションB 設計として、できるだけオーバーラップする時間を減らす LOREM 145
慣性ブレンド ・ アニメーションA アニメーションB 加速度をベースとした補完を行い、 アニメーションの評価は片方のみ LOREM 146
慣性ブレンド 慣性ベースドなアニメーションブレンド(実装編) http://hogetatu.hatenablog.com/entry/2018/06/10/232856 慣性ベースドなアニメーションブレンド(解説編) http://hogetatu.hatenablog.com/entry/2018/06/02/185613 147
アニメーションブレンドまとめ アニメーションブレンドは、できれば少ない方が望ましい 148
〆まとめ 149
まとめ ・アニメーションシステムの紹介 ・内部処理について ・その他Tips アニメーションは負荷が高くなりがちなので、 負荷になるポイントに注意しつつ制作することが重要 150
Characterについての詳しい解説 151
付録 155
RootMotionの取得方法CharacterMoveComponent Actorを動かす挙動は、CharacterMoveComponentに 実装されているため、Skeletal Meshなどを配置した状態だと動作しない。 独自実装をする場合は、 1. SkeletalMeshComponentのConsumeRootMotion()で FRootMotionMovementParamsを取得 2. FRootMotionMovementParamsから GetRootMotionTransformで移動値を取得できる 156
Animation Sequenceの評価を行うGetBonePose UAnimationSequence GetBonePose 指定の時間でのポーズ(FCompactPose)を作る GetBonePoseからEvaluateCurveDataを呼び出す カーブをCurrentTimeで評価を行い配列で取得 GetBonePose内処理 トラックで定義されているScale,Translate, Rotation毎に、 SkeletonとMeshのBoneとのマッピングPairを作る GetBonePoseから呼び出し OutPose.PopulateFromAnimationからAnimationFormat_GetAnimationPose 作成した各種のトラックとマッピングPair情報から、 情報として持っていた圧縮情報をもとに展開してTransformを取り出す 157
最終的なアニメーション評価処理(実装) 各種圧縮や補完方法で定義されているGetBoneAtomTranslation(...)で取得 基本的な動作としては、 取得したい時間の前後のキーフレームを探索し、 その2つのキーフレームのTransform情報を 補完して求める 158