此开发内容,以Kinect for Unity SDK 2.20插件进行开发,插件各版本下载链接SDK2.20 https://download.csdn.net/download/JLX_Sir/21059009
SDK2.19.2https://download.csdn.net/download/JLX_Sir/21070889
SDK2.16.2https://download.csdn.net/download/JLX_Sir/21070879
★开发要点:
1、需添加新脚本,并继承接口GestureListenerInterface、CloudFaceListenerInterface
2、GestureCompleted(long userId, int userIndex, KinectGestures.Gestures gesture, KinectInterop.JointType joint, Vector3 screenPos)方法
需要在方法中对需要的手势进行注册监听
示例代码:
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using static KinectGestures;
namespace KinectStudy
{
public class KinectUser : MonoBehaviour, GestureListenerInterface, CloudFaceListenerInterface
{
/// <summary>
/// 背景—摄像头检测到的内容
/// </summary>
[SerializeField] private RawImage _kinectImage;
/// <summary>
/// 跟踪到的人索引,0为第一个人,1为第一个人
/// </summary>
[SerializeField] private int _playerIndex;
/// <summary>
/// 上一个用户Id
/// </summary>
private long _lastUserId = 0;
private void Update()
{
KinectManager _kinectManager = KinectManager.Instance;
//检测设备是否可用
if (_kinectManager && _kinectManager.IsInitialized())
{
if (_kinectImage.texture == null)
{
//从设备获取彩色数据
Texture2D _kinectPic = (Texture2D)KinectManager.Instance.GetUsersClrTex();
//把彩色数据给控件显示
_kinectImage.texture = _kinectPic;
}
#region 暂时弃用的(测试使用)
//检测到玩家
//if (KinectManager.Instance.IsUserDetected())
//{
// //Debug.LogError("检测到玩家信息了");
// //获取用户ID
// long _userId = KinectManager.Instance.GetPrimaryUserID();
// //获取用户离Kinect的距离信息
// Vector3 _userPos = KinectManager.Instance.GetUserPosition(_userId);
// //Debug.LogError("用户距离Kinect的距离坐标为:" + _userPos);
// //获取左手信息
// int _jointType = (int)KinectInterop.JointType.HandLeft;
// //关节点被追踪到了
// if (KinectManager.Instance.IsJointTracked(_userId, _jointType))
// {
// Vector3 _leftHandlePos = KinectManager.Instance.GetJointKinectPosition(_userId, _jointType);
// //获取左手姿势
// KinectInterop.HandState _leftHandState = KinectManager.Instance.GetLeftHandState(_userId);
// if (_leftHandState == KinectInterop.HandState.Closed)
// {
// Debug.LogError("检测到左手握拳了");
// }
// else if (_leftHandState == KinectInterop.HandState.Open)
// {
// Debug.LogError("检测到左手张开了");
// }
// else if (_leftHandState == KinectInterop.HandState.Lasso)
// {
// Debug.LogError("检测到左手Yes手势了");
// }
// }
//}
//else
//{
// Debug.LogError("未检测到玩家");
//}
#endregion
//当前使用者Id
long _userId = _kinectManager.GetUserIdByIndex(_playerIndex);
if (_lastUserId != _userId)
{
_lastUserId = _userId;
}
if (_userId == 0 && _userId != _lastUserId)
{
_lastUserId = _userId;
//检测不到当前用户
}
}
else
{
Debug.LogError("没有检测到Kinect设备");
}
}
/// <summary>
/// 对要检测的姿势进行定义
/// </summary>
/// <param name="userId"></param>
/// <param name="userIndex"></param>
public void UserDetected(long userId, int userIndex)
{
KinectManager _kinectManager = KinectManager.Instance;
if (!_kinectManager || (userIndex != _playerIndex))
return;
//对要检测的手势进行添加监听
foreach (Gestures _gestures in Enum.GetValues(typeof(Gestures)))
{
_kinectManager.DetectGesture(userId, _gestures);
}
}
/// <summary>
/// 对当前姿势进行识别
/// </summary>
/// <param name="userId"></param>
/// <param name="userIndex"></param>
/// <param name="gesture"></param>
/// <param name="joint"></param>
/// <param name="screenPos"></param>
/// <returns></returns>
public bool GestureCompleted(long userId, int userIndex, KinectGestures.Gestures gesture, KinectInterop.JointType joint, Vector3 screenPos)
{
if (userIndex != _playerIndex)
return false;
switch (gesture)
{
case Gestures.None:
break;
case Gestures.RaiseRightHand:
ShuntHandSignal.Instance.HandSignalCarryOut(HandSignalType.Signal_Two);
break;
case Gestures.RaiseLeftHand:
break;
case Gestures.Psi:
ShuntHandSignal.Instance.HandSignalCarryOut(HandSignalType.Signal_Three);
break;
case Gestures.Tpose:
ShuntHandSignal.Instance.HandSignalCarryOut(HandSignalType.Signal_One);
break;
case Gestures.Stop:
break;
case Gestures.Wave:
break;
case Gestures.SwipeLeft:
break;
case Gestures.SwipeRight:
break;
case Gestures.SwipeUp:
break;
case Gestures.SwipeDown:
break;
case Gestures.ZoomIn:
break;
case Gestures.ZoomOut:
break;
case Gestures.Wheel:
break;
case Gestures.Jump:
break;
case Gestures.Squat:
break;
case Gestures.Push:
break;
case Gestures.Pull:
break;
case Gestures.ShoulderLeftFront:
break;
case Gestures.ShoulderRightFront:
break;
case Gestures.LeanLeft:
break;
case Gestures.LeanRight:
break;
case Gestures.LeanForward:
break;
case Gestures.LeanBack:
break;
case Gestures.KickLeft:
break;
case Gestures.KickRight:
break;
case Gestures.Run:
break;
case Gestures.RaisedRightHorizontalLeftHand:
break;
case Gestures.RaisedLeftHorizontalRightHand:
break;
case Gestures.TouchRightElbow:
break;
case Gestures.TouchLeftElbow:
break;
case Gestures.MoveLeft:
break;
case Gestures.MoveRight:
break;
case Gestures.UserGesture1:
break;
case Gestures.UserGesture2:
break;
case Gestures.UserGesture3:
break;
case Gestures.UserGesture4:
break;
case Gestures.UserGesture5:
break;
case Gestures.UserGesture6:
break;
case Gestures.UserGesture7:
break;
case Gestures.UserGesture8:
break;
case Gestures.UserGesture9:
break;
case Gestures.UserGesture10:
break;
default:
break;
}
return true;
}
/// <summary>
/// 用户丢失
/// </summary>
/// <param name="userId"></param>
/// <param name="userIndex"></param>
public void UserLost(long userId, int userIndex)
{
}
/// <summary>
/// 姿势正在进行
/// </summary>
/// <param name="userId"></param>
/// <param name="userIndex"></param>
/// <param name="gesture"></param>
/// <param name="progress"></param>
/// <param name="joint"></param>
/// <param name="screenPos"></param>
public void GestureInProgress(long userId, int userIndex, Gestures gesture, float progress, KinectInterop.JointType joint, Vector3 screenPos)
{
}
/// <summary>
/// 当取消激活此方法时
/// </summary>
/// <param name="userId"></param>
/// <param name="userIndex"></param>
/// <param name="gesture"></param>
/// <param name="joint"></param>
/// <returns></returns>
public bool GestureCancelled(long userId, int userIndex, Gestures gesture, KinectInterop.JointType joint)
{
if (userIndex != _playerIndex)
return false;
return true;
}
public void UserFaceDetected(int userIndex, UserGender gender, float age, float smile)
{
if (userIndex != _playerIndex)
return;
//后续待写
}
}
}