OculusGoのAvatarで口を動かす
もしかしたらハマる人少ないかもしれないけど、盛大にハマったのでやり方をまとめます。
1. ドキュメント情報を確認
https://developer.oculus.com/documentation/avatarsdk/latest/concepts/avatars-gsg-unity-mobile/#avatars-sdk-unity-mouth_movement
Oculusの公式で、口を動かすやり方は上記に書いてあります。
なお、LipSyncというサンプルがOculusIntegrationの中にあり、そっちでは音素に合わせて口の形を変えてますが、現状のOculusのAvatarではその機能に対応していない様子。
口の大きさを音圧で変える方法のみ対応しています。
・・・が、ここに書いてあるように、 OvrAvatar.VoiceAmplitudeを 0-1の範囲で設定しても、それだけでは口は動きません。
公式にはここくらいしか書いてないのに・・・!
2. サンプルソースをあさる
OvrAvatar.VoiceAmplitudeを参照してるサンプルコードを探してみたところ、 Assets/Oculus/Avatar/Samples/SocialStarter/Assets/Scripts/SocialPlatformManager.csにて参照されていることを確認。(階層が深い・・・見つけづらい・・・)
このクラスの、Update()関数内ではドキュメント以上のことをやっているようには見えないためここで詰まる。
ぐぐぐ・・・
3. OvrAvatarのソースを見る
そもそもOvrAvatar.VoiceAmplitudeは内部でどのように動作してるのか確認してみました。
OvrAvatar.UpdateVoiceBehavior()にて、VoiceAmplitudeを係数として口の大きさを決めてるっぽいソースコードを発見。
この関数の一番上がこうなってました。
private void UpdateVoiceBehavior()
{
if (!EnableMouthVertexAnimation)
{
return;
}
・・・これだ!
4. 解決
結論から言えば、 OvrAvatar.EnableMouthVertexAnimationが true になってないとAvatarの口は動きません。
改めて SocialPlatformManager.csを確認し直したところ、確かにremoteAvatarとlocalAvatar両方でEnableMouthVertexAnimation = trueの処理を入れてました。
公式情報がちょっと足りなかったのですね。Oculusはだいぶ情報も出てきていますが、まだまだ情報が足りないところも多いです。
口は動かせてもAvatarのLipSyncはまだ対応してないとか、初めはわからなかったですし・・・(ドキュメント読み込み不足)
・・・っていうかLipSync対応してないですよね? もうちょっと資料探したらやり方見つかるとかないですよね?
まあとにかく、同じところでハマる人が居たら、一助になれば幸いです〜