Hololens 获取手部关节数据

作者:追风剑情 发布于:2023-2-16 14:43 分类:Unity3d

手部关节名称定义

11111.png
这些关节名称被定义在Microsoft.MixedReality.Toolkit.Utilities.TrackedHandJoint枚举中。

轮询获取关节数据

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Microsoft.MixedReality.Toolkit;
using Microsoft.MixedReality.Toolkit.Input;
using Microsoft.MixedReality.Toolkit.Utilities;

public class Test : MonoBehaviour
{
    void Update()
    {
        /* 下面代码以轮询方式获取关节数据 */
        //获取右手指尖的姿态数据
        if (HandJointUtils.TryGetJointPose(TrackedHandJoint.IndexTip,
            Handedness.Right, out MixedRealityPose pose))
        {

        }
        //--End

        //从手部关节服务获取关节转换对象
        var handJointService = CoreServices.GetInputSystemDataProvider<IMixedRealityHandJointService>();
        if (handJointService != null)
        {
            //获取右手指尖的转换对象
            Transform jointTransform = handJointService.RequestJointTransform(TrackedHandJoint.IndexTip, Handedness.Right);
        }
        //--End
    }
} 

通过接口监听关节数据更新

实现Microsoft.MixedReality.Toolkit.Input.IMixedRealityHandJointHandler接口的类可监听关节数据更新。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Microsoft.MixedReality.Toolkit;
using Microsoft.MixedReality.Toolkit.Input;
using Microsoft.MixedReality.Toolkit.Utilities;
/// <summary>
/// 通过实现接口来监听关节位置的更新
/// </summary>
public class MyHandJointEventHandler : MonoBehaviour, IMixedRealityHandJointHandler
{
    public Handedness myHandedness;
    void IMixedRealityHandJointHandler.OnHandJointsUpdated(InputEventData<IDictionary
   <TrackedHandJoint, MixedRealityPose>> eventData)
    {
        if (eventData.Handedness == myHandedness)
        {
            if (eventData.InputData.TryGetValue(TrackedHandJoint.IndexTip,
           out MixedRealityPose pose))
            {
                //关节坐标
                Vector3 pos = pose.Position;
                //关节旋转度
                Quaternion rot = pose.Rotation;
                //关节正前方矢量
                Vector3 forward = pose.Forward;
                //......
            }
        }
    }
} 

Microsoft.MixedReality.Toolkit.Input.HandJointUtils类
序号 方法
1 public static bool TryGetJointPose(TrackedHandJoint joint, Handedness handedness, out MixedRealityPose pose)
获取关节姿态数据。
2 public static bool TryGetJointPose<T>(TrackedHandJoint joint, Handedness handedness, out MixedRealityPose pose) where T : class, IMixedRealityHand
泛型方法。获取关节姿态数据。
3 public static IMixedRealityHand FindHand(Handedness handedness)
返回手部控制器。
4 public static T FindHand<T>(Handedness handedness) where T : class, IMixedRealityHand
泛型方法。返回手部控制器。

Microsoft.MixedReality.Toolkit.Utilities.HandPoseUtils类
序号 方法
1 public static float CalculateIndexPinch(Handedness handedness)
返回食指尖与拇指尖的捏合度。取值范围0~1,0表示完全张开,1表示完全捏合。
2 public static bool IsIndexGrabbing(Handedness hand)
如果食指尖(tip)比食指关节(knuckle)更靠近手腕(wrist),则返回true。
3 public static bool IsMiddleGrabbing(Handedness hand)
如果中指尖(tip)比中指关节(knuckle)更靠近手腕(wrist),则返回true。
4 public static bool IsThumbGrabbing(Handedness hand)
如果拇指尖(tip)比拇指关节(knuckle)更靠近手腕(wrist),则返回true。
5 public static float ThumbFingerCurl(Handedness handedness)
返回拇指卷曲度。取值范围0~1,0表示完全伸直,1表示完全卷曲。
6 public static float IndexFingerCurl(Handedness handedness)
返回食指卷曲度。取值范围0~1,0表示完全伸直,1表示完全卷曲。
7 public static float MiddleFingerCurl(Handedness handedness)
返回中指卷曲度。取值范围0~1,0表示完全伸直,1表示完全卷曲。
8 public static float RingFingerCurl(Handedness handedness)
返回无名指卷曲度。取值范围0~1,0表示完全伸直,1表示完全卷曲。
9 public static float PinkyFingerCurl(Handedness handedness)
返回小指卷曲度。取值范围0~1,0表示完全伸直,1表示完全卷曲。

Microsoft.MixedReality.Toolkit.Input.HandJointService类
序号 方法
1 public Transform RequestJointTransform(TrackedHandJoint joint, Handedness handedness)
获取某关节的变换对象。
2 public bool IsHandTracked(Handedness handedness)
判断某只手是否正在被追踪。
//获取HandJointService
var handJointService = CoreServices.GetInputSystemDataProvider<IMixedRealityHandJointService>();

标签: Unity3d

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号