leapmotion defines the recognition gesture to change the color of the object

1. Add prefab.


2. Script

LeapGestures.cs

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;//The minimum speed of palm movement

	[Tooltip ("Velocity (m/s) of Single Direction ")]
	[Range(0,1)]
	public float deltaVelocity = 10.0f;//The speed of palm movement in one direction

	// Use this for initialization
	void Start () {
		mProvider = FindObjectOfType<LeapProvider>() as LeapProvider;
	}
	
	// Update is called once per frame
	void Update () {
		mFrame = mProvider.CurrentFrame;//Get the current frame
		//get the number of hands
		//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");

				}
			}
		}
	}
	//Determine how many fingers are stretched, and which finger is stretched
	public int extendFingerNum(Hand hand)
	{
		int extendedFingers = 0;
		//One traversal of a finger
		for (int f = 0; f < hand.Fingers.Count; f++)
		{
			Finger digit = hand.Fingers[f];
			if (digit.IsExtended) {
				print ("Fingers is " + digit);
				extendedFingers++;
			}
		}
		return extendedFingers;
	}




	//Whether to grab
	public bool isGrabHand (Hand hand)  		
	{
		return hand.GrabStrength > 0.8f; //Grab Strength
	}


	//hand move four direction
	public bool isMoveRight (Hand hand)   	
	{
		//print (hand.PalmVelocity.x);
		return hand.PalmVelocity.x < -deltaVelocity && !isStationary (hand);
	}  

	// Swipe to the right
	public bool isMoveLeft (Hand hand)		
	{
		//print (hand.PalmVelocity.x );
		return hand.PalmVelocity.x > deltaVelocity && !isStationary (hand);
	}  

	//hand up
	public bool isMoveUp (Hand hand)   	
	{
		return hand.PalmVelocity.y > deltaVelocity && !isStationary (hand);
	}

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


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

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

	// fixed
	public bool isStationary (Hand hand)		 
	{
		return hand.PalmVelocity.Magnitude < smallestVelocity; //Vector3.Magnitude returns the length of the vector
	}


}




CubeChange.cs

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

public class CubeChange : MonoBehaviour {

	private bool isSure = true;

	// Use this for initialization
	void Start () {
		
		
	}
	
	// Update is called once per frame
	void Update () {

		if (LeapGestures.Gesture_left) {
			ColorGreen ();
			MoveCube (LeapGestures.movePOs);
		} else if (LeapGestures.Gesture_right) {
			ColorRed();
		} else if (LeapGestures.Gesture_up) {
			ColorWihte ();
		} else if (LeapGestures.Gesture_down) {
			ColorBlue ();
		} else if (LeapGestures.Gesture_zoom) {
			if (true) {
				ZoomCube(LeapGestures.zoom);
			}
		}
		
	}


	void MoveCube (float move_x)
	{
		float pos_x = transform.localPosition.x;
		float pos_y = transform.localPosition.y;
		float pos_z = transform.localPosition.z;

	}

	void ZoomCube (float scale)
	{
		scale *= Mathf.PI;
		this.transform.localScale = new Vector3(scale, scale, scale);

	}

	void ColorGreen()
	{
		this.GetComponent<MeshRenderer> ().material.color = Color.green;
		//this.transform.localScale =
	}
	void ColorRed()
	{
		this.GetComponent<MeshRenderer> ().material.color = Color.red;

	}
	void ColorWihte ()
	{
		this.GetComponent<MeshRenderer> ().material.color = Color.white;

	}
	void ColorBlue()
	{
		this.GetComponent<MeshRenderer> ().material.color = Color.blue;

	}
}

hand.grabAngle() returns the average bending degree of the four fingers except the thumb, so the value is about 3.14 when the fist is clenched, and it is basically 0 when the hand is fully open. Generally, 0 is a gesture, >2 is a gesture, and the rest are a gesture.

The degree of bending of all fingers. This angle is calculated by observing the sandwich between the orientation of the four fingers and the orientation of the hand. When calculating the angle, the thumb is not considered. This angle is 0 radians for an open hand, and when the pose is a tight fist, it goes to pi radians.

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=325572331&siteId=291194637