一、将Kinect和Unity3D联系起来的插件中最核心的就是 KinectManager 脚本。要想在Unity3d 中使用 Kinect ,就需要将KinectManager脚本拖放到场景中的某一个物体上。一般是在该场景中新建一个空物体,将其命名为 KinectController ,然后将一些控制的核心脚本都拖到该物体上,如将 KinectManager 脚本拖放到 KinectController 这个空物体上即可。
1、Unity中的 KinectManager 脚本在 Inspector中所显示的各项。(KinectManager 是一个单例模式)

箭头所指项可以设置玩家被Kinect检测到的条件。如,当设置Size为1时,在Element中可以选择某一姿态。意味着当玩家进入到Kinect视角之中后,当做这个姿态时,就会被Kinect检测到,并被追踪。而其他的玩家即使更早的进入到KInect的视角中,如果没有做出该姿态,仍将不会被检测到。
二、KinectManager.cs 脚本文件
1、KinectManager.cs 文件中常用的API
2、KinectManager.cs 文件中常用的变量
3、获取人物关节点信息的流程方法:
(1)、获取人物的ID
(2)、获取关节信息
(3)、获取手势状态
(4)、获取用户信息
- void Update () {
-
- bool isInit = KinectManager.Instance.IsInitialized(); //首先要对设备进行实例化和初始化,之后才能进行后续的操作
- if (isInit)
- {
- if (KinectManager.Instance.IsUserDetected()) //判断是否检测到人物
- {
- long userid = KinectManager.Instance.GetPrimaryUserID();//获取主要用户的ID
- int jointType = (int)KinectInterop.JointType.HandLeft;//获取左手关节点的对应序号
-
- //当检测到用户时,就获取到用户的位置信息
- Vector3 userPos = KinectManager.Instance.GetUserPosition(userid);
- print("user.x= " + userPos.x + " user.y= " + userPos.y + " user.z=" + userPos.z);
-
- //判断这个用户的指定关节点是否被追踪到
- if (KinectManager.Instance.IsJointTracked(userid,jointType))
- {
- /*如果零追踪到,就开始获取主要用户的左手的位置坐标,单位是m
- * LeftHandKinectPos 的值表示在Kinect坐标系下,其y轴的值是减去了传感器高度:Sensor Height之后的值
- * LeftHandPos 的值在x,z轴上的和LeftHandKinectPos的相同,不同的是其y轴的值会加上Sensor Height的值,为世界坐标系下的值
- */
- Vector3 LeftHandKinectPos = KinectManager.Instance.GetJointKinectPosition(userid,jointType);
- Vector3 LeftHandPos = KinectManager.Instance.GetJointPosition(userid, jointType);
- //将左手的坐标打印出来
- print("左手坐标为:kx=" + LeftHandKinectPos.x + " ky=" + LeftHandKinectPos.y + " kz=" + LeftHandKinectPos.z);
- print("左手坐标为:x=" + LeftHandKinectPos.x + " y=" + LeftHandKinectPos.y + " z=" + LeftHandKinectPos.z);
-
-
- // 还可以获取用户手的状态,如检测右手的状态
- KinectInterop.HandState rightHandState= KinectManager.Instance.GetRightHandState(userid);//获取右手的状态
- if (rightHandState == KinectInterop.HandState.Closed)
- {
- print("右手握拳");
- }else if (rightHandState==KinectInterop.HandState.Open)
- {
- print("右手张开");
- }else if (rightHandState == KinectInterop.HandState.Lasso)
- {
- print("yes 手势");
- }else if (rightHandState == KinectInterop.HandState.Unknown)
- {
- print("未知手势");
- }
- }
- }
- }
-
- }
cs运行
三、各模块源码分析
1、彩色图的源码分析,Kinect如何获取彩色图
2、深度图的源码分析:
(1)、流程