アバターをQuestのハンドトラッキングで動かしVRMアバターをナデナデする
この記事は、 大阪工業大学 Advent Calendar 2020の25日目の記事です。
Questのハンドトラッキングをアバターに適応する方法を雑に記述します。
後でしっかりとしたものを書くかも…
自己紹介
2019年に大阪工業大学を卒業したものです。現在は東京でクソ雑魚プログラマーしています。VRをそれなりに嗜んでいます。
環境
ハードウェア・エンジン
- Oculus Quest 2
- Unity2019.4.16f1
Unityアセット
- Oculus Desktop (Version 2.38.4)
- Oculus Android (Version 2.38.6)
- Oculus Integration 2.3.1
- UniVRM-0.62.0_0b6f
- Final IK (Version 2.0)
その他使用したアセット・モデル
- 自身のモデル … ミーシェちゃん
- ナデナデしたモデル … アリシア(ニコニ立体)ちゃん
- 部屋・背景 … Japanese Apartment
方法
接続・使用方法は省略。OculusLinkでUnityのプレイからデバッグできる状態にする。
Oculusの公式にあるハンドモデルのボーン構成と違うので、公式通りに手指のTransformをそのまま指に突っ込むとありえない向きに曲がることになった。ボーンのY軸方向がOculusは指先が上なのに対して、VRMなどであるヒューマノイドアバターではワールド座標のY軸方向が上になっているのが原因。
そこで、ヒューマノイド型のオブジェクト構成を別で生成、手指のみOculusのボーンと同様の向きにしてからHumanPoseHandlerを使用して反映する。これを使うと、各ボーンの向きが違う状態でも、いい感じに反映されるらしい。
処理手順
初期設定
毎フレーム
- ハンドトラッキングの各ボーンの回転を一時アバターのボーンに反映する。
- 一時アバター,反映先アバターのHumanPoseHandlerからHumanPoseをゲットする。
- 一時アバターのHumanPoseから反映先アバターのHumanPoseに「muscles」の55以降を適応する。(55から指関係の値になる)
- 適応したHumanPoseを反映先アバターにセットする。
その他
結果
このような感じでハンドトラッキングをアバターに反映することができた。
Oculus QuestのハンドトラッキングをVRMアバターに反映してみる pic.twitter.com/XDM9zPLUV7
— はたぽん (@htpn_europa) December 25, 2020
現状の問題点
余談
Oculusハンドトラッキングの標準の入力で「OVRHand.GetFingerIsPinching()」がある。
各指でTrue/Falseが取得できるが、「親指と各指を近づけたとき」が条件なので、どれかの指がTrueになれば必ず親指もTrueになる。
VRMアバターをナデナデする
ハンドトラッキングを反映することができたのでワキワキ指を動かしてアバターをナデナデしたい。
髪の毛などにVRMSpringBoneの設定がされている場合、VRMSpringBoneColliderGroupを手指につけることで干渉できる。
方法
結果
これでナデナデサワサワすることができるようになった。
ハンドトラッキングでアリシアちゃんをナデナデサワサワした pic.twitter.com/cgFEJmC2r5
— はたぽん (@htpn_europa) 2020年12月25日
まとめ
そのうち、もっと丁寧に記述できればと思います。
参考
Oculus公式ドキュメント「Unityのジェスチャーコントロール」
HumanPose.musclesの中身の95個のfloatはこんな感じ。55から94に指の情報が入っている · GitHub