本文从两部分讲解:1、手掌的判断与相关参数;2、手指的判断与相关参数
Leap空间中的类定义了LeapMotion所跟踪的具体内容。
帧是某个时间点的数据集合,一个帧包含了Hand对象。
一个Hand手对象表示了一个跟踪的手,一个手总是包含5个手指以及相关属性如:Direction,PalmPosition,和Basis(orientation).
lamPosition :手掌中心到Leap设备原点以毫米测量的距离
PalmVelocity :手掌移动的速度(以毫米每秒为单位)。
PalmNormal :一个向量,这个向量是垂直于手掌所形成的平面的。并且向量从手掌出来指向下。
Direction :一个向量,从手掌指向手指的方向。
一个Finger手指对象表示了追踪的手指。一个手指包含四个骨头。
Bone骨头对象表示手指的一段,并包含位置、大小和方位数据。
Arm胳膊对象是特殊的Bone,其实是跟踪了前臂。
using Leap;
using Leap.Unity;
//LeapProvider 会通过手势的触发事件向Unity应用程序提供帧对象数据
public LeapProvider mProvider;
//保存的帧对象
public Frame currentFrame;
void Start ()
{ // 获取leap数据类对象
mProvider = FindObjectOfType<LeapProvider>() as LeapProvider;
}
void Update()
{
currentFrame = mProvider.CurrentFrame;
}
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("手掌向上");
}
if (frame.Hands[i].PalmVelocity.x > 0.7)
{
Debug.Log("手滑动右边");
}
if (frame.Hands[i].PalmVelocity.x < -0.7)
{
Debug.Log("手滑动左边");
}
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);
}
}
本课程视频教程可以查看:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。