1,加预制体。
2. 脚本
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;//手掌移动的最小速度
[Tooltip ("Velocity (m/s) of Single Direction ")]
[Range(0,1)]
public float deltaVelocity = 10.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");
}
}
}
}
//判断有多少个手指是伸开的,以及伸开的手指是哪个
public int extendFingerNum(Hand hand)
{
int extendedFingers = 0;
//一个手指的一次遍历
for (int f = 0; f < hand.Fingers.Count; f++)
{
Finger digit = hand.Fingers[f];
if (digit.IsExtended) {
print ("Fingers is " + digit);
extendedFingers++;
}
}
return extendedFingers;
}
//是否抓取
public bool isGrabHand (Hand hand)
{
return hand.GrabStrength > 0.8f; //抓取力
}
//hand move four direction
public bool isMoveRight (Hand hand)
{
//print (hand.PalmVelocity.x);
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)
{
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返回向量的长度
}
}
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()返回的是除却大拇指四根手指的平均弯曲程度,所以紧握拳头的时候数值为3.14左右,手全部张开是的时候基本也为0。一般使用0为一个手势,>2为一个手势,其余为一个手势。
所有⼿指的弯曲程度。通过观察四个⼿指的⽅向和⼿的⽅向之间的夹⻆来计算这个⻆。当计算⻆度时,不考虑拇指。这个⻆度是⼀个开着的⼿的0弧度,当这个姿势是⼀个紧的拳头时,它就会到达pi弧度。