Kinect for Unity3D开发 之 手势/姿势(Gesture)识别基础知识
Posted sialianzi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kinect for Unity3D开发 之 手势/姿势(Gesture)识别基础知识相关的知识,希望对你有一定的参考价值。
- 手势/姿势识别:
有两种方法可以为Unity项目添加手势检测和手势识别功能。
1. KinectManager,示例场景中MainCamera的一个组件。
2. 以编程方式指定用户特定的姿势。需要实现KinectGestures.GestureListenerInterface。KinectScripts / Extras / SimpleGestureListener.cs脚本中有一段示例。
(没有这个脚本的下载 用于Unity3D的Kinect Wrapper Package)
已有的Gesture
RaiseRightHand / RaiseLeftHand - 左手或右手在肩膀上抬起,保持不变至少1.0秒。
Psi - 双手抬起肩膀,保持这个姿势1.0秒。
Tpose - 双臂张开,垂直于身体(T形姿势),持续1.0秒。
Stop - 一只手向下(down),另一只手略微在腰部以下的位置抬起(slightly to the side)。
Wave - 右手向左挥动然后向右挥动,或左手向右挥动然后向左挥动。
SwipeLeft - 右手向左滑动。
SwipeRight - 左手向右滑动。
SwipeUp / SwipeDown - 用左手或右手向上或向下滑动
Click - 左手或右手保持至少2.5秒。与光标控制结合使用很有用。
RightHandCursor / LeftHandCursor - 伪手势,用于移动右手或左手提供光标。
ZoomOut - 开始时,左手和右手位于前面并在放在一起,然后朝着不同的方向移动。
ZoomIn - 开始时,左手和右手相距至少0.7米并且位于前方,然后双手互相靠近。
Wheel - 开始时,左手和右手放在与肩宽的地方,并且在身体前面,然后是手开始转动一个假想中的轮子,向左(正角度)或向右(负角度)。
Jump - 臀部中心在1.5秒内至少比之前高出15厘米。
Squat - 臀部中心在1.5秒内至少比之前低15厘米。
Push - 在1.5秒内用左手或右手向前推。
Pull - 在1.5秒内向后拉用左手或右手往后拉。
第二种方法
UserDetected()用于启动手势检测。
UserLost()用于清除变量或释放分配的资源。
UserDetected() remove the gestures,不被需要,在调用UserLost()之前,它们会自动删除。
GestureInProgress() - 继续,在gesture已经被启动,但是没有完成,也没有被取消时用。
GestureCompleted() 完成后调用。
然后就可以添加自己的代码,用来处理已完成的gesture。
GestureCancelled() 手势被取消时使用。
如何添加自己的手势:
传感器报告Kinect坐标系中被跟踪的身体部位的三维坐标,以米为单位。
打开 Assets / KinectScripts / KinectGestures.cs
- 找到 Gestures-enum,在末尾加上你要添加的手势名称
- 找到 CheckForGesture()-function,有一个很长的switch(),每个case处理一个手势的检测,给你的手势添加一个case。
- 参考RaiseLeftHand,RaiseRightHand,SwipeLeft或SwipeRight 这些简单的实例。
- 这个switch用来检查和改变gesture现在的状态,状态存在GestureDate这个结构体中,所以为你的手势创建一个GestureDate。
- 初始状态是0。在这个状态下,代码才检测用户是否在做这个手势。先检查关节的位置;如果位置合适,再检查下一个状态,是否关节到达所需位置,或与前一个状态的位置的之间的距离(注意这里是两种情况,1.与身体其他位置相比较,2.与自己之前的某一个时间点相比较),时间间隔通常假设1~1.5s。
- 如果关节位置符合,则认为手势完成,此时将状态重置为0以便下一次检测。最好参考已有的例子,复制修改一下不容易错。
以上是关于Kinect for Unity3D开发 之 手势/姿势(Gesture)识别基础知识的主要内容,如果未能解决你的问题,请参考以下文章