VRChat向けアバターから愚直にパーフェクトシンク対応VRMを作ってみた

みなさんはVRMアバター、持っていますか？
VRM形式のアバターファイルを持っておくと、さまざまなプラットフォームやアプリで利用ができ、とても便利です！

:::note
参考：「VRMファイルが使えるアプリケーションは？」VRMドキュメント
https://vrm.dev/vrm/vrm_applications.html
:::

私も最近、[「Virtual Face」](https://apps.apple.com/jp/app/virtual-face/id1642177402)というVRM対応アプリで遊んでいたのですが、
パーフェクトシンク対応VRMを使うことで、もっと自然な顔の動きを反映できるらしいとのこと。
通常のVRMは既に作っていましたが、パーフェクトシンク対応のものは作ったことが無かったので、今回調べて分かったことなどをまとめていきます。

# そもそもパーフェクトシンクってなに？

一応解説しておくと、
もともとはiOS向けのAR機能である「Apple ARKit」が存在し、これをVRMに流用して使えるようにした仕組みを「パーフェクトシンク」というようです。
こちらにより詳しい解説があります。

https://hinzka.hatenablog.com/entry/2020/08/15/145040

# VRChat向けアバターからVRMに変換

私はよくVRChat向けアバターにお世話になっているので、度々VRMに変換する作業をしています。
VRChat向けアバターからVRMに変換する方法はいろいろとありますが、有志の方の記事やツールなどでほぼほぼ確立されつつあるので、今回は割愛させていただきます。

https://note.com/kuma06046/n/n68628f423bcf

https://booth.pm/ja/items/1025226

# パーフェクトシンク用BlendShapeを追加

VRMをパーフェクトシンク対応にするためには、Apple ARKitに対応する52個のBlendShapeを追加する必要があります。
アプリ側がパーフェクトシンク用BlendShapeを自動で読み込んでくれるので、VRM側では指定された名称の52個のBlendShapeを追加するだけでいい、ということですね。
各BlendShapeについての名称および詳細はこちらの記事が参考になります。

https://hinzka.hatenablog.com/entry/2021/12/02/005814


## 作業開始
それでは、さっそくUnity上での作業に移ります。
状況としては、VRMへの変換作業を終え、生成されたVRMをScene上に配置したタイミングです。
### BlendShape作成
VRMのBlendShape設定から、「Create BlendShapeClip」から新しいBlendShapeを作ります。
52個のBlendShapeの名称は以下の通りです。
- BrowInnerUp
- BrowDownLeft
- BrowDownRight
- BrowOuterUpLeft
- BrowOuterUpRight
- EyeLookUpLeft
- EyeLookUpRight
- EyeLookDownLeft
- EyeLookDownRight
- EyeLookInLeft
- EyeLookInRight
- EyeLookOutLeft
- EyeLookOutRight
- EyeBlinkLeft
- EyeBlinkRight
- EyeSquintLeft
- EyeSquintRight
- EyeWideLeft
- EyeWideRight
- CheekPuff
- CheekSquintLeft
- CheekSquintRight
- NoseSneerLeft
- NoseSneerRight
- JawOpen
- JawForward
- JawLeft
- JawRight
- MouthFunnel
- MouthPucker
- MouthLeft
- MouthRight
- MouthRollUpper
- MouthRollLower
- MouthShrugUpper
- MouthShrugLower
- MouthClose
- MouthSmileLeft
- MouthSmileRight
- MouthFrownLeft
- MouthFrownRight
- MouthDimpleLeft
- MouthDimpleRight
- MouthUpperUpLeft
- MouthUpperUpRight
- MouthLowerDownLeft
- MouthLowerDownRight
- MouthPressLeft
- MouthPressRight
- MouthStretchLeft
- MouthStretchRight
- TongueOut
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659212/7f9ed285-40ef-083f-7df6-2fadbde64555.png)

:::note
使用アバターは「トラスとウェッジ」のトラスちゃんです。
とてもかわいいですね！
:::
https://booth.pm/ja/items/3472207

### アバター側Shapeキーのウェイト設定
先ほど設定したBlendShapeに対応する表情を設定します。
基本的にはアバター側Shapeキーのウェイトを100にすることで設定できるかと思います。
各BlendShapeに対応する表情の詳細は、はいぬっかさん作成のメモが参考になります。

https://docs.google.com/document/d/1Y3vOxI0f3K7dI2XyYoxl0RtT9ebThF6Qbiyg-Z9SNxs/edit

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659212/0a4f7bbc-a558-0d0f-e341-6ce171df54f1.png)

このとき注意してほしいのですが、
**パーフェクトシンク非対応のアバターですべてのBlendShapeを設定することは非常に難しいことが予測されます。**
というのも、パーフェクトシンク用のBlendShapeには細かい仕様の指定があり、非対応のアバターでそれらに対応することは**Blenderなどのモデリングツールを利用して自分で新しく作らない限り難しいからです。**
（例として、BrowInnerUpは「眉の内側を上げる」「眉尻は動かさない」という指定があります。）
既存のShapeキーを無理やり当てはめることも可能ですが、アプリなどでの利用時に表情が崩れてしまう可能性もあり、お勧めできません。
そのため、最低限これだけ設定しておけばよい、というBlendShapeをいくつか列挙します。

- EyeSquintRight, EyeSquintLeft, EyeBlinkLeft, EyeBlinkRight, EyeWideLeft, EyeWideRight
目の動きに関係するBlendShapeです。特に、EyeBlinkLeft, EyeBlinkRightは瞬きを再現するために必要です。

- JawOpen, MouthFunnel, MouthPucker
JawOpenは「あ」の口, MouthFunnelは「う」の口で、口の開閉を再現するために重要なBlendShapeです。口の横幅を狭めるMouthPuckerもあると口の動きが豊かになります。

これ以外でも設定が可能なBlendShapeがあれば設定しておきましょう。

### 動作確認
[「Virtual Face」](https://apps.apple.com/jp/app/virtual-face/id1642177402)で作ったVRMを動かしてみました。

https://twitter.com/kikka_toru/status/1689233059135238144?s=20

瞬きや口の開閉だけでも、かなり自然な動きを再現できていますね！

## まとめ

今回は、VRChat向けアバターからパーフェクトシンク対応VRMを作る方法として、
**「愚直にパーフェクトシンク用BlendShapeを追加する」** というやり方を実践しました！
もう少し賢い方法もあるとは思いますが、とりあえず手っ取り早くVRChat向けアバターからパーフェクトシンク対応VRMを作りたい場合はこの方法で十分でしょう。
今回の趣旨からは逸れますが、VRoidのパーフェクトシンク対応には「HANA_APP」という有料のツールも使えるようなので、興味がある方は詳しく調べてみることをおすすめします。

https://booth.pm/ja/items/2917742

最後に、
**VRMは3Dアバターのファイル形式としてとても便利なので、
みなさんも自分のVRMを作って遊んじゃいましょう！**
という一言を添えておきます。