zoukankan      html  css  js  c++  java
  • 26. Kinect + Unity 体感及增强现实开发历程一

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

    我目前所使用的Unity3D的版本是Unity3.5; 使用的Kinect SDK版本是SDK1.6; Kinect和Unity交互的卡耐基梅隆的kinectWrapper.unitypackage方法是使用CMU的封装,这个方法支持的Kinect SDK版本是SDK1.0,要想使用1.6版本以上的kinect SDK,就要做一些相应的修改。完整的方案如下(这个也为什么上面说后期打算自己封装一个类似这样组件DLL):

    1、安装Uinty3D我使用的Unity3D版本是3.5,上官网下载(需要注册,才能用,我推荐大家去付点钱,我是自己找的破解码,声明不支持这样的行为,大家懂就好)。

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

    3、在Unity3D工程中,如果需要使用和kinect交互,那么就需要在这个工程中导入卡耐基梅隆的kinectWrapper.unitypackage。百度怎么用大家都懂吧(需要用kinect SDK版本是1.6以上版本(1,7以上版本还没试过替换是否可以,理论上应该也可以),就要下载KinectWrapperPackage替换文件并替换导入包中的KinectInterop.cs和KinectSensor.cs这两个文件即可) 好啦!目前准备工作都ok了!

    二、简单Kinect Wrapper Package for Unity3D包含了所有我们开发unity+kinect需要用到的脚本。

    1.导入包之后,所有我们需要的资源都会出现在project面板中,具体来说是以下的一些资源:

    2.Scenes KinectExample – 示例场景,这个例子向你展示了如何通过在每一个kinect 可以追踪的骨骼点上放置小球来产生骨骼运动。

    Prefabs Kinect_Prefab- 包含了我们开发unity+kinect程序所必需的所有脚本。但是它并没有包含你需要的用于控制模型的控制器(controller)。

    KinectPointMan – KinectPointController这个控制器(controller)是怎样使用的。

    Kinect KinectModelControllerV2 – 需要将这个脚本拖放到你想要应用kinect控制的模型上。为了让模型能够跟上人的节奏,你需要将模型上控制模型动作的关键骨骼拖放到这个脚本暴漏的合适的变量中 ,

    也就是将模型中的骨骼与kincet识别到的人的骨骼绑定起来。另外这个脚本暴漏的变量中,还有一个变量时标识模型是受哪个玩家控制。 KinectPointController – 需要将这个脚本拖放到场景中的游戏物体上。

    但是这个游戏物体不是模型,而是由一系列分别代表头部、肩部、手等人体部位的点组成。你需要将游戏物体中的这些关键点都拖放到这个脚本暴漏的外部变量中。这样就可以使用kinect控制游戏物体了!

    DisplayDepth – 得到深度图像。

    DisplayColor – 得到RGB图像。

    KinectRecorder – 用于记录你的动作,并为kinect模拟器(emulator)产生回放文件。

    KinectEmulator – 模拟kinect设备.和KinectRecorder产生的回放文件一起工作。

    KinectSensor – 从Kinect设备中取得数据。需要替换这个文件使用特用版本的SDK.

    DeviceOrEmulator – 设置使用kinect物理设备还是kinect模拟设备.

    SkeletonWrapper – 脚本抓取骨骼数据.

    DepthWrapper – 脚本抓取深度图像数据.

    KinectInterop – 从Microsoft Kinect SDK中抓取数据.

    三、使用KinectWrapperPackage包要想在自己的工程中

    首先需要用unity3D创建一个空工程,然后将kinectWrapper.unitypackage导入这个包到unity中,然后经过下面的步骤完成交互。

    1、设置KinectPrefab前面提到过了,如果在Unity中和Kinect交互,KinectPrefab这个游戏物体是必不可少的。 这个物体需要存在于你的场景中的某处。所以当你切换场景时,它仍旧存在着,因此你不必在每个场景中都实例一个Kinect_Prefab。

    在Unity3D中,找到project面板中的Kinect_Prefab直接拖拽到Hierarchy面板就可以了。

    2、控制游戏中的角色为了控制场景中的角色的移动,你需要将KinectModelControllerV2这个脚本拖拽到场景中的模型上,并绑定骨骼; 当然你为了控制一系列的游戏物体,你需要将KinectPointController拖拽这些物体上。

    下面分别说明这个脚本的使用(这两个脚本需要自己更具情况去定制)。

    控制器:KinectPointController: 在场景中创建一个空物体对象,作为你想要控制的容器。 将其他的物体拖拽到刚刚创建的空物体中,并放置到相同的位置。使刚才创建的空物体成为这些物体的父节点。

    拖拽KinectPointController脚本到这些物体的父节点上。 选中父节点,在Inspector面板中暴漏的变量中,找到Sw变量 (该变量表示Skeleton Wrapper).拖拽当前场景中Kinect_Prefab赋给这个变量。

    拖拽你想利用Kinect控制的每一个物体到Inspector面板对应的合适的变量中。 设置Player变量(代表玩家)和Mask变量(代表哪些骨骼收到监控)。

    控制器:KinectModelControllerV2: 拖拽脚本资源KinectModelControllerV2到场景中的模型中。

    选择场景中的模型。找到模型中的暴漏变量Sw(它代表Skeleton Wrapper). 并将当前场景中的Kinect_Prefab拖拽给Sw这个变量。 详细展开你的模型,让模型的每一块骨骼在hierarchy面板中可见。

    一个接一个地把模型中的骨骼拖拽到脚本中暴漏的对应的变量中.确保每一个骨骼都对应到了正确的变量上。

    当模型中所有的骨骼都放置好了之后,改变暴漏的Player变量的值,这个变量表明该模型是受哪个玩家控制, 0代表第一个玩家,1 代表第二个玩家。 接下来要设置暴漏的Mask变量的值。

    设置合适的值,以决定是所有的骨骼都受Kinect控制,还是仅仅一部分骨骼受Kinect控制.如果这些受Kinect控制的骨骼都不是你想要的,你可以自己写一个控制模型的脚本来代替KinectModelControllerV2。

    当游戏玩家在控制模型时,如果你想要该模型同时播放自带的动画,那么你需要在暴漏的变量中选中animated选项,并设置BlendWeight变量的值,来决定模型受自带模型动画和Kinect驱动动作的最终混合效果。

    该变量取值范围为0到1之间。

    四、运行KinectWrapperPackage包中事例

    保证Kinect设备连接成功指示灯为绿色,上面安装包安装配置好,最后运行事例

    注意图片的左下角的数字,证明连接成功 ,连接成功的时候Kinect设备还会自己调整角度(最左边的指示灯会有红色)并且模型会随着你动而动

    欢迎大家期待第二篇,将写一个3D人物模型,随着身体指示,产生转身和前进与跑步 先上一张图(第二篇会上相关的脚本代码,由于unity脚本主要是c#和js,所以我采用c#写的脚本。

       第一篇,我是基于卡耐基梅隆kinectWrapper.unitypackage中间件,利用上面的自带例子,经过自己的摸索终于成功了,可以看Kinect结合Unity3D引擎开发体感游戏(一),现在大部分用卡耐基梅隆和OpenNI来作为unity与kinect交互,还一种就是自己封装交互组件,经过这段时间研究后,自己封装了一个dll,大概实现的功能:kinect摄像头角度设置,RGB流,Depth流,玩家位数绑定,骨骼数据获取等!后期计划把鼠标加进去,骨骼绑定功能进一步优化,想利用这个dll组件实现3D试衣镜这样的虚拟场景,不仅包括体感游戏!最终可以满足绝大部分的开发情况!

         卡耐基梅隆和OpenNI现在基本上对于高于Kinect1.7和Unity3D4.0支持不是很好,特别是openni官网都没有支持更新了,对于高版本支持更是不好,卡耐基梅隆还是稍微好点,不缺配置也比较麻烦,还需要修改里面的代码!对于不太熟悉kinect同学们更是不好上手!自己封装组件,不断傻瓜化了,更是知根知底!当然不是说自己是什么高手,只要把原理清楚了,大家写一个也不是什么问题!

         好了,简单交代一下我开发环境:win8 + KinectSDK1.7 + Unity4.3.1(最新版本)哥熬了一个通宵破解了,想了解我这个例子的前提同学们必须对Unity3D比较熟悉,可以建立场景以及人物!对c#也要有了解。

    上图为利用unity3D建立简单的人物场景!上述的场景都是基于unity自带的素材建立的。  接下来该写人物事件驱动,大概的功能就是向前、向左、向右、向后走动。代码如下:

    然后将上面的setHeroState添加到Updata函数后,然后将脚本绑定到人物模型即可。这篇就不讲解自己封装的组件dll,也不是这一篇就能讲清楚的,后续的文章中会慢慢剖析讲解!

    下面就上图给大家看看体感控制效果截图:

    上图中包含RBG流 、Depth流以及手势控制人物正在前行行走!也欢迎大家期待第三篇,会给大家展示一款较为成熟的体感作品!  再次感谢OSC各位基友的鼓励!谢谢大家!

     声明:这篇代码量也不大,主要目前我也是在摸索阶段,unity工程量也大,不好把整个贴上来!后期代码量会逐步加大干货,并且包括视频链接地址!

  • 相关阅读:
    算法问题实战策略 JUMPGAME 记忆化搜索
    算法问题实战策略 TRIANGLEPATH 动态规划入门题
    poj 2785 4 Values whose Sum is 0
    poj 3276 Face The Right Way 递推
    acwing 883. 高斯消元解线性方程组
    acwing 861. 二分图的最大匹配 模板
    Leetcode 42 接雨水 双指针 空间换时间
    LeetCode 1290. 二进制链表转整数
    LeetCode 1291. 顺次数
    <挑战程序设计竞赛> poj 3320 Jessica's Reading Problem 双指针
  • 原文地址:https://www.cnblogs.com/kenzi/p/3770981.html
Copyright © 2011-2022 走看看