メインコンテンツまでスキップ
バージョン: 1.0.2

任意のハンドジェスチャーの認識

このページでは、基本的なジェスチャーには用意されていない、自分で考えたジェスチャーを認識する方法を紹介します。

作成手順

1. シーンの作成

以下のいずれかの方法でハンドトラッキングが動作するシーンを作成します。

2. スクリプトの作成

ジェスチャーを認識するスクリプトを作成します。

例として、以下の「じゃんけんの手を簡易的に判定する」スクリプトを紹介します。

スクリプトの例

using UnityEngine;
using QCHT.Interactions.Core;

public class CustomHandGesture : MonoBehaviour
{
private XRHandTrackingSubsystem handTrackingSubsystemManager;// ハンドトラッキングの状態の取得用
private void Start()
{
handTrackingSubsystemManager = XRHandTrackingSubsystem.GetSubsystemInManager();
}

private void Update()
{
if (handTrackingSubsystemManager.Status == HandTrackingStatus.Running)// ハンドトラッキング機能が動作しているなら
{
JudgeHandGestureLeft();
}
}

private void JudgeHandGestureLeft()
{
var hand_root = handTrackingSubsystemManager.LeftHand.Root.position;// 手首
var thumb_tip = handTrackingSubsystemManager.LeftHand.GetHandJoint(XrHandJoint.XR_HAND_JOINT_THUMB_TIP).position;// 親指
var index_tip = handTrackingSubsystemManager.LeftHand.GetHandJoint(XrHandJoint.XR_HAND_JOINT_INDEX_TIP).position;// 人差し指
var hand_scale = handTrackingSubsystemManager.LeftHand.Scale;// 手の大きさ

if (hand_scale == 0)// 手が検出されない場合は、hand_scaleは0になる
{
Debug.Log("未検出");
return;
}
if (Vector3.Distance(hand_root, thumb_tip) < 0.11f * hand_scale)// 手首と親指の距離で判定する
{
if (Vector3.Distance(hand_root, index_tip) < 0.11f * hand_scale)// 手首と人差し指の距離で判定する
{
Debug.Log("グーを検出しました!(左手)");
}
else
{
Debug.Log("チョキを検出しました!(左手)");
}
}
else
{
Debug.Log("パーを検出しました!(左手)");
}

Debug.Log("手首と親指との距離:" + (Vector3.Distance(hand_root, thumb_tip) * 100).ToString("f0").PadLeft(2) + "cm"
+ "\n" + "手首と人差し指との距離:" + (Vector3.Distance(hand_root, index_tip) * 100).ToString("f0").PadLeft(2) + "cm"
+ "\n" + "手の大きさ:" + (handTrackingSubsystemManager.LeftHand.Scale * 100).ToString("f0") + "%");
}
}

スクリプトの説明

  • 左右の手について:
    • 上記のスクリプトでは左手を扱っています。右手を扱う場合は、LeftHandの箇所をRightHandに置き換えてください。
  • 指の関節位置について:
    • 指の関節は「GetHandJoint(XrHandJoint.XR_HAND_JOINT_THUMB_TIP).position」で取得しています。
    • スクリプトの例では、指の関節同士の距離を元にジェスチャーを判定しています。
      • 条件を緩く設定すれば認識精度は落ちますが、認識率は高まります。
    • スクリプトの例では、記載していませんが、指の関節の位置情報を元に指の角度を計算して、ジェスチャーを判定するという方法も考えられます。
  • 手の大きさについて:
    • 人によって手の大きさは異なり、指の関節同士の距離も異なるため、Scale変数を判定条件に加えています。
  • ハンドトラッキングの情報について
    • 指の関節位置などハンドトラッキングで取得できる情報の詳細については、QCHT APIのページを確認してください。

3. スクリプトのアタッチ

シーン内の適当なオブジェクトに、上記のスクリプトをアタッチします。

4. シーンの再生

プロジェクト設定でシミュレーション機能を有効にして、Unity Editor上でスクリプトが動作するか確認します。

5. 実機での確認

Unity Editor上では、基本的なジェスチャー以外は確認できないので、実機で意図したジェスチャーを認識できているかを確認します。

意図したジェスチャーを認識できない場合は、作成したスクリプトの内容(指の関節同士の距離など)を、実機でのDebug情報(指の関節同士の距離など)を元に調整します。

関連項目