今晚想了很久,决定对之前Leap知识进行汇总,这里基本涵盖了LeapMotion所有的开发参数
本文从两部分讲解:1、手掌的判断与相关参数;2、手指的判断与相关参数
1. 引用命名空间
Leap空间中的类定义了LeapMotion所跟踪的具体内容。
Frame
帧是某个时间点的数据集合,一个帧包含了Hand对象。
Hand
一个Hand手对象表示了一个跟踪的手,一个手总是包含5个手指以及相关属性如:Direction,PalmPosition,和Basis(orientation).
lamPosition :手掌中心到Leap设备原点以毫米测量的距离
PalmVelocity :手掌移动的速度(以毫米每秒为单位)。
PalmNormal :一个向量,这个向量是垂直于手掌所形成的平面的。并且向量从手掌出来指向下。
Direction :一个向量,从手掌指向手指的方向。
Finge
一个Finger手指对象表示了追踪的手指。一个手指包含四个骨头。
Bone
Bone骨头对象表示手指的一段,并包含位置、大小和方位数据。
Arm
Arm胳膊对象是特殊的Bone,其实是跟踪了前臂。
using Leap;
using Leap.Unity;
获取leap数据类及帧对象
//LeapProvider 会通过手势的触发事件向Unity应用程序提供帧对象数据
public LeapProvider mProvider;
//保存的帧对象
public Frame currentFrame;
void Start ()
{ // 获取leap数据类对象
mProvider = FindObjectOfType<LeapProvider>() as LeapProvider;
}
void Update()
{
currentFrame = mProvider.CurrentFrame;
}
2.手掌的开发指南
(一)判断是否是左手、右手
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());
}
}
}
(二)判断是否在握拳
// >0.8就算确认手势握拳了
if (currentFrame.Hands[i].PinchStrength > 0.8)
{
// Debug.Log(currentFrame.Hands[i].PinchStrength);
Debug.Log("握拳");
}
如果想精准的确认是哪个手握拳就要在上面判断左右手里面输入此代码
(三)判断手是否在捏
if (currentFrame.Hands[i].IsPinching()) // 判断手是否在捏
{
Debug.Log("捏手");
Debug.Log(currentFrame.Hands[i].PinchDistance); //拇指和食指的距离(实测默认从27-2)
}
(四)判断手掌是否向上或者向下(基于手掌法线来进行的)
if (currentFrame.Hands[i].PalmNormal.y > 0) // PalmNormal手掌的法线量
{
Debug.Log("手掌向上");
}
(五)判断手掌左右移动(基于手掌的x来进行的,但是会检测5根手指的值,打印会出现5次)
if (frame.Hands[i].PalmVelocity.x > 0.7)
{
Debug.Log("手滑动右边");
}
if (frame.Hands[i].PalmVelocity.x < -0.7)
{
Debug.Log("手滑动左边");
}
3.手指的开发指南
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);
}
}
本课程视频教程可以查看: