本日はVisionPro枠、Unity枠です。
先日紹介した通りAppleVisionProでの開発をUnityで行うために必要なPolySpatialがUnityEducationプログラムでもサポートされるようになりました。
今回はハンドトラッキングの座標取得を行います。
〇環境
・Mac Mini(M2)
・AppleVisionPro
・Unity6000.0.32f1
・XRHand 1.5.0
・PolySpatial 2.0.4
〇AppleVisionProのUnityでのHandTracking
AppleVisionProはPolySpatialを使用してUnityで開発ができますが、HandTrackingに関してはXRHandのパッケージを継承しています。
つまりXRHandのプロバイダーを取得することで手の座標を求めることができます。
これは以下のように行えます。
handSubsystem = XRGeneralSettings.Instance.Manager.activeLoader.GetLoadedSubsystem<XRHandSubsystem>();
これを利用して手の座標を取得するコードは以下です。
using UnityEngine;
using UnityEngine.XR.Hands;
using UnityEngine.Events;
using UnityEngine.XR.Management;
using TMPro;
public class Handtest: MonoBehaviour
{
private XRHandSubsystem handSubsystem;
private XRHand jointHand;
[SerializeField] private GameObject indextip;
[SerializeField] private GameObject middletip;
[SerializeField] GameObject ringtip;
[SerializeField] private GameObject littletip;
[SerializeField] private GameObject thumbtip;
void Start()
{
// XRHandSubsystem を取得
handSubsystem = XRGeneralSettings.Instance.Manager.activeLoader.GetLoadedSubsystem<XRHandSubsystem>();
if (handSubsystem == null)
{
Debug.LogError("XRHandSubsystem not found!");
return;
}
}
void Update()
{
if (handSubsystem == null) return;
XRHand rightHand = handSubsystem.rightHand;
if (rightHand == null || rightHand.isTracked == false) return;
XRHandJoint indexTip = rightHand.GetJoint(XRHandJointID.IndexTip);
if (!indexTip.TryGetPose(out Pose indexPose)) return;
Vector3 sculptingPosition = indexPose.position; // 手の指先の位置
indextip.transform.position = sculptingPosition;
XRHandJoint middleTip = rightHand.GetJoint(XRHandJointID.MiddleTip);
if (!middleTip.TryGetPose(out Pose middlePose)) return;
middletip.transform.position = middlePose.position;
XRHandJoint ringTip = rightHand.GetJoint(XRHandJointID.RingTip);
if (!ringTip.TryGetPose(out Pose ringPose)) return;
ringtip.transform.position = ringPose.position;
XRHandJoint littleTip = rightHand.GetJoint(XRHandJointID.LittleTip);
if (!littleTip.TryGetPose(out Pose littlePose)) return;
littletip.transform.position = littlePose.position;
XRHandJoint thumbTip = rightHand.GetJoint(XRHandJointID.ThumbTip);
if (!thumbTip.TryGetPose(out Pose thumbPose)) return;
thumbtip.transform.position = thumbPose.position;
}
}
このコードでは右手の各指の先にオブジェクトを設定して可視化するコードになります。
これを実行することで実機では各指先の先にオブジェクトが表示されるようになります。

Questよりも精度はかなり高いように感じられます。
本日は以上です。