OpenNI结合Unity3D Kinect进行体感游戏开发(转)

楼主#

更多 发布于:2012-07-17 16:42

 
 
1. 下载安装Unity3D(目前版本为3.4)
2. 下载OpenNI的Unity3D wrapper(目前版本为0.9.2):
    a. 地址:http://www.openni.org/Downloads/OpenNIModules.aspx
    b. 按如下选择:

  
  c. 下载完解压后有2个.unitypackage文件 3.
创建新的U3D(Unity3D)工程,导入载好的unitypackage文件,先导入
OpenNIUnityToolkit_0.9.2.unitypackage,再导入NITEExtensions.unitypackage    
这时在工程视图里能看到导入的所有文件 4. 开始熟悉wrapper(资源都在工程视图)     a.
示例游戏:OpenNI-->Sample Scenes-->SingleSkeleton.,运行后能获得一个感性的认识。    
b.
手册:OpenNI-->Documentation-->OpenNIPackageDocumentation,这个手册很重要,此后的
学习都可以根据这个手册来。     c. 创建新的Scene,然后按照手册上的例子自己从零开始创建示例游戏。
这篇手册需要通读的是第一部分:Unity OpenNI Unity Toolkit Overview---> OpenNI Package Overview,包括以下内容:
1. OpenNI Module Main Capabilities  
2. Samples Overview
3. Additional Topics
第一节包含了所有需要理解的东西,第二节是例程讲解,第三节是附加话题。
可以先从第二节开始,边照着创建例程边查阅第一节的相关内容:
a. Single Skeleton Sample
这个例程介绍怎么创建单一角色,包括怎么让Sensor运行起来,怎么让玩家用自己的躯体去控制游戏角色的骨架。
* Single Skeleton Sample
1. 在Unity中创建一个空的scene
2. 往scene里添加object (如果不知道怎么添加:在Project视图中搜索object的名字,然后直接将object拖到Hierarchy视图)
a. 第一个就是OpenNISettings。加了这个后点击运行,正常的话应该可以看到sensor亮了。这个object实现的是驱动sensor,封装了OpenNI相应的函数。
该obejct有3个子项,我们目前只关心"OpenNI configuration", 选中后在Inspector窗口能看到不同的选项:
Mirror behavior  // 表示是否要将深度数据进行左右镜像。勾上。
XML file // 通过XML 文件来定制一些参数,比如分辨率,帧率,Production Node等;也可以通过XML文件来导入录制好的深度视频,在需要识别特定动作的时候可以用来调试。
Use image generator? // 表示是否需要产生RGB图像。不勾。
Use user and skeleton? // 表示是否需要识别用户和骨骼。勾上。
Smoothing factor  // 滤波参数,暂时用默认值0.5
如果想深入了解这个object,
1)阅读手册里相应的解释:在OpenNI Module Main Capabilities-->Centralized Initialization and Configuration-->OpenNISettings Prefab
2)看脚本代码,有2个脚本:OpenNISettingsManager,NIOpenNISettingsManagerInspector
OpenNISettingsManager
-
主要是接受上面解释的参数,进行初始化和销毁的工作。这里关键的是NIContext,这是一个singleton,在脚本NIContext里。实际上
NIContext就是对OpenNI的context的封装。如果不了解什么是context,可以参阅OpenNI的文档。
NIOpenNISettingsManagerInspector - 主要是实现在Inspector显示相关选项。需要做扩展的时候可以看看。
b.

接着添加NIDepthViewer,这时候运行,就能看到右上角多了一个视窗,里面显示的是深度视频。(注:视频里人的动作是反的,你往左,视频里的自
己往右。如果不勾上上一个object的"Mirror behavior",就不会反了,这里先不理会)有了这个,就能清楚地看到镜头能看到的范围。
c. 再添加NIRadarViewer, 运行,在游戏的左上角能看到"User Radar", 当有用户被检测到的时候,会出现一个红色的方块,方块里面有数字(比如1)代表用户号。
d.

添加角色。这个比较有趣。添加ConstructionWorkerPrefab,然后在Hierarchy中选中这个object,再将鼠标移到
Scene窗口,按”F“键,这时候就可以看到工人模型了。运行,会看到工人模型以校正姿势站在屏幕中间(看起来比较小,以后可以调整)。这时候自己做校
正动作,会看到左上角RadarViewer里的小方块会从红色变成黄色最后变成绿色,绿色就表示校正成功了,但工人模型却没有动起来,因为我们还缺少一
个object,看下一步:
e. 添加NISkeletonPrefab,运行,校正,工人模型驱动起来了!这个object的功能就是实现用户驱动角色。里面包含了2个脚本:
1) NIUsers To Player Mapper: 用来管理user和player之间的映射,实际上很简单,先识别出来的user给分配一个小的player ID。
2)
NISkeleton Users Manager: 用来连接player和skeleton
controller。默认会自动搜索Skeleton
controller,也可以手动指定(在多玩家的场合用得上,比如player1映射到skeleton
controller1,player2映射到skeleton controller2)。skeleton
controller:是用来驱动character的,比如工人模型,你可以在ConstructionWorkerPrefab里找到这个脚本。

结起来,NISkeletonPrefab实现了user(玩家)到player(游戏里的玩家)到skeleton
controller(可以control不同的模型)的连接。会有user,player和skeleton
controller的原因:每个use可以驱动不同的player,比如你和朋友一起玩游戏,你和朋友都是user,各自驱动自己的player,而每
个player又可以有不同的外观,就象赛车游戏,你可以选择不同的车型。
想深入了解这个object,同样有2种方法:
1. 看手册:OpenNI Module Main Capabilities-->Skeleton Control-->NISKeletonPrefab
2. 读脚本:NIUsersToPlayerMapper, NISkeletonUsersManager
-------------------------------------------------------------------------------------------
本篇基于最新的wrapper v0.9.7.4(该版本已经不需要做校准姿势)介绍怎么从零开始把自己的人物模型驱动起来,目的是给读者一个能运行的示例,在这过程中不会对概念做过多的解释,详细请参照wrapper的帮助文档。
 
1. 安装Unity3.4
2. 下载v0.9.7.4的wrapper (解压得到的是一个文件:OpenNI_Unity_Toolkit-0.9.7.4.unitypackage)
3. 打开Unity创建一个空的工程
4. 导入OpenNI_Unity_Toolkit-0.9.7.4.unitypackage

  • 按默认的,导入全部文件
  • 导入后看到如下图所示文件结构


 
5. 导入你自己的人物模型,这里以asset store上的战士模型为例

  • 进入asset store(Unity里Ctril+9),当然前提是你注册了账户(免费)
  • Asset Store页面的Categories里选择3D Models-->Characters-->Humanoids-->Humans,然后在左侧的列表里选择Soldier Character Pack(免费的)
  • 导入Soldier Character Pack
  • 导入后看到多了如下文件

6. 加入人物模型

  • 将上图文件目录里的soldier直接拖到Hierarchy窗口
  • 这时在scene窗口看不到战士模型,先在Hierarchy窗口选中soldier,然后将鼠标移到Scene窗口,按F键,便可看到。
  • 这时如果运行游戏,看到的只是静止的战士,摄像头也不会亮

7. 驱动3D摄像头(Kinect或ASUS Xtion Pro,看你用的是什么设备)

  • 将Project窗口的OpenNI-->OpenNISettings(如下左图)拖动到Hierarchy窗口(如下右图)
  •  
  • 这时运行游戏,你会看到3D摄像头亮了,说明设备已经驱动起来了(当然,这一步你必须先插好3D摄像头)
  • 为了对设备运行状态有个更直观的认识,这里加入一些辅助的东西将Project窗口的NIIDepthViewer和NIRadarViewer拖到Hierarchy窗口
  • 运行游戏,会看到窗口的左上角和右上角分别多了一个小窗

  • 边的是NIRadarViewer,显示的是当前是否有人进入摄像头的视野并被识别出来;右边的是NIDepthViewer,显示的是摄像头看到的实际
    场景。这时如果你站在摄像头的视野范围内稍微动一下,就可以被识别出来,同时在Users Radar上面多了一个红色的小方格,方格里面显示数字1.
    小方格显示红色表示用户仅仅是被识别出来了,但还没有开始骨架跟踪;而数字1表示当前用户的ID。当你走动的时候,红色方格也会相应地动。
  • 那怎样开始骨架跟踪呢?创建一个空的game object(Unity的菜单GameObject-->Create Empty),然后在Inspector窗口将其重命名为player manager。
  • 然后将脚本NIPlayerManagerCOMSelection拖到player manager
  • 在Inspector窗口将Max allowed players改成1
  • 这时运行游戏,当你站在摄像头的视野范围内稍微走动的时候,就可以看到Users Radar窗口的小方格是绿色的,这表明算法已经开始跟踪你的骨架了因为这个版本的wrapper封装了比较新的OpenNI,所以这里你不再需要做校准姿势就可以自动跟踪骨架

8. 一切准备工作做好了,现在可以开始驱动人物模型了

  • 在Hierarchy窗口选中soldier,将Project窗口的脚本NISkeletonController拖到Inspector
  • 拖动过去后会看到弹出一个提示,选continue。
  • 这时Inspector窗口是这样的
  • 现在开始骨架匹配在Inspector(如上图)的“Joints to control”里选择Head,然后点击最右边的小圆圈,在弹出的“Select Transform”对话框里选择“Head”
  • 选好后的情形如下
  • 这时点击,会在Hierarchy窗口看到其所在的位置
  • 这样战士模型的头就和OpenNI算法识别出来的玩家骨架的头匹配起来了,其它骨架的匹配方法类同,下面是全部匹配好的“Joints to control”截图,可对照其骨架的名字一一匹配。

  • 里要说明的是,不同的人物模型对骨架各关节的命名可能不一样,怎么命名无所谓,关键是要找对关节。以这个战士模型为例,见下面两张图,第一张是Left
    Shoulder的位置,第二张是Left Arm的位置,很明显,我们必须选择的肩关节应该是Left Arm而不是Left Shoulder。

骨架匹配好了,现在运行游戏,你会看到在初始状态战士的双手是举起来的

这时如果你出现在摄像头的可见范围内,你会发现战士模型的手脚会跟着你的手脚在动,你转身,战士模型也会转身。这时,你的人物模型已经驱动起来了!
此时你可能会发现一个问题:你走动的时候战士模型并没有跟着移动,请在soldier的Inspector窗口将Update Root Position?勾上,再运行游戏,这时战士模型就会跟着你走动了

9. 现在模型已经完全驱动起来了,为了好看,你可以加入灯光,同时把战士模型放大一些。

OpenNI结合Unity3D Kinect进行体感游戏开发(转)的更多相关文章

  1. 使用IntelRealScene设备结合Cocos引擎实现体感游戏开发

    英特尔开发人员专区原文地址 Cocos游戏开发引擎对于广大开发者来说都比较熟悉,Intel RealScene是什么呢,简单理解是一种特殊的摄像头,可以捕捉用户的手势,面部表情等,进而实现AR,VR的 ...

  2. 使用HTML5开发Kinect体感游戏

    一.简介 我们要做的是怎样一款游戏? 在前不久成都TGC2016展会上,我们开发了一款<火影忍者手游>的体感游戏,主要模拟手游章节<九尾袭来 >,用户化身四代,与九尾进行对决, ...

  3. 使用unity3d和tensorflow实现基于姿态估计的体感游戏

    使用unity3d和tensorflow实现基于姿态估计的体感游戏 前言 之前做姿态识别,梦想着以后可以自己做出一款体感游戏,然而后来才发现too young.但是梦想还是要有的,万一实现了呢.趁着p ...

  4. 【CityHunter】基于LBS的AR体感游戏设计理念

    本人目前还不是游戏行业的圈内人士,并不懂得,游戏行业的生态圈,也不懂得,所谓的什么“中国市场环境”.所以不敢发表关于这方面的见解,不过我在这里想要插一句话,就是我认为啊,行业内,人与人之间还是有分层次 ...

  5. [体感游戏] 1、MPU6050数据采集传输与可视化

    最近在研究体感游戏,到目前为止实现了基于51单片机的MPU6050数据采集.利用蓝牙模块将数据传输到上位机,并利用C#自制串口数据高速采集软件,并且将数据通过自制的折线图绘制模块可视化地展示出来等功能 ...

  6. scratch编程体感游戏

    体感游戏有很多种,最常见的就是摄像头和声控了,今天我们要用scratch编写一系列的体感游戏!!!是不是很激动呢? 首先我们来编摄像头类的: No.1拳头打幽灵 挥动头就能打到幽灵了哟! 具体程序如下 ...

  7. C#开发体感游戏 Kinect应用知识

    Kinect首先是一个XBox 360外接体感设备,通过无线方式捕捉动作感知.由PrimeSense提供Range Camera技术,同类产品如任天堂Wii.Play Station Move,必须让 ...

  8. Kinect用体感来实现UI控件的点击

    用体感来实现UI控件的点击,如点击按钮. 做法:用一个图片表示左手手掌,图片位置追踪左手手掌移动,当手掌位于UI控件的矩形内时,握拳表示点击该控件. using UnityEngine; using ...

  9. unity3D实际的原始视频游戏开发系列讲座10它《战斗:外来入侵》在第一季度游戏开发

    解说文件夹 <保卫战:异形入侵>游戏开发 第一讲   游戏演示和资源的介绍 第二讲  "异形"怪物的实现 第三讲  "异形"怪物生命值的体现 第四讲 ...

随机推荐

  1. linux环境下给文件加密/解密的方法

      原文地址:linix环境下给文件加密/解密的方法 作者:oracunix 一. 利用 vim/vi 加密:优点:加密后,如果不知道密码,就看不到明文,包括root用户也看不了:缺点:很明显让别人知 ...

  2. 给各位聚聚和大大介绍一个开源项目 Expression2Sql(转)

    阅读目录 一.Expression2Sql介绍 二.单表简单查询 三.Where条件 四.多表关联查询 五.group by 六.order by 七.函数 八.delete 删除 九.update ...

  3. matlab 聚类

    目前已知matlab的聚类方法有三种: 一.利用 clusterdata函数对样本数据进行一次聚类,其缺点为可供用户选择的面较窄,不能更改距离的计算方法: 二.层次聚类,该方法较为灵活,需要进行细节了 ...

  4. Eclipse中使用tomcat 8服务器初级教程

    Eclipse中使用tomcat容器时,经常遇到的问题是启动不成功,输入localhost:8080报404,本文就是教大家破解这个问题.(不过这是很初级的问题了,大牛勿喷) 步骤 1 Window- ...

  5. EF-联合查询-结果集-Group by-统计数目

    EF框架用着痛并且快乐着··· 毕竟用习惯了SQL语句直接硬查的··· SELECT C0.ID,C_C.Name,C_C.C_COUNT FROM article_type C0 INNER JOI ...

  6. 在lua脚本中使用我们自定义的精灵类

    首先创建cocos2dx-lua项目,然后在项目中添加我们的自定义精灵类:这里Himi类名为:HSprite // // HSprite.h // cocos2dx_lua_tests_by_Himi ...

  7. select根据text选择项与select其它操作

    // 6.设置select中text="paraText"的第一个Item为选中 function jsSelectItemByValue(objSelect, objItemTe ...

  8. Android常用的工具类

    主要介绍总结的Android开发中常用的工具类,大部分同样适用于Java.目前包括HttpUtils.DownloadManagerPro.ShellUtils.PackageUtils. Prefe ...

  9. 用 FragmentManager 替换时使用 GoogleMaps 崩溃 app

    我要用下面的代码来加载的片段的项已被选定在 NavigationDrawer,然而 MapFragment 包含它里面的谷歌地图片段和它崩溃后试图打开它第二次. 这里是我使用的代码: @Overrid ...

  10. String、StringBuffer、StringBuilder的不同使用场景

    String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全) 简要的说, String 类型和 StringBuffer 类型的主要性能 ...