##はじめに
Unityで言うところのFinalIKを使用したVRIKをUE4で実装してみたので覚書です。
環境は4.17.1。
使用するスケルタルメッシュはAnimationStaterPackに同梱されているGrayマンです。
##目指すもの
###準備 ・MotionControllerPawn VROriginの子にGrayマンを追加します。 Rotate Z:-90のオフセットを設定し、Cameraの視線方向と合わせます。 ![スクリーンショット 2017-09-24 01.45.15.png](https://qiita-image-store.s3.amazonaws.com/0/139188/9117833d-062f-add1-7dd6-9431ca3c1417.png)ぷちコンで作ったVRIK、グレイマン版作ってみた。https://t.co/tnJyK8sxPh
— 暇厨 (@HImaJin_Tw) 2017年9月23日
このままではポジトラの恩恵を受けられないので、
カメラの位置を反映するようにします。
Offsetは感覚値で設定しています。
・Map
自分のポーズを確認する必要があるので、SceneCaptureとレンダリングターゲットを用意します。
レベルにパネルを置きマテリアルとして適応します。
・AnimationBP
IK用に必要なので生成してGrayマンに設定します。
###腕IK
・AnimationBP
L・R用のtransformを変数として用意し、FABRIKに使用します。
FABRIKの設定変更点は以下の通りです。
Effector Transform : World Space
Effector RotationSource : Copy Target Rotation
Tip Bone : hand_"x"
Root Bone : clavicle_"x"
"x"はlかrが入ります。
・MotionControllerPawn
AnimationBPで用意したtransformに両手の値をセットします。
値はBP_MotionController:HandMeshのworldTransformです。
しかし、そのまま値をセットするとズレが生じるのでオフセットを考慮します。
右手と左手で演算が違うので注意してください。
BP_MotionController:HandMeshはオフセットの演算補助のために描画していたので、
この設定が終わり次第描画を止めて下さい(Meshは削除しないでください)。
###指IK
手の部分だけBP_MotionController:HandMeshのアニメーションを適応できればいいのですが、やり方がわからないので強引に実装していきます。
BP_MotionController:HandMeshのBone情報を元にIKを行います。
・AnimationBP
Vector3配列を両指分用意し、腕同様FABRIKを使用していきます。
エラー回避のためデフォルト値を用意してください。
FABRIKの設定変更点は以下の通りです。
Effector Transform : World Space
Effector RotationSource : Maintain Local Rotation Relative to Parent
Tip Bone : "finger"03"x"
Root Bone : "finger"01"x"
"finger"にはindex/middle/pinky/ring/thumbのいずれかが、"x"はlかrが入ります。
・MotionControllerPawn
BP_MotionController:HandMeshからBone情報をAnimationBPに渡していきます。
###顔と体
残るは顔の向きです。
上下傾きは素直反映できるのですが、横回転はそうは行きません。
顔が回ったのか体が回ったのか判定できないからです。
今回は顔の横回転==体の横回転として実装していきます。
・AnimationBP
これまで同様、頭用のtransformを変数として用意しFABRIKに使用します。
FABRIKの設定変更点は以下の通りです。
Effector Transform : World Space
Effector RotationSource : Copy Target Rotation
Tip Bone : head
Root Bone : neck_01
・MotionControllerPawn
オフセットを考慮したTransformをAnimationBPに渡していきます。
前を向くoffset(90,60,0)に傾きと上下回転を加味しています。
横回転はコンポーネントを回転させるため固定値です。
##まとめ
Pawn側でオフセット考慮した情報をAnimationBPに渡し、
FABRIKで反映していくとそれっぽくできる。
メッシュ依存する事が多いので共通化が難しい。
##備考
今回のプロジェクトはここにて公開しています。