今回はPerceptionNeuronというモーションキャプチャとUE4との連携について紹介させていただきます。
使用しているUE4のバージョンは4.18.3になります。
(2018/05/28現在、使用するプラグインが対応しているバージョンが4.18.3までのためです。)
PerceptionNeuronとは
中国のNoitom社から出ている、モーションキャプチャ装置のことです。
ジャイロスコープ、加速度計、磁力計のセンサーがついており、USB、もしくはWifiで
キャプチャしたデータをPCに送るようになっています。全身+指+プロップ1つをキャプチャすることが可能です。
キャプチャ時に使用するソフトはAxisNeuronです。
公式ホームページ(日本語)はこちらになります。
https://neuronmocap.com/ja
UE4で準備するモデルについて
まず、モーションキャプチャをするにあたって、モデルが必要ですが、HIKやBVHに適した骨構造であれば大丈夫です。
またPerceptionNeuronでは全身をキャプチャする以外に、腕のみ、上半身のみキャプチャするモードもありますし、
必ずしも用意するモデルがヒト型ではなくても大丈夫です。
UE4との連携をする場合はRoot(一番上の階層)に回転値などが入っていると、
移動値の軸がおかしくなってしまうので、Rootの回転値はX,Y,Z=0,0,0にしておきましょう。
また、バインドポーズはTスタンスにしておきましょう。
AxisNeuron側の初期値がTスタンスのため、それに合わせるためです。
以下に例として、グレイマンのデフォルトのAスタンスのままモーションキャプチャを流したものと、
Tスタンスにバインドポーズを修正したものを挙げます。

Aスタンスのほうは少し腕をおろした状態を初期値とみなされているため、
モーションキャプチャを流し込むと腕が内側に行き過ぎてしまっています。
また足や指も真っ直ぐではなく角度がついていたため、ポーズが異なっています。
またAxisNeuron側のモデルの特徴としては、以下になります。
まず足の指がありません。そのため、つま先立ちなどで足の指部分だけ接地させたい場合は別途そこだけ動きを付ける必要があります。
InHandがありますが、キャプチャされる部分ではないため、UE4側のモデルにInHanadがなくても大丈夫です。
SpineはSpine~Spine3の4本ありますが、モーションを読み込む側のモデルの背骨の本数を合わせなくても大丈夫です。
UE4とのリアルタイム連携について
UE4との連携はこちらのUnreal Pluginを使用します。
https://neuronmocap.com/downloads
公式のPDFはこちらです。
https://support.neuronmocap.com/hc/en-us/articles/218293067-How-can-i-setup-the-Unreal-Plugin-
このプラグインでできるようになることは以下の点になります。
・AxisNeuronの動きをリアルタイムに反映する
(AxisNeuronでリアルタイムに収録中の動きと、収録済みのBVHをAxisNeuronで再生している状態の動きの2パターンを反映できます)
・AxisNeuronから出力したBVHをUE4のモデルのボーンにマッピングする
今回は以下のようにAxisNeuronとUE4を連携し、モーションキャプチャしたものをUE4で同期再生、
おまけで揺れものを含めた状態でFBXを書き出すところまでの手順を説明させていただきます。
ではPluginの導入から順に説明させていただきます。
1.プロジェクトの作成とプラグインの導入
プロジェクトを作成した後、プロジェクトをいったん終了し、作成したプロジェクトフォルダをエクスプローラで開きます。
プロジェクトフォルダの直下にPluginsのフォルダを作成し、そこに上記リンク先でダウンロードしたプラグインをフォルダごと入れます。
2.プラグインの確認
プロジェクトを再起動し、Pluginが有効になっているか確認します。

3.モデルの読み込み
モデルを読み込みます。
4.AnimationBluePrintを作成
読み込んだモデルのスケルトンを右クリックしてCreate>AnimationBluePrintで作成します。
5.AnimationBulePrintを編集
このAnimationBluePrintでAxisNeuronから送られてくるBVHの骨と、読み込んだモデルの骨をマッピングします。
AnimationBluePrintを開いてAnim Graphを表示して、右クリック>NewPoseCalcのノードを出します。
NewPoseCalcとFinalAnimationPoseをつなげます。

NewPoseCalcをクリックしてマッピングを編集します。
左の欄がNeuronのキャプチャーの骨、右が読み込んできたモデルの骨になります。
右の読み込んできたモデルの骨の欄は、すべての骨があらかじめ登録されているので、
それに合わせて左のNeuronの骨を設定していきます。
(すべての骨をマッピングしなくても大丈夫です)

コンパイルしてセーブします。
6.BluePrintActorを作成
Add Newもしくは右クリック>BluePrintClass>Actorを作成します。
作成したActorを開いてAdd Component>SkeletalMeshとPerceptionNeuronを追加します。
DefaultSceneRootの子ではなく、一番上の階層になるようにしておきます。

追加したSkeletalMeshをクリックし、Details>Animation>Anim Classに5で作成したAnimationBluPrintを選択します。
AnimationModeがUse Animation BluePrintになっていることを確認しておきます。
Meshには読み込んだモデルを選択してください。

コンパイルしてセーブします。
7.AxisNeuronが送るBVHの設定
UE4からAxisNeuron(キャプチャソフト)に移り、File>Setting>Broadcastingの設定項目の中の
Tcp/UDPをUDPに、BVHの欄をEnableにチェックを入れて、ClientPortの番号を確認します。(この番号をUE4で使います)
OKを押してダイアログを閉じてキャプチャ装置とAxisNeuronを接続してリアルタイムでキャプチャしている状態か、
もしくは収録済みのBVHをループ再生している状態にします。
(AxisNeuron上で動いているものがないとUE4に情報が送られません。キャプチャ装置との接続が切れていたり、
BVHの再生が止まっているとUE4側は何も反映されません。)

また、デフォルトの状態だと、骨すべてに移動値もいれてデータが送られてくるため、
場合によってはその移動値により変形がおかしくなってしまいます。
その場合は移動値を含まないようにしてデータを送ることができます。
同じウィンドウ内のOutput Formatに移動し、DisplacementのチェックをOFFにします。
回転順はデフォルトのYXZのままで大丈夫です。

8.レベルに必要なものを配置
新規レベル、もしくは既存のレベルを開きます。
ビューポート(レベル)にリアルタイムにモーションが流し込まれているモデルを表示する方法は2タイプあります。
6で作成したBluePrintActorをそのままレベルに置くタイプと、Spawnerを使ってBluePrintActorをスポーンさせるタイプです。
まずBluePrintActorをそのままレベルに置くタイプのものからです。
作成したレベルに6で作成したBluPrintActorと、ModesからPerceptionNeuronManagerをレベルに配置します。

BluePrintActorの置く位置はモーションの位置に関係するので、再生したい場所になるよう位置を調整します。
(収録データが接地している状態であれば、BluePrintActorの場所が接地面になります。)
配置したBluPrintActorを選択し
PerceptionNeuron(Inherited)>Perception Neuron>Avatar Nameに
AxisNeuronと同じ名前を入れます。AxisNeuronの名前は下記画像のところで確認・変更ができます。

PerceptionNeuronManagerをクリックして、
Network>Portに7で確認したポート番号7002を入れます。

レベルをプレイ(Simulateが確認しやすいです)するとモーションがリアルタイムに反映されているのが確認できます。
次にSpawnerを使ってBluePrintActorをスポーンさせるタイプのものです。
レベルにPerceptionNeuronManagerとPerceptionNeuronSpawnerを配置します。
(上記の方法を試したのち、引き続きこちらの方法を試している場合は、PerceptionNeuronManagerを追加で置く必要はありません。)
PerceptionNeuronSpawnerをクリックして
Actor Binding>Avatar NameをAxisNeuronと同じ名前を入れます。
Dynamic Actor Classには6で作成したBluePrintActorを選択します。
レベルをプレイするとアクターがスポーンされてモーションがリアルタイムに反映されているのが確認できます。
9.収録したBVHを直接UE4上で再生したい
UE4とNeuronが上記の手順で連携できていれば、AxisNeuron側で収録したBVHを再生して、
それをUE4で確認することもできますが、それが面倒な場合などは、UE4に直接BVHをインポートして再生することができます。
インポートしたいBVHは特定の場所に置いておく必要があります。
場所は、プロジェクトの”フォルダ\Content”に”BVH”のフォルダを新規作成し、そこに.bvhファイルを置きます。

流し込みたいBVHをUE4にインポートします。
もし上記の場所に置いていないBVHをインポートした場合、
BVHをダブルクリックすると出てくるダイアログのFile>BVH File Pathにオレンジ色のエラーアイコンが出てきます。

6で作成したBluePrintActorをレベルに配置します。
配置したBluePrintActorを選択し、PerceptionNeuron(Inherited)>BVH Assetに
読み込んだBVHを選択、レベルをプレイするとBVHのモーションが再生されます。

おまけ:UE4からのモーションの書き出し
以上でUE4とAxisNeuronの連携はできました。
ですが、キャプチャしたモーションを修正するとなると、外部のDCCツールにデータを持っていく必要があるかと思います。
AxisNeuronからはBVH、FBXなどのデータを書き出すことができますが、
書き出される骨の名前はAxisNeuronが定めたもので、骨の名前やサイズ、階層構造を変更することはできません。
そのため、リターゲットなどをしなくてはなりませんが、上記手順でUE4とAxisNeuronを連携しているのであれば、
AnimationBluePrintで骨の名前をマッピングしているので、モデルのボーンの構造のままアニメーションを書き出すことが可能です。
また、フィジックスなど、UE4で設定した揺れものなどのアニメーションも書き出せます。
では書き出し方法の説明です。
Neuronと連携している状態のActor、もしくは収録済みのBVHを流しているActorをレベルに配置します。
レベルをプレイして、モーションが動いている状態にします。
AnimBluePrintを開いてDebugFilterからプレビューするモデルを変更します。
→
変更するとAnimationBluePrintのプレビューが、Tスタンスの状態からレベルでプレイしているモーションと同じ動きになります。

動きがプレビューできている状態になったら録画ボタンを押して、作成するファイル名と場所を決めます。

録画終了するとアニメーションシーケンスが作られているのが確認できます。

これをFBXで書き出せば、UE4で見ていたモーションと同じものを外部に書き出せます。
(画像は書き出したFBXをMAYAで開いたものになります)

揺れものなどがある場合はそれらもまとめて書き出せます。試しにモデルにマントを付けて、
それをフィジックスで動かしたものを録画、FBXで書き出しすると以下のようになります。

問題点としては、いくつか手順を踏むので、収録済みのBVHを上記の方法でUE4内で再収録しようとすると、
BVHの開始(エディタのプレイ)タイミングとAnimBluePrintの録画開始タイミングがずれてしまいます。
BVHはループ再生されるので2週目から録画するか、あらかじめBVHの頭に余分な尺を置いておくと良いかもしれません。
モーションキャプチャーの収録と同時にUE4でもアニメーションを収録しようとすると、AxisNeuronとUE4の2つの録画ボタンを押す必要もあります。
収録のタイムスケジュールが決まっていたり、AxisNeuronで後々修正したい場合は、まずAxisNeuronのみ録画し、UE4でFBXに変換、といった手順にしたほうが良さそうです。
揺れものを手付で調整する場合や、UE4での揺れものを考慮して修正する場合に役立つかもしれません。
長くなりましたが、ご覧いただきありがとうございます。
参考になるものがあれば幸いです。