Mocopiで撮ったモーションをVRoidキャラにMayaのHumanIKでリターゲット

# はじめに
Mocopiとは、Sonyから発売されている簡易モーションキャプチャーです。
6DoFのセンサーを6点装着することで、フルボディトラッキングすることが可能です。
ホームページはこちらです。(https://www.sony.jp/mocopi/)
スマートフォンと接続する必要があり、対応端末はホームページに記載されています。
(私のスマートフォンはiPhone11なので対象外なのですが、接続できました。)

VRoidとは、人型キャラクターの3Dモデルを作成できるフリーのモデリングソフトです。
ホームページはこちらです。(https://vroid.com/)

# キャラモデルの準備とHumanIK対応
ご自由にキャラモデルを作成し、MayaのHumanIKに対応させてください。
詳細はこちらの記事に記載しています、「HumanIK対応」まで行ってください。
https://qiita.com/salt-k2t/items/b574f4269185d14151f3

# モーション準備
Mocopiでモーションキャプチャし、BVHファイルをPCに送ってください。
BVHファイルはMaya標準だと読み込め無いため、一度Blenderに読み込みます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878081/4819c3e0-c330-813d-f0ca-ac2ea79a7bd5.png" width="512"  alt="BVH読み込み">

FBXとして出力します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878081/7610f2fe-9457-2e47-35c4-ab1b868308cc.png" width="512" alt="FBX書き出し">
ソフト間のスケールの違いがあるので書き出し時の設定をScale0.01とします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878081/fa5c22fc-1bef-35db-4368-91c9c78666c9.png" width="512" alt="書き出し設定">

# モーションのHumanIK対応
mocopiモーションのFBXをロードし、HumanIKのマッピングを行います。
手動で設定するのが面倒だったので、スクリプト化しました。
よかったら使ってください。(マッピングが間違っていたら指摘いただけるとありがたいです。)
```
rig_name = "Mocopi"

mel.eval('hikCreateCharacter("{0}")'.format(rig_name))
mel.eval('hikUpdateCharacterList()')
mel.eval(' hikSelectDefinitionTab()')

model_root = "root"
cmds.select(model_root)

joint_settings = [["root", 1],
                  ["torso_1", 8],
                  ["torso_2", 23],
                  ["torso_3", 24],
                  ["torso_4", 25],
                  ["torso_5", 26],
                  ["torso_6", 27],
                  ["torso_7", 28],                
                  ["neck_1", 20],
                  ["neck_2", 32],
                  ["head", 15],
                  ["l_shoulder", 18],
                  ["l_up_arm", 9],
                  ["l_low_arm", 10],
                  ["l_hand", 11],
                  ["r_shoulder", 19],
                  ["r_up_arm", 12],
                  ["r_low_arm", 13],
                  ["r_hand", 14],
                  ["l_up_leg", 2],
                  ["l_low_leg", 3],
                  ["l_foot", 4],
                  ["l_toes", 16],
                  ["r_up_leg", 5],
                  ["r_low_leg", 6],
                  ["r_foot", 7],
                  ["r_toes", 17]]
                  
for joint_setting in joint_settings:
    mel_command = 'setCharacterObject("{0}","{1}", {2}, 0);'.format(
        joint_setting[0], rig_name, joint_setting[1])
    mel.eval(mel_command)
```

# リターゲット
キャラクタをキャラモデル(VRoid)に、ソースをモーションモデル(Mocopi)にします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878081/1c1c7cea-5e29-3271-effb-7cba691568ff.png" width="512"  alt="リターゲット">

ベイク処理 → コントロール リグへのベイク処理
を実行します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878081/ef067e32-e288-f86c-8a60-a03be133aebd.png" width="512"  alt="ベイク">

# 確認
ちゃんとリターゲットできていますね、接地もいい感じです
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878081/ac207f18-ce11-2225-97d6-19f3ea2f1225.gif" width="512"  alt="歩きモーション">

早い動きや手を合わせる動きは難易度高いですが、アタリくらいであれば使えそうですね
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878081/42d9dea1-9a06-ac01-5d3c-4af0bdb6b065.gif" width="512"  alt="バッティング">

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878081/7bfafff7-047c-20f6-ac76-573eebdc39c5.gif" width="512"  alt="投げる">

# まとめ
Mocopiで撮ったモーションを、VRoidキャラに、HumanIKでリターゲットしました。
MayaがBVHとVRM(glft)を読むことができない点が面倒ではありますが、
リターゲット性能は素晴らしく、大変便利ですね。

この価格でこの精度を出せるのであれば、個人ゲーム開発やVTuber配信などで重宝すると思います。

余談ですがmocopiの背骨(torso)って7本もあるんですね、6点トラッキングなので相当丁寧に補正されているんだと感じました。