Unity + Kinect基本上所有的手势二次封装(一)

抽了一上午去将所有的kinect的各种姿势写完了,以后需要哪个就用哪个手势,不需要某个手势直接注释掉或者可以在识别到的手势不写方法就行了

kinect常用手势:

 

以下手势能被流畅的识别:

◎RaiseRightHand / RaiseLeftHand – 左手或右手举起过肩并保持至少一秒

◎Psi –双手举起过肩并保持至少一秒

◎Stop – 双手下垂.

◎Wave –左手或右手举起来回摆动

◎SwipeLeft – 右手向左挥.

◎SwipeRight – 左手向右挥.

◎SwipeUp / SwipeDown – 左手或者右手向上/下挥

◎ Click – 左手或右手在适当的位置停留至少2.5秒.

◎RightHandCursor / LeftHandCursor – 假手势,用来使光标随着手移动

◎ZoomOut – 手肘向下,左右手掌合在一起(求佛的手势),然后慢慢分开.

◎ZoomIn – 手肘向下,两手掌相聚至少0.7米,然后慢慢合在一起

◎Wheel –英文原版描述不清,就是ZoomOut/In的手势,只不过在动的时候是前后而非左右。

◎Jump –在1.5秒内髋关节中心至少上升10厘米

◎Squat -在1.5秒内髋关节中心至少下降10厘米

◎Push – 在1.5秒内将左手或右手向外推

◎Pull -在1.5秒内将左手或右手向里拉

当然还有不常用手势:

下面开始介绍怎么用unity + kinect:

1.Kinect for Windows开发套件,这个东西到处有,自己找吧,哈哈

2.下载kinect v2 sdk 链接:https://pan.baidu.com/s/19XbE7CLA64c1K6jrK9wf9g 密码:e4uw  下载完导入unity

3.创建一个空物体,取名KinectManager,在其上面加入两个脚本组件(插件自带),

4.创建一个空物体,取名GestureListener,添加脚本组件MyGestureListener,脚本内容附在下面,都加了注释,有不需要的手势直接注释掉就好了

5.随便创建一个物体,挂上脚本组件HeloCtr(这个自己随便取名无所谓)用来测试,

6.别忘了建两个text去实时的看动作识别没有,额,这个很重要,官方案例用的是GUIText,自己用的时候GUIText老有毛病,就我这暴脾气,直接用UGUI多好

效果图:(因为要截图,哈哈,动画有点变形了,这个是双手放大缩小的效果,右手伸过来截图的时候也被识别了,挺准确的)

MyGestureListener.cs:

using UnityEngine;
using System;
using UnityEngine.UI;


public class MyGestureListener : MonoBehaviour, KinectGestures.GestureListenerInterface
{
    [Tooltip("GUI-Text to display gesture-listener messages and gesture information.")]
    public Text gestureInfo;
    [Tooltip("Index of the player, tracked by this component. 0 means the 1st player, 1 - the 2nd one, 2 - the 3rd one, etc.")]
    public int playerIndex = 0;
    public static MyGestureListener Instance;
    private void Awake()
    {
        Instance = this;
    }
    // private bool to track if progress message has been displayed
    private bool progressDisplayed;
    private float progressGestureTime;


    // whether the needed gesture has been detected or not


    /// <summary>
    /// 右手举起过肩并保持至少一秒
    /// </summary>
    private bool RaiseRightHand;
    /// <summary>
    /// 左手举起过肩并保持至少一秒
    /// </summary>
    private bool RaiseLeftHand;
    /// <summary>
    /// 双手举起过肩并保持至少一秒
    /// </summary>
    private bool Psi;
    /// <summary>
    ///  双手下垂
    /// </summary>
    private bool Stop;
    /// <summary>
    /// 左手或右手举起来回摆动
    /// </summary>
    private bool Wave;
    /// <summary>
    /// 左手或右手在适当的位置停留至少2.5秒
    /// </summary>
    private bool Click;
    /// <summary>
    /// 假手势,用来使光标随着手移动
    /// </summary>
    private bool RightHandCursor;
    /// <summary>
    /// 假手势,用来使光标随着手移动
    /// </summary>
    private bool LeftHandCursor;
    /// <summary>
    ///手肘向下,左右手掌合在一起(求佛的手势),然后慢慢分开.
    /// </summary>
    private bool ZoomOut;
    /// <summary>
    /// 手肘向下,两手掌相聚至少0.7米,然后慢慢合在一起
    /// </summary>
    private bool ZoomIn;
    private float zoomFactor = 1f;
    /// <summary>
    /// 英文原版描述不清,就是ZoomOut/In的手势,只不过在动的时候是前后而非左右
    /// </summary>
    private bool Wheel;
    /// <summary>
    ///  在1.5秒内髋关节中心至少下降10厘米
    /// </summary>
    private bool Squat;
    /// <summary>
    ///  在1.5秒内将左手或右手向外推
    /// </summary>
    private bool Push;
    /// <summary>
    /// 在1.5秒内将左手或右手向里拉
    /// </summary>
    private bool Pull;
    /// <summary>
    /// 右手向左挥
    /// </summary>
    private bool SwipeLeft;
    /// <summary>
    ///  左手向右挥.
    /// </summary>
    private bool SwipeRight;
    /// <summary>
    ///  左手或者右手向上挥
    /// </summary>
    private bool SwipeUp;
    /// <summary>
    ///  左手或者右手向下挥
    /// </summary>
    private bool SwipeDown;
    /// <summary>
    /// 在1.5秒内髋关节中心至少上升10厘米
    /// </summary>
    private bool Jump;
    /// <summary>
    /// T字体位
    /// </summary>
    private bool Tpose;


    /// <summary>
    /// Determines whether swipe left is detected.
    /// </summary>
    /// <returns><c>true</c> if swipe left is detected; otherwise, <c>false</c>.</returns>
    public bool IsRaiseRightHand()
    {
        if (RaiseRightHand)
        {
            RaiseRightHand = false;
            return true;
        }


        return false;
    }
    public bool IsRaiseLeftHand()
    {
        if (RaiseLeftHand)
        {
            RaiseLeftHand = false;
            return true;
        }


        return false;
    }
    public bool IsPsi()
    {
        if (Psi)
        {
            Psi = false;
            return true;
        }


        return false;
    }
    public bool IsStop()
    {
        if (Stop)
        {
            Stop = false;
            return true;
        }


        return false;
    }
    public bool IsWave()
    {
        if (Wave)
        {
            Wave = false;
            return true;
        }


        return false;
    }
    public bool IsSwipeLeft()
    {
        if (SwipeLeft)
        {
            SwipeLeft = false;
            return true;
        }


        return false;
    }
    public bool IsJump()
    {
        if (Jump)
        {
            Jump = false;
            return true;
        }


        return false;
    }
    public bool IsSwipeRight()
    {
        if (SwipeRight)
        {
            SwipeRight = false;
            return true;
        }


        return false;
    }
    public bool IsSwipeUp()
    {
        if (SwipeUp)
        {
            SwipeUp = false;
            return true;
        }


        return false;
    }
    public bool IsSwipeDown()
    {
        if (SwipeDown)
        {
            SwipeDown = false;
            return true;
        }


        return false;
    }
    public bool IsZoomOut()
    {
        if (ZoomOut)
        {
            return ZoomOut;
        }


        return false;
    }
    public bool IsZoomIn()
    {
        return ZoomIn;


    }
    /// <summary>
/// Gets the zoom factor.
/// </summary>
/// <returns>The zoom factor.</returns>
public float GetZoomFactor()
    {
        return zoomFactor;
    }
    public bool IsWheel()
    {
        if (Wheel)
        {
            Wheel = false;
            return true;
        }


        return false;
    }
    public bool IsSquat()
    {
        if (Squat)
        {
            Squat = false;
            return true;
        }


        return false;
    }
    public bool IsPush()
    {
        if (Push)
        {
            Push = false;
            return true;
        }


        return false;
    }
    public bool IsPull()
    {
        if (Pull)
        {
            Pull = false;
            return true;
        }


        return false;
    }
    public bool IsTpose()
    {
        if (Tpose)
        {
            Tpose = false;
            return true;
        }


        return false;
    }
    /*
    * 当识别到用户时调用该函数
    */
    public void UserDetected(long userId, int userIndex)
    {
        // as an example - detect these user specific gestures
        KinectManager manager = KinectManager.Instance;
        manager.DetectGesture(userId, KinectGestures.Gestures.RaiseRightHand);
        manager.DetectGesture(userId, KinectGestures.Gestures.RaiseLeftHand);
        manager.DetectGesture(userId, KinectGestures.Gestures.Psi);
        manager.DetectGesture(userId, KinectGestures.Gestures.Stop);
        manager.DetectGesture(userId, KinectGestures.Gestures.Wave);
        manager.DetectGesture(userId, KinectGestures.Gestures.RaiseRightHand);
        manager.DetectGesture(userId, KinectGestures.Gestures.SwipeLeft);
        manager.DetectGesture(userId, KinectGestures.Gestures.SwipeRight);
        manager.DetectGesture(userId, KinectGestures.Gestures.SwipeUp);
        manager.DetectGesture(userId, KinectGestures.Gestures.SwipeDown);
      // gestures 枚举里 Click默认为 注释
      //  manager.DetectGesture(userId, KinectGestures.Gestures.Click);
        manager.DetectGesture(userId, KinectGestures.Gestures.ZoomOut);
        manager.DetectGesture(userId, KinectGestures.Gestures.ZoomIn);
        manager.DetectGesture(userId, KinectGestures.Gestures.Wheel);
        manager.DetectGesture(userId, KinectGestures.Gestures.Jump);
        manager.DetectGesture(userId, KinectGestures.Gestures.Squat);
        manager.DetectGesture(userId, KinectGestures.Gestures.Push);
        manager.DetectGesture(userId, KinectGestures.Gestures.Pull);
        manager.DetectGesture(userId, KinectGestures.Gestures.Tpose);


        if (gestureInfo != null)
        {
            gestureInfo.GetComponent<Text>().text = "请开始你的表演";
        }
        Debug.Log("发现用户");
    }






    /*
    * 当失去用户时出发
    */
    public void UserLost(long userId, int userIndex)
    {
        if (gestureInfo != null)
        {
            gestureInfo.GetComponent<Text>().text = string.Empty;
        }
        Debug.Log("失去用户");
    }




    /// <summary>
    /// Invoked when a gesture is in progress.
    /// </summary>
    /// <param name="userId">被识别者的id</param>
    /// <param name="userIndex">被识别者的序号</param>
    /// <param name="gesture">手势类型</param>
    /// <param name="progress">手势识别的进度,可以认为是相似度。范围是[0,1]</param>
    /// <param name="joint">关节类型</param>
    /// <param name="screenPos">视图坐标的单位向量</param>
    public void GestureInProgress(long userId, int userIndex, KinectGestures.Gestures gesture,
                                  float progress, KinectInterop.JointType joint, Vector3 screenPos)
    {
        /*
         * 主要将一些需要动态监测的手势放在这个函数下
         * 比如说缩放、滚轮都是依据你两手之间的距离来判断应该缩放或旋转多少度
         */


        //监测缩放,如果相似度大于50%
        // the gestures are allowed for the primary user only
        if (userIndex != playerIndex)
            return;


        if (gesture == KinectGestures.Gestures.ZoomOut)
        {
            if (progress > 0.5f)
            {
                ZoomOut = true;
                zoomFactor = screenPos.z;


                if (gestureInfo != null)
                {
                    string sGestureText = string.Format("{0} factor: {1:F0}%", gesture, screenPos.z * 100f);
                    gestureInfo.text = sGestureText;


                    progressDisplayed = true;
                    progressGestureTime = Time.realtimeSinceStartup;
                }
            }
            else
            {
                ZoomOut = false;
            }
        }
        else if (gesture == KinectGestures.Gestures.ZoomIn)
        {
            if (progress > 0.5f)
            {
                ZoomIn = true;
                zoomFactor = screenPos.z;


                if (gestureInfo != null)
                {
                    string sGestureText = string.Format("{0} factor: {1:F0}%", gesture, screenPos.z * 100f);
                    gestureInfo.text = sGestureText;


                    progressDisplayed = true;
                    progressGestureTime = Time.realtimeSinceStartup;
                }
            }
            else
            {
                ZoomIn = false;
            }
        }
        else if ((gesture == KinectGestures.Gestures.Wheel || gesture == KinectGestures.Gestures.LeanLeft ||
                 gesture == KinectGestures.Gestures.LeanRight) && progress > 0.5f)
        {
            if (gestureInfo != null)
            {
                string sGestureText = string.Format("{0} - {1:F0} degrees", gesture, screenPos.z);
                gestureInfo.GetComponent<Text>().text = sGestureText;


                progressDisplayed = true;
                progressGestureTime = Time.realtimeSinceStartup;
            }
        }
        else if (gesture == KinectGestures.Gestures.Run && progress > 0.5f)
        {
            if (gestureInfo != null)
            {
                string sGestureText = string.Format("{0} - progress: {1:F0}%", gesture, progress * 100);
                gestureInfo.GetComponent<Text>().text = sGestureText;


                progressDisplayed = true;
                progressGestureTime = Time.realtimeSinceStartup;
            }
        }
    }








    /// <summary>
    /// 当一个手势识别完成后被调用
    /// </summary>
    /// <returns>true</returns>
    /// <c>false</c>
    /// <param name="userId">被识别者的ID</param>
    /// <param name="userIndex">被识别者的序号</param>
    /// <param name="gesture">被识别到的手势类型</param>
    /// <param name="joint">被识别到的关节类型</param>
    /// <param name="screenPos">视图坐标的单位向量</param>
    public bool GestureCompleted(long userId, int userIndex, KinectGestures.Gestures gesture,
                                  KinectInterop.JointType joint, Vector3 screenPos)
    {
        if (progressDisplayed)
            return true;


        string sGestureText = gesture + " detected";
        if (gestureInfo != null)
        {
            gestureInfo.GetComponent<Text>().text = sGestureText;
        }
        // 可以在这里写识别到的所有手势,完成之后去调用某个方法,
        //但为了右面可能不止一个场景可能使用到相同的手势,所以使用bool跳出去,在使用到的时候去写完成动作之后的方法
        switch (gesture)
        {
            case KinectGestures.Gestures.None:
                break;
              
            case KinectGestures.Gestures.RaiseRightHand:
                RaiseRightHand = true;
                break;
            case KinectGestures.Gestures.RaiseLeftHand:
                RaiseLeftHand = true;
                break;
            case KinectGestures.Gestures.Psi:
                Psi = true;
                break;
                // Tpose 不知道是什么鬼
            case KinectGestures.Gestures.Tpose:
                Tpose = true;
                break;
            case KinectGestures.Gestures.Stop:
                Stop = true;
                break;
            case KinectGestures.Gestures.Wave:
                Wave = true;
                break;
            case KinectGestures.Gestures.SwipeLeft:
                SwipeLeft = true;
                break;
            case KinectGestures.Gestures.SwipeRight:
                SwipeRight = true;
                break;
            case KinectGestures.Gestures.SwipeUp:
             //   gestureInfo.GetComponent<Text>().text = "上傻逼啊你";
                SwipeUp = true;
                break;
            case KinectGestures.Gestures.SwipeDown:
               // gestureInfo.GetComponent<Text>().text = "下傻逼啊你";
                SwipeDown = true;
                break;
            case KinectGestures.Gestures.ZoomIn:
                ZoomIn = true;
                break;
            case KinectGestures.Gestures.ZoomOut:
                ZoomOut = true;
                break;
            case KinectGestures.Gestures.Wheel:
                Wheel = true;
                break;
            case KinectGestures.Gestures.Jump:
               // gestureInfo.GetComponent<Text>().text = "你倒是跳啊啊你";
                Jump = true;
                break;
            case KinectGestures.Gestures.Squat:
                Squat = true;
                break;
            case KinectGestures.Gestures.Push:
                Push = true;
                break;
            case KinectGestures.Gestures.Pull:
                Pull = true;
                break;
            case KinectGestures.Gestures.ShoulderLeftFront:
                break;
            case KinectGestures.Gestures.ShoulderRightFront:
                break;
            case KinectGestures.Gestures.LeanLeft:
                break;
            case KinectGestures.Gestures.LeanRight:
                break;
            case KinectGestures.Gestures.LeanForward:
                break;
            case KinectGestures.Gestures.LeanBack:
                break;
            case KinectGestures.Gestures.KickLeft:
                break;
            case KinectGestures.Gestures.KickRight:
                break;
            case KinectGestures.Gestures.Run:
                break;
            case KinectGestures.Gestures.RaisedRightHorizontalLeftHand:
                break;
            case KinectGestures.Gestures.RaisedLeftHorizontalRightHand:
                break;
            case KinectGestures.Gestures.UserGesture1:
                break;
            case KinectGestures.Gestures.UserGesture2:
                break;
            case KinectGestures.Gestures.UserGesture3:
                break;
            case KinectGestures.Gestures.UserGesture4:
                break;
            case KinectGestures.Gestures.UserGesture5:
                break;
            case KinectGestures.Gestures.UserGesture6:
                break;
            case KinectGestures.Gestures.UserGesture7:
                break;
            case KinectGestures.Gestures.UserGesture8:
                break;
            case KinectGestures.Gestures.UserGesture9:
                break;
            case KinectGestures.Gestures.UserGesture10:
                break;
            default:
                break;
        }
        
        return true;
    }






    //参数同上,在手势被取消的时候调用
    public bool GestureCancelled(long userId, int userIndex, KinectGestures.Gestures gesture,
                                  KinectInterop.JointType joint)
    {
        if (progressDisplayed)
        {
            progressDisplayed = false;


            if (gestureInfo != null)
            {
                gestureInfo.GetComponent<Text>().text = String.Empty;
            }
        }


        return true;
    }


    public void Update()
    {
        if (progressDisplayed && ((Time.realtimeSinceStartup - progressGestureTime) > 2f))
        {
            progressDisplayed = false;


            if (gestureInfo != null)
            {
                gestureInfo.GetComponent<Text>().text = String.Empty;
            }


            Debug.Log("Forced progress to end.");
        }
    }


}

HeloCtr.cs:

using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class HeloCtr : MonoBehaviour {     private MyGestureListener gestureListener;     [Tooltip("Speed of spinning, when presentation slides change.")]     public float spinSpeed = 10;     public Text text; // Use this for initialization void Start () {         gestureListener = MyGestureListener.Instance;         print(gestureListener); } // Update is called once per frame void Update () {         if (!gestureListener)         {             print("没有进来 你他妈真的烦");             return;         }         print("你他吗的竟然真的进来了");         if (gestureListener.IsRaiseRightHand())         {             text.GetComponent<Text>().text = "右手举起过肩并保持至少一秒";         }         if (gestureListener.IsRaiseLeftHand())         {             text.GetComponent<Text>().text = "左手举起过肩并保持至少一秒";         }         if (gestureListener.IsPsi())         {             text.GetComponent<Text>().text = "双手举起过肩并保持至少一秒";         }                 if (gestureListener.IsStop())         {             text.GetComponent<Text>().text = "双手下垂.";         }         if (gestureListener.IsWave())         {             text.GetComponent<Text>().text = "左手或右手举起来回摆动";         }         if (gestureListener.IsSwipeLeft())         {             text.GetComponent<Text>().text = "向左挥动";             print("zuo");         }         if (gestureListener.IsSwipeRight())         {             text.GetComponent<Text>().text = "向右挥动";             print("you");         }         if (gestureListener.IsSwipeUp())         {             text.GetComponent<Text>().text = "向上挥动";             print("shang");         }         if (gestureListener.IsSwipeDown())         {             text.GetComponent<Text>().text = "向下挥动";             print("xia");         }         if (gestureListener.IsZoomIn() || gestureListener.IsZoomOut())         {             // zoom the model             float zoomFactor = gestureListener.GetZoomFactor();             Vector3 newLocalScale = new Vector3(zoomFactor, zoomFactor, zoomFactor);             transform.localScale = Vector3.Lerp(transform.localScale, newLocalScale, spinSpeed * Time.deltaTime);         }         //if (gestureListener.IsZoomOut())         //{         //    text.GetComponent<Text>().text = "手肘向下,左右手掌合在一起(求佛的手势),然后慢慢分开.";         //}         //if (gestureListener.IsZoomIn())         //{         //    text.GetComponent<Text>().text = "手肘向下,两手掌相聚至少0.7米,然后慢慢合在一起";         //}         if (gestureListener.IsWheel())         {             text.GetComponent<Text>().text = "英文原版描述不清,就是ZoomOut/In的手势,只不过在动的时候是前后而非左右";         }         if (gestureListener.IsJump())         {             text.GetComponent<Text>().text = "跳动";             print("tiao");         }         if (gestureListener.IsSquat())         {             text.GetComponent<Text>().text = "在1.5秒内髋关节中心至少下降10厘米";         }         if (gestureListener.IsPush())         {             text.GetComponent<Text>().text = "在1.5秒内将左手或右手向外推";         }         if (gestureListener.IsPull())         {             text.GetComponent<Text>().text = "在1.5秒内将左手或右手向里拉";         }         if (gestureListener.IsTpose())         {             text.GetComponent<Text>().text = "T位站着";         }     } }