UE5でのリターゲット


# 下準備
UE5から異なるスケルトン間でのアニメーションリターゲットの方法が変更。IKリターゲッタが必須となり、今(5.0.0)のところ従来の手順でのリターゲットはできない(その分利点は多い)
３通りのリターゲット方法があるものの、IKリターゲッタの設定まで手順は同じ。

### IKリグ
まずはソースとなるスケルタルメッシュのIKリグアセットを作成する。
![ikrig.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2368554/81302980-c16f-dc83-4483-5538eb3db50a.png)
ソース(リターゲット元)となるスケルタルメッシュを指定。
今回はMannyをソースとしてリターゲットする。
MannyはIKリグが予め用意されているが、それを参考として今回は最初からセットアップする。

作成されたIKリグアセットを開く。
![ikrig2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2368554/b2e9c549-780e-4a93-8f2b-6172f07fec66.png)
スケルトンツリー(画像左)から腰(pelvis)を右クリック＞"リターゲティングルートの設定"

IKリターゲティング(画像右下)の欄から必要に応じて各チェーンを作成。最低限背骨、四肢、頭部が設定されていればそれらしく動く。

指などの作成が手間な部位は、スケルトンツリーで階層選択→右クリック＞"選択ボーンからリターゲティングチェーンを新規作成"で行うと楽。
この辺りは後々プリセットが使えるようになる……といいなあ
<br>

ターゲット側も同様にIKリグを作成、設定を行う。
チェーン名を合わせておくと次の工程で自動設定してくれる。
### IKリターゲッタ
IKリグ作成時に１つ下にあったIKリターゲッタを作成する。
![ikretarget00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2368554/b7e779db-d564-a4fd-d16c-30d377529703.png)
ソースのIKリグを選択して作成。

作成されたIKリターゲッタを開く。
![ikretarget01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2368554/3ec299b8-31ab-bf5e-1622-bc45f2e4ccf5.png)
TargetIKRigAsset(画像右上)にターゲットとなるIKリグを指定するとターゲットがソースの横に並ぶ。

上部の"ポーズの編集"でターゲットのポーズをソースに合わせる。ボーンの表示サイズは詳細から変更可。

チェーン名がある程度合致していれば"チェーンの自動マップ"で合わせてくれる。異なる部分は手動で合わせる。ソース側に該当するチェーンが無い場合Noneにしておく。
![ikretarget02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2368554/ee568228-e024-60a9-7466-8fcad01c41c2.png)
アニメーションを選択すれば書き出さずともリターゲット結果をプレビューしてくれる。
おかしな箇所があればポーズの編集やチェーン設定を見直す。
# リターゲット方法①アセットメニューから
おそらく従来の一般的な方法に近いのがこちら。
アニメーションアセットのメニューからリターゲットする。
![reta01-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2368554/88cc4b74-30da-9388-5967-25a4277952f7.png)
アニメーションシーケンス等を個別にリターゲットもできるが、AnimBPをリターゲットすれば内部で参照しているアニメーションアセットも自動的に置換してくれる。
![reta01-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2368554/319a0eeb-a5bd-07c5-9c01-f6ab42614860.png)
IKリターゲッタを指定し、命名規則や保存場所を指定してリターゲット。
![20220412_114700.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2368554/76e78fcd-bb83-f5bf-5152-e2684bafed52.jpeg)
作成されたAnimBPを開いてみる。
![20220412_111133.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2368554/b0df2f1f-777d-ebd0-6966-c17c6570009b.jpeg)
アニメーションアセットの参照は置換してくれるがボーンの参照はそうもいかない。
特に足IKを機能させたい場合コントロールリグをどうにかする必要があるが、未履修なので当稿ではこれ以上は触れられない。
ともあれその辺りの処理を飛ばしても差し当たり動くようになる。
![20220412_114323.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2368554/39c2a663-605a-f8ff-fa58-6004b539fd77.jpeg)
# リターゲット方法②アニメーションテンプレート

アニメーションブループリントを新規作成するとこのような窓が出てくる。
![20220412_124708.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2368554/28c567cd-1fcf-b011-046e-c6372baa6313.jpeg)
テンプレートタブに切り替えて、下部のプルダウンからソースのAnimBPを選択して作成
![reta02-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2368554/ffc32f0a-2154-c809-cbb9-18b60cc012e9.png)
元のAnimBPの継承として作られるが子と違ってスケルタルメッシュの参照を持たず、is TemplateがTrueになっている。
中間素材なので開く必要はない。
![reta02-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2368554/bc577b02-f9bd-bddd-a7f4-b43142001e4f.png)
アセットメニューに"子AnimBPをスケルトンで作成"という項目があるので、ターゲットとなるスケルトンを選択、作成する。そして開く。
![20220412_150444.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2368554/5cbdafdc-44bf-fe25-cb82-94bb0ccf2843.jpeg)
右上のアセットオーバーライドから親のAnimBPが参照しているシーケンスやブレンドスペースをリターゲットしたアニメーションに差し替えることができる。
ただしAnimBPテンプレートはAnimGraphの編集ができないため、①と同様のボーンにまつわるエラーを解消できない。そもエラーとして表示されない。
追加処理という形であればPostProcessAnimBPで実装できる。
![20220412_154840.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2368554/47a35adf-0afa-51a3-f96a-99287762ee95.jpeg)
# リターゲット方法③RetargetPoseFromMesh
概要(個人的解釈)としては、ソースとターゲットを同時に実装し、ランタイムでリターゲットを行うといったもの。
ソースのAnimBPを介していないのでエラーが発生しない。何よりアニメーションアセットの使い回しが可能となる。以下手順。

ターゲットのスケルタルメッシュからAnimBPを作成。開く。
![animbp00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2368554/16d5c4dc-018d-5257-ab19-694373f8bbe8.png)
AnimGraphでRetargetPoseFromMeshノードを作成してOutputへ繋ぐ。
ノードの詳細＞IKRetargeter Assetにリターゲッタを指定。
<br>
ThirdPersonテンプレートのBP_ThirdPersonCharacterで動かしてみる。
![ChaBP01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2368554/326f4d90-8767-205e-a1d4-c3a556afb994.png)
ソースであるスケルタルメッシュの子にする形でターゲットのスケルタルメッシュを追加。AnimBPも設定しておく。
この時点でソースのモーションがターゲットにも投影される。(IKリターゲッタのポーズの編集がONになっていると動かない)

重なったままでは使えないのでソースはVisibleやHiddenInGameで非表示にする必要がある。が、
![ChaBP02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2368554/3a4975da-8a58-adf9-ab3b-f2b54a9fd6bc.png)
プレイしてみると待機ポーズで固まったまま滑ったり跳ねたりする。
原因はソースのスケルタルメッシュコンポーネントのここ
![ChaBP03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2368554/eaceed64-b148-5506-cf09-cf64ad194405.png)
VisibilityBasedAnimTickOption を AlwaysTickPose → AlwaysTickPoseAndRefreshBones に 
![20220412_193930.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2368554/d86add77-4c5e-62da-8405-7bc02a617924.jpeg)
動くようになった。
が、今度は接地にズレが生じている。
修正のためIKリグとIKリターゲッタを編集する。おまけ的な部分なので箇条書きで。

①IKリグを開き、左下から新規ソルバを追加＞フルボディIK
②腰(pelvis)→選択されているソルバにルートボーンを設定
③pelvis→設定を選択ボーンに追加。追加した設定の詳細から回転の剛性を１に。
④足首(foot)→IK目標の新規作成
⑤foot_Goalをドラッグ＆ドロップでつま先ボーンの子に
⑥膝(calf)、腿(thigh)→設定を選択ボーンに追加
⑦ビューでGoalを持ち上げ、calfとthighに追加した設定の詳細から"望ましい角度"を良い感じに設定。
⑧反対側の足も④以降同じように設定
⑨LeftLeg、RightLegチェーンのIK目標にそれぞれを指定。
⑩IKリターゲッタを開き、LeftLeg、RightLegチェーンの詳細＞IK調節＞BlendToSourceを1、BlendToSourceWeightsを0,0,1、静的オフセットのZを足が接地する値に。

ジャンプモーション等の際に膝が上がりすぎるといった場合は⑩と同項にある"回転のアルファ"を調整する。
![20220412_210809.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2368554/f34bdc65-ac1e-717d-1c63-37191d21cf95.jpeg)