Leapmotion 左右上下前后挥动手势设计,动态手势

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

using Leap;
using Leap.Unity;

public class LeapGestures : MonoBehaviour {

	public static bool Gesture_left = false;
	public static bool Gesture_right = false;
	public static bool Gesture_up = false;
	public static bool Gesture_down = false;
	public static bool Gesture_zoom = false;
	public static float movePOs = 0.0f;

	private LeapProvider mProvider;
	private Frame mFrame;
	private Hand mHand;



	private Vector leftPosition;
	private Vector rightPosition;
	public static float zoom = 1.0f;
	[Tooltip ("Velocity (m/s) of Palm ")]

	public float smallestVelocity = 1.45f;//手掌移动的最小速度

	[Tooltip ("Velocity (m/s) of Single Direction ")]
	[Range(0,1)]
	public float deltaVelocity = 1.0f;//单方向上手掌移动的速度

	// Use this for initialization
	void Start () {
		mProvider = FindObjectOfType<LeapProvider>() as LeapProvider;
	}
	
	// Update is called once per frame
	void Update () {

		mFrame = mProvider.CurrentFrame;//获取当前帧
		//获得手的个数
		//print ("hand num are " + mFrame.Hands.Count);

		if (mFrame.Hands.Count > 0) {
			if (mFrame.Hands.Count == 2) 
				zoom = CalcuateDistance(mFrame);

			if (mFrame.Hands.Count == 1) 
				LRUDGestures(mFrame,ref movePOs);
		}
	}

	 
	float CalcuateDistance(Frame mFrame)
	{
		Gesture_zoom = true;
		Gesture_left = false;
		Gesture_right = false;

		float distance = 0f;
		//print ("Two hands");
		foreach (var itemHands in mFrame.Hands) {
			if (itemHands.IsLeft) {
				leftPosition = itemHands.PalmPosition;
				//print ("leftPosition" + leftPosition);
			}
			if (itemHands.IsRight) {
				rightPosition = itemHands.PalmPosition;
				//print ("rightPosition" + rightPosition);
			}
		}

		if (leftPosition != Vector.Zero && rightPosition != Vector.Zero ) {

			Vector3 leftPos = new Vector3 (leftPosition.x, leftPosition.y,leftPosition.z);
			Vector3 rightPos = new Vector3 (rightPosition.x, rightPosition.y,rightPosition.z);

			distance = 10*Vector3.Distance (leftPos, rightPos);
			print ("distance" + distance);
		}

		if (distance != 0)
			return distance;
		else
			return distance = 1;
	}




	void LRUDGestures(Frame mFrame, ref float movePOs)
	{
		Gesture_zoom = false;
		foreach (var item in mFrame.Hands) {
			int numFinger = item.Fingers.Count;
			//print ("item is  " + numFinger);

			//print("hand are " + isOpenFullHand (item));
			// print ("isOpenFullHands is  " + isOpenFullHands(item));


			if (item.GrabStrength == 1) {
				//print ("num is 0, gestures is woquan");

			}else if ( item.GrabStrength == 0) {
				//print ("num is 5, open your hand");
				//print("PalmVelocity" + item.PalmVelocity);
				//print("PalmPosition" + item.PalmPosition);
				movePOs = item.PalmPosition.x;
				if (isMoveLeft (item)) {
					Gesture_left = true;
					Gesture_right = false;
					print ("move left");

				} else if (isMoveRight (item)) {
					Gesture_left = false;
					Gesture_right = true;
					print ("move Right");

				}else if (isMoveUp (item)) {
					Gesture_left = false;
					Gesture_right = false;
					print ("move Up");

				}else if (isMoveDown (item)) {
					Gesture_left = false;
					Gesture_right = false;
					print ("move Down");

				}else if (isMoveForward (item)) {
					Gesture_left = false;
					Gesture_right = false;
					print ("move Forward");

				}else if (isMoveBack (item)) {
					Gesture_left = false;
					Gesture_right = false;
					print ("move back");

				}
			}
		}
	}



	private bool isStone(Hand hand)
	{
		//print ("hand.GrabAngle" + hand.GrabAngle);
		return hand.GrabAngle > 2.0f;
	}
	//是否抓取
	public bool isGrabHand (Hand hand)  		
	{
		return hand.GrabStrength > 0.8f;    	//抓取力 
	}


	//hand move four direction
	public bool isMoveRight (Hand hand)   	
	{

		return hand.PalmVelocity.x > deltaVelocity && !isStationary (hand);
	}  

	// 手划向右边
	public bool isMoveLeft (Hand hand)		
	{

		//print (hand.PalmVelocity.x );
		return hand.PalmVelocity.x < -deltaVelocity && !isStationary (hand);
	}  

	//手向上 
	public bool isMoveUp (Hand hand)   	
	{
		//print ("hand.PalmVelocity.y" + hand.PalmVelocity.y);

		return hand.PalmVelocity.y > deltaVelocity && !isStationary (hand);
	}

	//手向下  
	public bool isMoveDown (Hand hand) 		
	{
		return hand.PalmVelocity.y < -deltaVelocity && !isStationary (hand);
	}


	//手向前
	public bool isMoveForward (Hand hand)   	
	{
		//print (hand.PalmVelocity.z);
		return hand.PalmVelocity.z > deltaVelocity && !isStationary (hand);
	}

	//手向后 
	public bool isMoveBack (Hand hand) 		
	{
		return hand.PalmVelocity.z < -deltaVelocity && !isStationary (hand);
	}

	//固定不动的
	public bool isStationary (Hand hand)		 
	{
		return hand.PalmVelocity.Magnitude < smallestVelocity;		//Vector3.Magnitude返回向量的长度
	}


}


deltaVelocity的值可以通过把 hand.PalmVelocity.x/y/z的值打印出来根据实际情况设置一个合理的值,x,y,z不同方向时其值的正负是不同的,依据此可以设计一些简单手势。

上下左右四个手势还是很稳定的。

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值