Kinect2.0 UI交互
Kinect官方已经SDK已经打包好了UI交互脚本InteractionManager
使用:
将手所在的image拖入到GUI Hand Cursor,脚本会通过GUI Hand Cursor 获取到手的对象
playerIndex : 用户当前的index坐标,kinect设备最多可识别6个人,kinect会将识别到的人添加到一个list中,index代表用户在list中的下标。
leftHandInteraction
rightHandInteraction :脚本识别的手,为true则识别对应的手,如两个手都是true,会出现左右手混乱的现象,建议只设置一个为true
smoothFactor : 当handOverCursor为false时,手的移动灵敏度,月底则越慢,是用Lerp实现的,每个手对应一个lerp。
Grip Hand Texture : 手握拳时手显示的图片
Release Hand Texture : 手松开时手显示的图片
Normal Hand Texture : 标准状态下显示的图片(上面两项为空时,显示Normal,优先显示上面两项)
handOverlayCursor:为True时,手的坐标会跟随用户手的位置,当kinect与人的距离较远时,手移动到屏幕边缘会比较困难。为False时,手会延伸出一个插值,整个屏幕都可以够到,ui交互,建议用true。
就我个人而言下面的基本不用
↓↓↓
allowHandClicks : 手在ui上停留两秒则进行点击,握拳也可以判断抓取,但手抓取的位置不怎么准
allowPushToClick : 手向前推则进行点击
controlMouseCursor : 是否用手控制鼠标,如无必要不建议使用,调试的时候如果不知道快捷键,暂停程序都得校准会儿位置,kinect判断抓取用的是手指部分不是手腕,有多坑,自己试试就知道了。。。
controlMouseDrag : 是否可以用手抓住进行拖动
↑↑↑
采坑经验:
- 当通过kinectManager.SetPrimaryUserID() 设置主用户id后,如果跳转场景,InteractionManager的index识别到的用户可能和当前主用户识别到不一致,可能会出现左边的人可以用手势,右边的人可以通过手进行交互,个人解决方法如下
void Update()
{
if(InteractionManager.Instance)
{
long userid = KinectManager.GetPrimaryUserID();
InteractionManager.Instance.playerIndex = KinectManager.Instance.GetBodyIndexByUserId(userid);
}
}
- 当挂载两个InteractionManager脚本时,更改用户id只会更改一个,另一个不会更改,个人解决方法:复制一个脚本出来,一个脚本挂载一个手
- 当前手在屏幕的中心点的位置是按照身体的中心点判定的,如果感觉不适,可以更改Update中的一些代码进行更改:
void Update()
{
if (!handOverlayCursor)
{
//在减去leftIboxLeftBotBack.x或y的基础上再减去一个值 0.1f~0.3f
leftHandScreenPos.x = Mathf.Clamp01((leftHandPos.x - leftIboxLeftBotBack.x) / (leftIboxRightTopFront.x - leftIboxLeftBotBack.x));
leftHandScreenPos.y = Mathf.Clamp01((leftHandPos.y - leftIboxLeftBotBack.y) / (leftIboxRightTopFront.y - leftIboxLeftBotBack.y));
......
}
}
- cursorProgressBar.fillAmount = cursorClickProgress 控制手的进度圈,如果自己写的话记得注释这句代码
- 更改手的image是没用的,要更改normal hand texture 或者上面两种状态的图片
- 后续如果还有坑,会继续更新,暂时只想到这么多。。。