Unityで、Vroid製のVRMモデルをQuestProのフェイストラッキングに合わせて動かす!
QuestのデフォアバターとかWorkroomで試すのはやった。
パーフェクトシンク
できればパーフェクトシンクにも対応したい。
Vroidモデルにパーフェクトシンク対応させるのは、以前はHanaToolでやった
Hanatool以外にいいツールないかTwitterでみたら今はUnityを使わないHana_Appが主流っぽい
VRoidにパーフェクトシンクを対応させるならHANA_Tool(1,000円)よりHANA_App(1,500円)が圧倒的にラクだった。Unity使わなくても出来た。
— 溯月 梛央(さかつき なお) (@NaoSakatsuki) 2023年11月29日
顔パーツの動き方指定するClipsってやつは自分で地道に調整だけど、バーになってるから誰でも出来る。
Appの存在知ったのがTool買った後だったので右往左往した。
今回は以前作ったパーフェクトシンク対応のモデルを使う
Quest開発の環境設定
Questの開発100年ぶり・・・
最近OculusIntegrationじゃなくて Meta XR UPM packages に変わったらしい
https://developer.oculus.com/downloads/package/meta-xr-sdk-all-in-one-upm/?locale=ja_JP
Minimal Unity Version: 2021.3.26f1
UnityAssetStoreから入れられる。えっUPMじゃないのか?
インストールを押したら、Oculus独自のライセンス画面が出た!
公式のガイドページはこちらかな?ちょっと古い気がするが
Get Started with Meta Quest Development in Unity | Oculus Developers
このページが分かりやすい。このページに沿ってやった
https://developer.oculus.com/documentation/unity/unity-tutorial-hello-vr/
Meta Quest Developer Hub(旧Oculus Developer Hub)も事前に準備しておけって書いてあったので一応インストールしたけど、いらなかった気もする。
https://developer.oculus.com/downloads/native-android/
Unityでプロジェクト作って、AndroidにSwitchして、questを開発者モードにしてPCにつないで、RunDeviceにQuestを出す。Refreshしたら出た
そしてOculus>setupみたいなメニューからこの画面を出してFixAllやAllpyをこれらがすべて消えるまでやる。そしたらもろもろの設定を勝手にやってくれる!便利!
あとはシーンを用意する。
ミニマムだとOVRCameraRigを追加するだけ。名前で検索する際PackagesのほうにあるのでAllにしたほうがいい
今回は適当なMetaXRのパッケージのsampleをインポートしてそれをビルドした
いずれの場合も対象の機材にチェックが入っているか確認。
そしてBuild&Run!
ちゃんとビルドされた!
このあとBuild&Runしたら失敗することがあったけど、Buildだけして、MetaDeveloperHubソフトからapkをドラックで入れたら動いた。
ちなみにMeta XRのサンプルはいろいろ面白いものがあるってTwitterで見かけた気がするので、それは別記事で試そう~
VRM表示
uniVRM入れて、VRMモデルを入れて、OVRCameraを置いたシーンにVRMモデルを置いたら普通に表示された。
最初の設定だと、カメラがUnityの0の高さにあって、上のほうにVRMモデルがあったのでTracking Origin TypeをFloorLevelにしたら目の前に表示された
フェイストラッキング
こちらを参考にやっていく!
OVRFaceExpressionsと、↑の記事内のFaceExpressionsControllerをVRMモデルのfaceにつける。
OVRCameraRigで以下のFaceTrackingの設定をする
するとQuestProでビルドすると無事自分のまばたきが反映された!
コードの内容的にOVRでの目を開く閉じるのパラメーターの値を、Vroidの13,14番目のBlendeshape(=目を開く閉じる)の値に入れている
パーフェクトシンク対応
追記:HanaToolのOVR用パーフェクトシンク
HanaToolでOVR用のブレンドシェイプを作れる!これでこの苦労はいらない
--
パーフェクトシンクはiOSのFaceIDの規格に対応するためのもの。
QuestProのフェイストラッキングとはデータの種類や名前は違うので置き換えないといけない
パーフェクトシンクで設定した名前をOVR用に置き換えるのは、BlendShapeのインスペクターで置き換えればいい
はいぬっかさんの記事の表を元にひとつずつやっていった。
そしてこちらの方のFaceExpressionsControllerVRMをfaceに付ける。
こうやって全部置き換えたのだが、1、2個パラメーターを置き換えたときはその部分と瞬きは反応していたのに、全部置き換えたら瞬きしか反応しなくなった;;
なんでかわからないので、別のキャラで4つずつぐらいパラメーターを置き換えて行ったら、半分ぐらい置き換えたけど今のところちゃんと動く。
JawOpen(OVRではJawDrop)が口の閉じ開きなので、それは優先的にやったほうがいい。
あとは頬をプクーってやるのが可愛くて楽しい。
舌
ちなみにOVRの最新版のv60では舌も追加されている。
v60(現時点での最新版)のo_v_r_face_expressionsのリファレンス。
https://developer.oculus.com/reference/unity/v60/class_o_v_r_face_expressions/
本当だ。舌がある。
パーフェクトシンクの方も舌はあるので、これもパラメーター置き換えて、さっきのスクリプトにパラメーター追加したら良いかな?
ちなみに多分舌を出すパラメーター名は両方同じ「TangueOut」っぽい
追加したら瞬き以外が反応しなくなった;;
視線
視線はパーフェクトシンク(=ARkit)には入ってたかな・・・?
OVRのフェイストラッキングの方のパラメーターにはなさそう
アイトラッキング自体はできるので、別途対応方法を考えないといけないかな?軽くググってもVRMモデルでやっている人はいなさそう
waidayoでやったら目線動いた。
VRMではBlendeShapeでやる方法とボーンで目線を動かす方法がある。
いずれにしてもVRMの公式の機能を使うならLookAtという形式でしか動かせないのかな?
ここでできた
体
VRMアバターをQuestの動きに沿って動かすのは別途VRIK使わないといけないかな~
こちらの記事に紹介されているボディトラッキングも試したら、上半身はちゃんと取得できた!
ここでできた
追記 ARKitFace
Unity-Movementというフェイストラッキングなどのサンプルが入っている公式のアセットの中に、ARKitのBlendShapeをOVR用に変換するスクリプトが入っていた!
https://developer.oculus.com/documentation/unity/move-body-tracking/
これはVRMでも使えて、VroidのFaceにOVRFaceExpressionsと共につけて、AutoGenerateを押すとある程度は変換されたが、いろいろ間違っている部分もあった
これを一つ一つ手作業で置き換えていくのめんどくさいな・・・
コピペもできないし・・・
置き換えないで動かしたら、結構変な表情になった
追記:音声のリップシンク
あとでuLipSyncで音声からの口パクをやったが、uLipsyncのスクリプトをオフにしても口を動かしてなくてもしゃべったら口が動くな~と思ったら、フェイストラッキングがAudioからも口を動かしていたせいっぽい