untiy 3d kinect 无响应

2015年01月25日 09:48 0 点赞 0 评论 更新于 2025-11-21 15:22

最近在学习 Unity 3D 和 Kinect 交互开发时,遇到了“Unity 3D Kinect 无响应”的问题。查阅网上资料,未能找到详尽且简单的解决方案。经过摸索,我终于掌握了在 Unity 3D 中使用 Kinect 的方法,在此做个笔记分享给大家。

一、Unity 和 Kinect 交互的环境配置

我使用的 Unity 3D 版本是 3.5,Kinect SDK 版本是 1.6。让 Kinect 和 Unity 交互采用的是 CMU 的封装方法,但该方法支持的 Kinect SDK 版本是 1.0,若要使用 1.5 或 1.6 版本的 Kinect SDK,需要进行相应修改。完整的配置方案如下:

1. 安装 Unity 3D

我使用的是 3.5 版本,你也可以在 Unity 3D 官网 下载免费版本的 Unity。

2. 安装 Kinect SDK

我使用的 SDK 版本是 1.6,可在 Kinect for Windows 官方网站 下载。

3. 安装 Kinect Wrapper Package for Unity 3D

这是 CMU 封装的用于 Kinect 开发的 Unity 3D 导入包。在 Unity 3D 工程中若需使用 Kinect 交互,就需导入此包。点击这里 下载 Kinect Wrapper Package。

4. 运行示例工程

CMU 提供的 Kinect Wrapper Package 包中包含一个名为 KinectExample.unity 的 Unity 示例工程。在工程中导入 Kinect Wrapper Package 包后,在 Unity 的 Project 面板上找到 Scenes -> KinectExample,双击即可打开该示例工程。

或者单独下载 CMU 提供的示例工程:newKinect,此示例工程与导入包中包含的示例工程相同。

打开示例工程后,在 Hierarchy 面板中可看到相关内容。

5. 修改导入包中的相关文件

CMU 提供的 Unity 导入包支持的 Kinect SDK 版本是 1.0,若要使用其他版本的 SDK,需下载并替换导入包中的一些文件,具体为 KinectInterop.cs 和 KinectSensor.cs 这两个文件。

点击这里 下载适用于 Kinect SDK 1.6 版本的替换文件。

下载完成后,将下载的文件替换掉面板中标识的这两个文件,然后即可运行示例工程,体验在 Unity 创建的场景中使用 Kinect 控制人物模型及小球的运动。

使用修改后的导入包

若你觉得每次导入资源包后再修改两个文件较为麻烦,我已将修改后的资源包导出。以后开发工程时,只需导入这个修改后的资源包即可。 点击这里 下载适用于 Kinect SDK 1.6 的资源包。

二、用于 Kinect 开发的包中包含的资源

用于 Kinect 开发的包(Kinect Wrapper Package for Unity 3D)包含了开发 Unity + Kinect 所需的所有脚本。

导入包后,所需资源会出现在 Project 面板中,具体如下:

Scenes

  • KinectExample:示例场景,展示了如何通过在每个 Kinect 可追踪的骨骼点上放置小球来产生骨骼运动,以及如何使用 Kinect 控制模型。

Prefabs

  • Kinect_Prefab:该预设(prefab)包含了开发 Unity + Kinect 程序必需的所有脚本,但不包含控制模型的控制器(controller)。
  • KinectPointMan:展示了 KinectPointController 这个控制器的使用方法。

Kinect

  • KinectModelControllerV2:需将此脚本拖放到想要应用 Kinect 控制的模型上。为使模型能跟上人的节奏,需将模型上控制动作的关键骨骼拖放到脚本暴露的合适变量中,即将模型中的骨骼与 Kinect 识别到的人的骨骼绑定。此外,脚本暴露的变量中还有一个用于标识模型受哪个玩家控制。
  • KinectPointController:需将此脚本拖放到场景中的游戏物体上,该游戏物体由一系列分别代表头部、肩部、手等人体部位的点组成。需将游戏物体中的这些关键点拖放到脚本暴露的外部变量中,从而使用 Kinect 控制该游戏物体。
  • DisplayDepth:用于获取深度图像。
  • DisplayColor:用于获取 RGB 图像。
  • KinectRecorder:用于记录动作,并为 Kinect 模拟器(emulator)产生回放文件。
  • KinectEmulator:模拟 Kinect 设备,与 KinectRecorder 产生的回放文件协同工作。
  • KinectSensor:从 Kinect 设备中获取数据,若使用特定版本的 SDK,需替换此文件。
  • DeviceOrEmulator:设置使用 Kinect 物理设备还是 Kinect 模拟设备。
  • SkeletonWrapper:抓取骨骼数据。
  • DepthWrapper:抓取深度图像数据。
  • KinectInterop:从 Microsoft Kinect SDK 中抓取数据。
  • Recordings/playbackDefault:为 Kinect 模拟设备准备的默认回放文件。

Models and Materials

  • rainbowMan:示例模型。需将 KinectModelControllerV2 脚本拖放在此模型上,并将组成模型的骨骼与脚本中暴露的骨骼部位变量绑定,然后即可进行测试。

三、在自己的工程中使用 Kinect Wrapper Package 包

若要在自己的工程中使用 Kinect Wrapper Package 包实现 Unity 3D 和 Kinect 交互,首先需将该包导入 Unity,然后按以下步骤完成交互:

1. 设置 Kinect_Prefab

若要在 Unity 中实现与 Kinect 的交互(解决“Unity 3D Kinect 无响应”的问题),Kinect_Prefab 这个游戏物体必不可少。它需存在于场景中的某处,且在 KinectWrapper 脚本中调用了 DontDestroyOnLoad 函数,因此切换场景时它仍会存在,无需在每个场景中都实例化一个 Kinect_Prefab。

在 Unity 中,将 Project 面板中的 Kinect_Prefab 直接拖拽到 Hierarchy 面板即可。

2. 控制游戏中的角色

为控制场景中角色的移动,可将 KinectModelControllerV2 脚本拖拽到场景中的模型上并绑定骨骼;若要控制一系列游戏物体,需将 KinectPointController 脚本拖拽到这些物体上。下面分别介绍这两个脚本的使用方法:

模型控制器:KinectModelControllerV2

使用模型控制器,请按以下步骤操作:

  1. 将脚本资源 KinectModelControllerV2 拖拽到场景中的模型中。
  2. 选择场景中的模型,找到模型中暴露的变量 Sw(代表 Skeleton Wrapper),将当前场景中的 Kinect_Prefab 拖拽给 Sw 变量。
  3. 详细展开模型,使模型的每一块骨骼在 Hierarchy 面板中可见。
  4. 逐个将模型中的骨骼拖拽到脚本中暴露的对应变量中,确保每个骨骼都对应到正确的变量上。
  5. 当模型中所有骨骼都放置好后,改变暴露的 Player 变量的值,该变量表示模型受哪个玩家控制,0 代表第一个玩家,1 代表第二个玩家。
  6. 设置暴露的 Mask 变量的值,以决定是所有骨骼都受 Kinect 控制,还是仅部分骨骼受控制。若这些受控制的骨骼不符合需求,可自行编写控制模型的脚本来替代 KinectModelControllerV2。
  7. 若希望游戏玩家控制模型时,模型同时播放自带动画,需在暴露的变量中选中 animated 选项,并设置 BlendWeight 变量的值,该变量取值范围为 0 到 1,用于决定模型受自带模型动画和 Kinect 驱动动作的最终混合效果。

一系列点的控制器:KinectPointController

使用该控制器控制一系列点,请按以下步骤操作:

  1. 在场景中创建一个空物体对象,作为要控制的一系列点的容器。
  2. 将其他物体拖拽到刚创建的空物体中,并放置到相同位置,使该空物体成为这些物体的父节点。
  3. 将 KinectPointController 脚本拖拽到这些物体的父节点上。
  4. 选中父节点,在 Inspector 面板中找到暴露的变量 Sw(表示 Skeleton Wrapper),将当前场景中的 Kinect_Prefab 赋值给该变量。
  5. 将想利用 Kinect 控制的每个物体拖拽到 Inspector 面板对应的合适变量中。
  6. 设置 Player 变量(代表玩家)和 Mask 变量(代表哪些骨骼受到监控)。

仔细研究包中自带的例子,就能轻松掌握在 Unity 中结合 Kinect 开发的方法,“Unity 3D Kinect 无响应”的问题也能得到解决。