手势互动-LeapMotion手掌与手的相关开发

2023-09-21 19:04:26 浏览数 (2)

引用命名空间

Leap空间中的类定义了LeapMotion所跟踪的具体内容。

  • Frame 帧是某个时间点的数据集合,一个帧包含了Hand对象。
  • Hand 一个Hand手对象表示了一个跟踪的手,一个手总是包含5个手指以及相关属性如:Direction,PalmPosition,和Basis(orientation).
代码语言:javascript复制
lamPosition :手掌中心到Leap设备原点以毫米测量的距离
PalmVelocity :手掌移动的速度(以毫米每秒为单位)。
PalmNormal :一个向量,这个向量是垂直于手掌所形成的平面的。并且向量从手掌出来指向下。
Direction :一个向量,从手掌指向手指的方向。
  • Finger 一个Finger手指对象表示了追踪的手指。一个手指包含四个骨头。
  • Bone Bone骨头对象表示手指的一段,并包含位置、大小和方位数据。
  • Arm Arm胳膊对象是特殊的Bone,其实是跟踪了前臂。
代码语言:javascript复制
using Leap;
using Leap.Unity;

获取leap数据类及帧对象

代码语言:javascript复制
 //LeapProvider 会通过手势的触发事件向Unity应用程序提供帧对象数据
public LeapProvider mProvider;
//保存的帧对象
 public Frame currentFrame;
 void Start ()
 {   // 获取leap数据类对象
   mProvider = FindObjectOfType<LeapProvider>() as LeapProvider;
}
void Update()
{
   currentFrame = mProvider.CurrentFrame;
}

1、手掌的开发指南

  • (一)判断是否是左手、右手
代码语言:javascript复制
if (currentFrame.Hands.Count > 0)  // 判断当前帧中是否检测到有手的数量 > 0 。并且所有的手会在一个List数组中
{
  for (int i = 0; i < currentFrame.Hands.Count; i  ) // 如果大于0,就要遍历,因为2-4个手是可以检测到的
  {
      if (currentFrame.Hands[i].IsLeft) // 判断是左手
      {
            Debug.Log(currentFrame.Hands[i].ToString());
      }
      if (currentFrame.Hands[i].IsRight) // 判断是右手
      {
           Debug.Log(currentFrame.Hands[i].ToString());
      }
  }
}

  • (二)判断是否在握拳
代码语言:javascript复制
 // >0.8就算确认手势握拳了
if (currentFrame.Hands[i].PinchStrength > 0.8)
{
   // Debug.Log(currentFrame.Hands[i].PinchStrength);
      Debug.Log("握拳");
}
如果想精准的确认是哪个手握拳就要在上面判断左右手里面输入此代码

  • (三)判断手是否在捏
代码语言:javascript复制
 if (currentFrame.Hands[i].IsPinching()) // 判断手是否在捏 
 {
       Debug.Log("捏手");
       Debug.Log(currentFrame.Hands[i].PinchDistance); //拇指和食指的距离(实测默认从27-2)
}

  • (四)判断手掌是否向上或者向下(基于手掌法线来进行的)
代码语言:javascript复制
  if (currentFrame.Hands[i].PalmNormal.y > 0)  // PalmNormal手掌的法线量
  {
      Debug.Log("手掌向上");
  }

  • (五)*判断手掌左右移动(基于手掌的x来进行的,但是会检测5根手指的值,打印会出现5次)
代码语言:javascript复制
                if (frame.Hands[i].PalmVelocity.x > 0.7)
                {
                    Debug.Log("手滑动右边");
                }
                if (frame.Hands[i].PalmVelocity.x < -0.7)
                {
                    Debug.Log("手滑动左边");
                }

2、手指的开发指南

代码语言:javascript复制
 if (leftHandModel.IsTracked)
 {
            Hand leftHand = leftHandModel.GetLeapHand();
            // float twoFingerDistance = 0.07f;
            if ((leftHand.Fingers[0].TipPosition - leftHand.Fingers[1].TipPosition).Magnitude < twoFingerDistance)
            {
                Debug.Log("拇指与食指靠近了");
            }
}

List<Finger> listOfFingers = hand.Fingers;
        int count = 0;
        for (int f = 0; f < listOfFingers.Count; f  )
        { //循环遍历所有的手~~
            Finger finger = listOfFingers[f];
            if ((finger.TipPosition - hand.PalmPosition).Magnitude < deltaCloseFinger)    // Magnitude  向量的长度 。是(x*x y*y z*z)的平方根。    //float deltaCloseFinger = 0.05f;
            {
                count  ;
              //  if (finger.Type == Finger.FingerType.TYPE_THUMB)
              //  Debug.Log ((finger.TipPosition - hand.PalmPosition).Magnitude);
            }
        }
arm

0 人点赞