抽了一上午去將所有的kinect的各種姿勢(shì)寫(xiě)完了,以后需要哪個(gè)就用哪個(gè)手勢(shì),不需要某個(gè)手勢(shì)直接注釋掉或者可以在識(shí)別到的手勢(shì)不寫(xiě)方法就行了
kinect常用手勢(shì):
以下手勢(shì)能被流暢的識(shí)別:
◎RaiseRightHand / RaiseLeftHand – 左手或右手舉起過(guò)肩并保持至少一秒
◎Psi –雙手舉起過(guò)肩并保持至少一秒
◎Stop – 雙手下垂.
◎Wave –左手或右手舉起來(lái)回?cái)[動(dòng)
◎SwipeLeft – 右手向左揮.
◎SwipeRight – 左手向右揮.
◎SwipeUp / SwipeDown – 左手或者右手向上/下?lián)]
◎ Click – 左手或右手在適當(dāng)?shù)奈恢猛A糁辽?.5秒.
◎RightHandCursor / LeftHandCursor – 假手勢(shì),用來(lái)使光標(biāo)隨著手移動(dòng)
◎ZoomOut – 手肘向下,左右手掌合在一起(求佛的手勢(shì)),然后慢慢分開(kāi).
◎ZoomIn – 手肘向下,兩手掌相聚至少0.7米,然后慢慢合在一起
◎Wheel –英文原版描述不清,就是ZoomOut/In的手勢(shì),只不過(guò)在動(dòng)的時(shí)候是前后而非左右。
◎Jump –在1.5秒內(nèi)髖關(guān)節(jié)中心至少上升10厘米
◎Squat -在1.5秒內(nèi)髖關(guān)節(jié)中心至少下降10厘米
◎Push – 在1.5秒內(nèi)將左手或右手向外推
◎Pull -在1.5秒內(nèi)將左手或右手向里拉
當(dāng)然還有不常用手勢(shì):

下面開(kāi)始介紹怎么用unity + kinect:
1.Kinect for Windows開(kāi)發(fā)套件,這個(gè)東西到處有,自己找吧,哈哈
2.下載kinect v2 sdk 鏈接:https://pan.baidu.com/s/19XbE7CLA64c1K6jrK9wf9g 密碼:e4uw 下載完導(dǎo)入unity
3.創(chuàng)建一個(gè)空物體,取名KinectManager,在其上面加入兩個(gè)腳本組件(插件自帶),

4.創(chuàng)建一個(gè)空物體,取名GestureListener,添加腳本組件MyGestureListener,腳本內(nèi)容附在下面,都加了注釋,有不需要的手勢(shì)直接注釋掉就好了

5.隨便創(chuàng)建一個(gè)物體,掛上腳本組件HeloCtr(這個(gè)自己隨便取名無(wú)所謂)用來(lái)測(cè)試,

6.別忘了建兩個(gè)text去實(shí)時(shí)的看動(dòng)作識(shí)別沒(méi)有,額,這個(gè)很重要,官方案例用的是GUIText,自己用的時(shí)候GUIText老有毛病,就我這暴脾氣,直接用UGUI多好


效果圖:(因?yàn)橐貓D,哈哈,動(dòng)畫(huà)有點(diǎn)變形了,這個(gè)是雙手放大縮小的效果,右手伸過(guò)來(lái)截圖的時(shí)候也被識(shí)別了,挺準(zhǔn)確的)


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>
/// 右手舉起過(guò)肩并保持至少一秒
/// </summary>
private bool RaiseRightHand;
/// <summary>
/// 左手舉起過(guò)肩并保持至少一秒
/// </summary>
private bool RaiseLeftHand;
/// <summary>
/// 雙手舉起過(guò)肩并保持至少一秒
/// </summary>
private bool Psi;
/// <summary>
/// 雙手下垂
/// </summary>
private bool Stop;
/// <summary>
/// 左手或右手舉起來(lái)回?cái)[動(dòng)
/// </summary>
private bool Wave;
/// <summary>
/// 左手或右手在適當(dāng)?shù)奈恢猛A糁辽?.5秒
/// </summary>
private bool Click;
/// <summary>
/// 假手勢(shì),用來(lái)使光標(biāo)隨著手移動(dòng)
/// </summary>
private bool RightHandCursor;
/// <summary>
/// 假手勢(shì),用來(lái)使光標(biāo)隨著手移動(dòng)
/// </summary>
private bool LeftHandCursor;
/// <summary>
///手肘向下,左右手掌合在一起(求佛的手勢(shì)),然后慢慢分開(kāi).
/// </summary>
private bool ZoomOut;
/// <summary>
/// 手肘向下,兩手掌相聚至少0.7米,然后慢慢合在一起
/// </summary>
private bool ZoomIn;
private float zoomFactor = 1f;
/// <summary>
/// 英文原版描述不清,就是ZoomOut/In的手勢(shì),只不過(guò)在動(dòng)的時(shí)候是前后而非左右
/// </summary>
private bool Wheel;
/// <summary>
/// 在1.5秒內(nèi)髖關(guān)節(jié)中心至少下降10厘米
/// </summary>
private bool Squat;
/// <summary>
/// 在1.5秒內(nèi)將左手或右手向外推
/// </summary>
private bool Push;
/// <summary>
/// 在1.5秒內(nèi)將左手或右手向里拉
/// </summary>
private bool Pull;
/// <summary>
/// 右手向左揮
/// </summary>
private bool SwipeLeft;
/// <summary>
/// 左手向右揮.
/// </summary>
private bool SwipeRight;
/// <summary>
/// 左手或者右手向上揮
/// </summary>
private bool SwipeUp;
/// <summary>
/// 左手或者右手向下?lián)]
/// </summary>
private bool SwipeDown;
/// <summary>
/// 在1.5秒內(nèi)髖關(guān)節(jié)中心至少上升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;
}
/*
* 當(dāng)識(shí)別到用戶(hù)時(shí)調(diào)用該函數(shù)
*/
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默認(rèn)為 注釋
// 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 = "請(qǐng)開(kāi)始你的表演";
}
Debug.Log("發(fā)現(xiàn)用戶(hù)");
}
/*
* 當(dāng)失去用戶(hù)時(shí)出發(fā)
*/
public void UserLost(long userId, int userIndex)
{
if (gestureInfo != null)
{
gestureInfo.GetComponent<Text>().text = string.Empty;
}
Debug.Log("失去用戶(hù)");
}
/// <summary>
/// Invoked when a gesture is in progress.
/// </summary>
/// <param name="userId">被識(shí)別者的id</param>
/// <param name="userIndex">被識(shí)別者的序號(hào)</param>
/// <param name="gesture">手勢(shì)類(lèi)型</param>
/// <param name="progress">手勢(shì)識(shí)別的進(jìn)度,可以認(rèn)為是相似度。范圍是[0,1]</param>
/// <param name="joint">關(guān)節(jié)類(lèi)型</param>
/// <param name="screenPos">視圖坐標(biāo)的單位向量</param>
public void GestureInProgress(long userId, int userIndex, KinectGestures.Gestures gesture,
float progress, KinectInterop.JointType joint, Vector3 screenPos)
{
/*
* 主要將一些需要?jiǎng)討B(tài)監(jiān)測(cè)的手勢(shì)放在這個(gè)函數(shù)下
* 比如說(shuō)縮放、滾輪都是依據(jù)你兩手之間的距離來(lái)判斷應(yīng)該縮放或旋轉(zhuǎn)多少度
*/
//監(jiān)測(cè)縮放,如果相似度大于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>
/// 當(dāng)一個(gè)手勢(shì)識(shí)別完成后被調(diào)用
/// </summary>
/// <returns>true</returns>
/// <c>false</c>
/// <param name="userId">被識(shí)別者的ID</param>
/// <param name="userIndex">被識(shí)別者的序號(hào)</param>
/// <param name="gesture">被識(shí)別到的手勢(shì)類(lèi)型</param>
/// <param name="joint">被識(shí)別到的關(guān)節(jié)類(lèi)型</param>
/// <param name="screenPos">視圖坐標(biāo)的單位向量</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;
}
// 可以在這里寫(xiě)識(shí)別到的所有手勢(shì),完成之后去調(diào)用某個(gè)方法,
//但為了右面可能不止一個(gè)場(chǎng)景可能使用到相同的手勢(shì),所以使用bool跳出去,在使用到的時(shí)候去寫(xiě)完成動(dòng)作之后的方法
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;
}
//參數(shù)同上,在手勢(shì)被取消的時(shí)候調(diào)用
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("沒(méi)有進(jìn)來(lái) 你他媽真的煩");
return;
}
print("你他嗎的竟然真的進(jìn)來(lái)了");
if (gestureListener.IsRaiseRightHand())
{
text.GetComponent<Text>().text = "右手舉起過(guò)肩并保持至少一秒";
}
if (gestureListener.IsRaiseLeftHand())
{
text.GetComponent<Text>().text = "左手舉起過(guò)肩并保持至少一秒";
}
if (gestureListener.IsPsi())
{
text.GetComponent<Text>().text = "雙手舉起過(guò)肩并保持至少一秒";
}
if (gestureListener.IsStop())
{
text.GetComponent<Text>().text = "雙手下垂.";
}
if (gestureListener.IsWave())
{
text.GetComponent<Text>().text = "左手或右手舉起來(lái)回?cái)[動(dòng)";
}
if (gestureListener.IsSwipeLeft())
{
text.GetComponent<Text>().text = "向左揮動(dòng)";
print("zuo");
}
if (gestureListener.IsSwipeRight())
{
text.GetComponent<Text>().text = "向右揮動(dòng)";
print("you");
}
if (gestureListener.IsSwipeUp())
{
text.GetComponent<Text>().text = "向上揮動(dòng)";
print("shang");
}
if (gestureListener.IsSwipeDown())
{
text.GetComponent<Text>().text = "向下?lián)]動(dòng)";
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 = "手肘向下,左右手掌合在一起(求佛的手勢(shì)),然后慢慢分開(kāi).";
//}
//if (gestureListener.IsZoomIn())
//{
// text.GetComponent<Text>().text = "手肘向下,兩手掌相聚至少0.7米,然后慢慢合在一起";
//}
if (gestureListener.IsWheel())
{
text.GetComponent<Text>().text = "英文原版描述不清,就是ZoomOut/In的手勢(shì),只不過(guò)在動(dòng)的時(shí)候是前后而非左右";
}
if (gestureListener.IsJump())
{
text.GetComponent<Text>().text = "跳動(dòng)";
print("tiao");
}
if (gestureListener.IsSquat())
{
text.GetComponent<Text>().text = "在1.5秒內(nèi)髖關(guān)節(jié)中心至少下降10厘米";
}
if (gestureListener.IsPush())
{
text.GetComponent<Text>().text = "在1.5秒內(nèi)將左手或右手向外推";
}
if (gestureListener.IsPull())
{
text.GetComponent<Text>().text = "在1.5秒內(nèi)將左手或右手向里拉";
}
if (gestureListener.IsTpose())
{
text.GetComponent<Text>().text = "T位站著";
}
}
}
|