Files
plugin-library/Assets/07.RKTools/RunTime/GestureRecognition/GestureRokidBase.cs
zhangzheng 2c230960db 修改
2026-03-25 16:58:26 +08:00

153 lines
5.1 KiB
C#

using UnityEngine;
namespace Stary.Evo.RKTools
{
#if Evo_Rokid
public abstract class GestureRokidBase : MonoBehaviour
{
private Rokid.UXR.Interaction.GestureBean leftBean = null;
private Rokid.UXR.Interaction.GestureBean rightBean = null;
protected void OnEnable()
{
Rokid.UXR.Interaction.GesEventInput.OnTrackedSuccess += OnTrackedSuccess;
Rokid.UXR.Interaction.GesEventInput.OnTrackedFailed += OnTrackedFailed;
Rokid.UXR.Interaction.GesEventInput.OnRenderHand += OnRenderHand;
}
protected void OnDisable()
{
Rokid.UXR.Interaction.GesEventInput.OnTrackedSuccess -= OnTrackedSuccess;
Rokid.UXR.Interaction.GesEventInput.OnTrackedFailed -= OnTrackedFailed;
Rokid.UXR.Interaction.GesEventInput.OnRenderHand -= OnRenderHand;
}
protected void FixedUpdate()
{
if (leftBean != null)
{
Rokid.UXR.Interaction.GestureType type =
Rokid.UXR.Interaction.GesEventInput.Instance.GetGestureType(Rokid.UXR.Interaction.HandType.LeftHand);
Vector3 handForward =
GetSkeletonPose(Rokid.UXR.Interaction.SkeletonIndexFlag.PALM, Rokid.UXR.Interaction.HandType.LeftHand).forward;
GestureLeftSuccess(type, handForward);
}
else
{
GestureLeftFail();
}
if (rightBean != null)
{
Rokid.UXR.Interaction.GestureType type =
Rokid.UXR.Interaction.GesEventInput.Instance.GetGestureType(Rokid.UXR.Interaction.HandType.RightHand);
Vector3 handForward =
GetSkeletonPose(Rokid.UXR.Interaction.SkeletonIndexFlag.PALM, Rokid.UXR.Interaction.HandType.RightHand).forward;
GestureRightSuccess(type, handForward);
}
else
{
GestureRightFail();
}
}
private void OnTrackedSuccess(Rokid.UXR.Interaction.HandType handType)
{
}
private void OnTrackedFailed(Rokid.UXR.Interaction.HandType handType)
{
if (handType == Rokid.UXR.Interaction.HandType.None)
{
leftBean = null;
rightBean = null;
}
if (handType == Rokid.UXR.Interaction.HandType.RightHand)
{
rightBean = null;
}
if (handType == Rokid.UXR.Interaction.HandType.LeftHand)
{
leftBean = null;
}
}
private void OnRenderHand(Rokid.UXR.Interaction.HandType handType, Rokid.UXR.Interaction.GestureBean gestureBean)
{
if (handType == Rokid.UXR.Interaction.HandType.RightHand)
{
rightBean = gestureBean;
}
if (handType == Rokid.UXR.Interaction.HandType.LeftHand)
{
leftBean = gestureBean;
}
if (handType == Rokid.UXR.Interaction.HandType.None)
{
rightBean = null;
leftBean = null;
}
}
/// <summary>
/// 获取骨架点位置
/// </summary>
/// <param name="index">骨架序号</param>
/// <param name="hand">哪只手</param>
/// <returns></returns>
public Pose GetSkeletonPose(Rokid.UXR.Interaction.SkeletonIndexFlag index, Rokid.UXR.Interaction.HandType hand)
{
return Rokid.UXR.Interaction.GesEventInput.Instance.GetSkeletonPose(index, hand);
}
/// <summary>
/// 获取手地朝向
/// </summary>
/// <param name="handType">哪只手</param>
/// <returns></returns>
public Vector3 GetHandForward(Rokid.UXR.Interaction.HandType handType)
{
Vector3 handForward =
(GetSkeletonPose(Rokid.UXR.Interaction.SkeletonIndexFlag.MIDDLE_FINGER_MCP, handType).position -
GetSkeletonPose(Rokid.UXR.Interaction.SkeletonIndexFlag.WRIST, handType).position);
return handForward;
}
#region
/// <summary>
/// 左手成功识别到手势不断执行操作
/// </summary>
/// <param name="gestureType">左手手势类型</param>
/// <param name="handForward">左手掌心朝向</param>
public abstract void GestureLeftSuccess(Rokid.UXR.Interaction.GestureType gestureType, Vector3 handForward);
/// <summary>
/// 右手成功识别到手势不断执行操作
/// </summary>
/// <param name="gestureType">右手手势类型</param>
/// <param name="handForward">右手掌心朝向</param>
public abstract void GestureRightSuccess(Rokid.UXR.Interaction.GestureType gestureType, Vector3 handForward);
/// <summary>
/// 左手未识别到手势执行操作
/// </summary>
public abstract void GestureLeftFail();
/// <summary>
/// 右手未识别到手势执行操作
/// </summary>
public abstract void GestureRightFail();
#endregion
}
#endif
}