73 lines
2.7 KiB
C#
73 lines
2.7 KiB
C#
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
using Microsoft.MixedReality.Toolkit.Utilities;
|
|
|
|
namespace Microsoft.MixedReality.Toolkit.Input
|
|
{
|
|
public static class HandJointUtils
|
|
{
|
|
/// <summary>
|
|
/// Tries to get the pose of the requested joint for the first controller with the specified handedness.
|
|
/// </summary>
|
|
/// <param name="joint">The requested joint</param>
|
|
/// <param name="handedness">The specific hand of interest. This should be either Handedness.Left or Handedness.Right</param>
|
|
/// <param name="pose">The output pose data</param>
|
|
public static bool TryGetJointPose(TrackedHandJoint joint, Handedness handedness, out MixedRealityPose pose)
|
|
{
|
|
return TryGetJointPose<IMixedRealityHand>(joint, handedness, out pose);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Try to find the first matching hand controller of the given type and return the pose of the requested joint for that hand.
|
|
/// </summary>
|
|
public static bool TryGetJointPose<T>(TrackedHandJoint joint, Handedness handedness, out MixedRealityPose pose) where T : class, IMixedRealityHand
|
|
{
|
|
T hand = FindHand<T>(handedness);
|
|
if (hand != null)
|
|
{
|
|
return hand.TryGetJoint(joint, out pose);
|
|
}
|
|
|
|
pose = MixedRealityPose.ZeroIdentity;
|
|
return false;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Find the first detected hand controller with matching handedness.
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// The given handedness should be either Handedness.Left or Handedness.Right.
|
|
/// </remarks>
|
|
public static IMixedRealityHand FindHand(Handedness handedness)
|
|
{
|
|
return FindHand<IMixedRealityHand>(handedness);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Find the first detected hand controller of the given type with matching handedness.
|
|
/// </summary>
|
|
public static T FindHand<T>(Handedness handedness) where T : class, IMixedRealityHand
|
|
{
|
|
System.Collections.Generic.HashSet<IMixedRealityController> controllers = CoreServices.InputSystem?.DetectedControllers;
|
|
|
|
if (controllers == null)
|
|
{
|
|
return null;
|
|
}
|
|
|
|
foreach (IMixedRealityController detectedController in controllers)
|
|
{
|
|
if (detectedController is T hand)
|
|
{
|
|
if (detectedController.ControllerHandedness.IsMatch(handedness))
|
|
{
|
|
return hand;
|
|
}
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
}
|
|
}
|