Files
plugin-library/Assets/07.RKTools/RunTime/GestureRecognition/GestureBase.cs

131 lines
3.7 KiB
C#
Raw Normal View History

2025-04-22 10:32:33 +08:00
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Rokid.UXR.Interaction;
2025-05-19 15:42:24 +08:00
namespace Stary.Evo.RKTools
2025-04-22 10:32:33 +08:00
{
2025-05-19 15:42:24 +08:00
public abstract class GestureBase : MonoBehaviour
2025-04-22 10:32:33 +08:00
{
2025-05-19 15:42:24 +08:00
private GestureBean leftBean = null;
private GestureBean rightBean = null;
2025-04-22 10:32:33 +08:00
2025-05-19 15:42:24 +08:00
protected void OnEnable()
2025-04-22 10:32:33 +08:00
{
2025-05-19 15:42:24 +08:00
GesEventInput.OnTrackedSuccess += OnTrackedSuccess;
GesEventInput.OnTrackedFailed += OnTrackedFailed;
GesEventInput.OnRenderHand += OnRenderHand;
2025-04-22 10:32:33 +08:00
}
2025-05-19 15:42:24 +08:00
protected void OnDisable()
2025-04-22 10:32:33 +08:00
{
2025-05-19 15:42:24 +08:00
GesEventInput.OnTrackedSuccess -= OnTrackedSuccess;
GesEventInput.OnTrackedFailed -= OnTrackedFailed;
GesEventInput.OnRenderHand -= OnRenderHand;
2025-04-22 10:32:33 +08:00
}
2025-05-19 15:42:24 +08:00
protected void FixedUpdate()
2025-04-22 10:32:33 +08:00
{
2025-05-19 15:42:24 +08:00
if (leftBean != null)
{
GestureType type = GesEventInput.Instance.GetGestureType(HandType.LeftHand);
Vector3 handForward = GetSkeletonPose(SkeletonIndexFlag.PALM, HandType.LeftHand).forward;
GestureLeftSuccess(type, handForward);
}
else
{
GestureLeftFail();
}
if (rightBean != null)
{
GestureType type = GesEventInput.Instance.GetGestureType(HandType.RightHand);
Vector3 handForward = GetSkeletonPose(SkeletonIndexFlag.PALM, HandType.RightHand).forward;
GestureRightSuccess(type, handForward);
}
else
{
GestureRightFail();
}
2025-04-22 10:32:33 +08:00
}
2025-05-19 15:42:24 +08:00
private void OnTrackedSuccess(HandType handType)
2025-04-22 10:32:33 +08:00
{
}
2025-05-19 15:42:24 +08:00
private void OnTrackedFailed(HandType handType)
2025-04-22 10:32:33 +08:00
{
2025-05-19 15:42:24 +08:00
if (handType == HandType.None)
{
leftBean = null;
rightBean = null;
}
if (handType == HandType.RightHand)
{
rightBean = null;
}
if (handType == HandType.LeftHand)
{
leftBean = null;
}
2025-04-22 10:32:33 +08:00
}
2025-05-19 15:42:24 +08:00
private void OnRenderHand(HandType handType, GestureBean gestureBean)
2025-04-22 10:32:33 +08:00
{
2025-05-19 15:42:24 +08:00
if (handType == HandType.RightHand)
{
rightBean = gestureBean;
}
if (handType == HandType.LeftHand)
{
leftBean = gestureBean;
}
if (handType == HandType.None)
{
rightBean = null;
leftBean = null;
}
2025-04-22 10:32:33 +08:00
}
2025-05-19 15:42:24 +08:00
/// <summary>
/// 获取骨架点位置
/// </summary>
/// <param name="index">骨架序号</param>
/// <param name="hand">哪只手</param>
/// <returns></returns>
public Pose GetSkeletonPose(SkeletonIndexFlag index, HandType hand)
2025-04-22 10:32:33 +08:00
{
2025-05-19 15:42:24 +08:00
return GesEventInput.Instance.GetSkeletonPose(index, hand);
2025-04-22 10:32:33 +08:00
}
2025-05-19 15:42:24 +08:00
/// <summary>
/// 获取手地朝向
/// </summary>
/// <param name="handType">哪只手</param>
/// <returns></returns>
public Vector3 GetHandForward(HandType handType)
{
Vector3 handForward = (GetSkeletonPose(SkeletonIndexFlag.MIDDLE_FINGER_MCP, handType).position -
GetSkeletonPose(SkeletonIndexFlag.WRIST, handType).position);
return handForward;
}
2025-04-22 10:32:33 +08:00
2025-05-19 15:42:24 +08:00
#region
2025-04-22 10:32:33 +08:00
2025-05-19 15:42:24 +08:00
public abstract void GestureLeftSuccess(GestureType gestureType, Vector3 handForward);
public abstract void GestureRightSuccess(GestureType gestureType, Vector3 handForward);
public abstract void GestureLeftFail();
public abstract void GestureRightFail();
2025-04-22 10:32:33 +08:00
2025-05-19 15:42:24 +08:00
#endregion
2025-04-22 10:32:33 +08:00
2025-05-19 15:42:24 +08:00
}
}