unity3d kinect游戏开发

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

最近我开始进行 Unity3D Kinect 游戏开发,由于是刚接触,便在网上查找相关资料,最终找到一篇较为完整的关于 Unity3D Kinect 游戏开发的文章,下面将详细分享开发过程。

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

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

1. 安装 Unity3D

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

2. 安装 Kinect SDK

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

3. 安装 Kinect Wrapper Package for Unity3D

这是 CMU 封装的用于 Kinect 开发的 Unity3D 导入包。在 Unity3D 工程中,若需要使用和 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 版本的替换文件。

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

使用修改后的导入包

若觉得每次导入资源包后再修改两个文件比较麻烦,我已将修改后的资源包导出。以后在每次开发工程时,只需导入这个修改后的资源包即可。

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

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

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

Scenes

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

Prefabs

  • Kinect_Prefab:这个预设(Prefab)包含了开发 Unity + Kinect 程序所必需的所有脚本,但不包含用于控制模型的控制器(controller)。
  • KinectPointMan:这个预设(Prefab)展示了 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 包实现 Unity3D 和 Kinect 交互,首先需要将该包导入到 Unity 中,然后按以下步骤完成交互。

1. 设置 Kinect_Prefab

前面提到过,在 Unity 中和 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 控制,还是仅仅一部分骨骼受 Kinect 控制。如果这些受 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 进行开发。

作者信息

feifeila

feifeila

共发布了 3994 篇文章