# ハンドトラッキング仕様

# VRChatにおけるハンドトラッキング仕様

# 概要

TIP

ContactGloveは各指ごとに内蔵されたセンサによって各5指の独立した関節の曲げ伸ばしを取得し、HandTrackingを行います。
以下2通りの方法で、SteamVR経由のVRChatにおいてHandTrackingを行うことができます。

  1. Index-Emulated HandTracking

    • Valve Index Controller互換のHandTrackingを行います。
    • アバター改変が不要です。(Public・Sampleアバター等でのご利用も可能です)
  2. ContactGlove-Native HandTracking

# 詳細

# 1. Index-Emulate HandTracking


ContactGloveのHandTrackingデータを利用し、Index Controller互換のHandTrackingを行う方法です。

特徴
  • 両手の関節ごとではない統合・平均された各5指の曲げ伸ばしを行うことができます。
  • ContactGlove-Native HandTracking と異なり、指の各関節ごとの独立した曲げ伸ばしは表現できません。( = HandTrackingの詳細度は失われます)
  • VRChat内のアバター改変を行うことなくご利用いただけます。

# 2. ContactGlove-Native HandTracking


ContactGloveOSCにより、ContactGlove本来のHandTrackingデータをOSCパラメータ経由でVRChat内アバターへ反映させ、HandTrackingを行う方法です。
ContactGloveOSC のセットアップについてはこちら (opens new window)の項目をご参照ください。

特徴
  • 両手の各5指ごとに独立した関節の曲げ伸ばしをアバターへ反映させることができます。
  • DivingStationから主に以下のをOSCパラメータとしてVRChat側へ送ります。
    • 各関節ごとの曲げ伸ばしの値(float)
    • 専用GestureParameter(int)/ GestureWeight(float) 値
  • ご利用になるVRChat内アバターへ、ContactGloveOSCの導入が必須です。
  • アバターのExpressionParameterの同期パラメータ(TotalMemory)の利用上限256bitの内以下を利用します。
    • Full verで177bit
      • 全ての関節の曲げを0~1の間で0.01刻みで動かすことが出来ます。
    • Lite verで107bit
      • Full ver よりも少ないパラメータ数で全ての関節の曲げを表現できます。
      • 親指・薬指・小指の関節の曲げ/伸ばしは0/1の動作になります。
Skeletal Input について
  • 2023年11月現在VRChatはSkeletal Inputに対応していません。
  • このため、ContactGloveではVRChatのOSC APIを利用して各指・各関節の独立したハンドトラッキングを実現しています。
  • アバターのExpresssionParameterにおける同期パラメータをOSCパラメータにより外部から動かし、アバターの指の曲げ伸ばしを行う専用のAnimationを動作させることで、各指・各関節の独立したハンドトラッキングをアバターへ反映させています。
GestureToggle機能について

ContactGlove-Native HandTracking 利用時、VRChat側の仕様上、VRChat側のGestureToggle機能は動作しません。 DivingStationとOSCを利用した独自実装のバインドにより、GestureToggle機能を実現しています。 詳細はセットアップのこちら (opens new window)をご覧ください。

指の動きのNetWork同期について
  • VRChatの仕様上、Puppet menu以外でのExpressionParameterのNetWork同期はIKではなくPlayable Syncとなります。
  • このため、NetWorkへ反映させているアバターの同期パラメータの同期速度は、通常では 1~10 更新/s となります。
  • よってLocalでの専用Animationを作動させる同期パラメータはそのままでは同期速度が遅く、NetWorkへ反映させているAnimationの動きに顕著なカクツキが生じます。
  • これを防ぐために、アバターへOSCmooth(外部リンク) (opens new window)という仕組みを導入することで、NetWorkで動作しているExpressionParameterの補完を行っています。