アバターを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を使用して反映する。これを使うと、各ボーンの向きが違う状態でも、いい感じに反映されるらしい。

処理手順

初期設定
  1. ヒューマノイド型にGameObjectを生成、手指だけOculusのローテーションにする。
  2. ボーンの親子関係を設定してから、UnityのAvaterを生成する。(一時アバター
毎フレーム
  1. ハンドトラッキングの各ボーンの回転を一時アバターのボーンに反映する。
  2. 一時アバター,反映先アバターのHumanPoseHandlerからHumanPoseをゲットする。
  3. 一時アバターのHumanPoseから反映先アバターのHumanPoseに「muscles」の55以降を適応する。(55から指関係の値になる)
  4. 適応したHumanPoseを反映先アバターにセットする。
その他

結果

このような感じでハンドトラッキングアバターに反映することができた。

現状の問題点

  • 手を回しすぎるとアバターの手首がねじれる
      → VRIKとハンドトラッキングの間の調整をうまくすれば解決しそう

余談

Oculusハンドトラッキングの標準の入力で「OVRHand.GetFingerIsPinching()」がある。
各指でTrue/Falseが取得できるが、「親指と各指を近づけたとき」が条件なので、どれかの指がTrueになれば必ず親指もTrueになる。

 

VRMアバターをナデナデする

ハンドトラッキングを反映することができたのでワキワキ指を動かしてアバターをナデナデしたい。

髪の毛などにVRMSpringBoneの設定がされている場合、VRMSpringBoneColliderGroupを手指につけることで干渉できる。

方法

  1. アバターの手指にVRMSpringBoneColliderGroupをつけて設定する。
  2. 撫でるアバターのVRMSpringBone内のコライダー設定欄に「1」で設定したコライダーを追加する。

結果

これでナデナデサワサワすることができるようになった。

 

まとめ

そのうち、もっと丁寧に記述できればと思います。

 

参考

Oculus公式ドキュメント「Unityのジェスチャーコントロール」

GitHub - sotanmochi/HandPoseTransferForOculusQuest: Hand pose controller for humanoid avatars using hand tracking

HumanPose.musclesの中身の95個のfloatはこんな感じ。55から94に指の情報が入っている · GitHub

LeapmotionでVRMモデルの髪を触れるようにする | | Sirohood