KinectSDK + Unity3D学习总结

591 篇文章 7 订阅 ¥99.90 ¥99.00
281 篇文章 6 订阅
241 篇文章 13 订阅

Kinect结合Unity3D引擎开发体感游戏(一)

http://my.oschina.net/klttl/blog/161694
    最近公司项目需要做科技馆的体感游戏,以前也没接触过游戏,虽然以前自己也是想做游戏,我想大部分都是学编程出来来做游戏,哈哈(请允许我淫笑一下,终于可以做这方面)。虽


然以前没接触过体感游戏,看到的体验也是大部分看到的视频,幸好现在网络还是比较发达,上网大概了体感游戏开发,目前比较好的是Unity3D和Kinect结合交互进行开发。现在心里的感觉


用句话说:哥现在也走在世界技术最前言,TMD碉堡了!
  9月7号开始查阅网上的资料,一直没有找到详尽而又简单的方案。网上目前我看到就三种方法,说是三种方法说白了就一种:中间件。形散而神不散--散文的最高境界(其实我语文不好,


对不起祖国气我的期望,呜呜、、、)三种方法如下:
1.卡耐基梅隆的kinectWrapper.unitypackage;


2.OpenNI官方提供的OpenNI_Unity_Toolkit-0.9.7.4.unitypackage(现在官方不提供更新与支持了,支持的版本unity3.4,在往上版本会出现很多问题,需要修改很多地方,比较麻烦);


3.自己写的交互的中间件,我在网上看见高手自己的写的中间件,封装为DLL,现在通过这段时间动手实现,发现自己写一个这样的中间件其实也不难,后期也自己准备写一个。 我在采用的


第一种方法,原因上面三点大概说来了,第二点以后考虑支持的版本和官方的态度,所以暂时不考虑;第三种目前自己还没写,目前来说也不太现实,也暂时不考虑考虑。所以目前情况就暂


时考虑第一种;


 废话说了那么多,相信各位机油们早就寂寞难耐了,现在就切入正题:
一、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、设置Kinect_Prefab前面提到过了,如果在Unity中和Kinect交互,Kinect_Prefab这个游戏物体是必不可少的。 这个物体需要存在于你的场景中的某处。所以当你切换场景时,它仍旧存在


着,因此你不必在每个场景中都实例一个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#写的脚本,9月7


号才接触到unity和kinect,原来工作一直用c/c++,c#都是现学现买所以有不当之处,还请大家使劲拍砖): 
========

KinectSDK 1.6 + Unity3D体感应用

http://blog.csdn.net/yuanchunfa/article/details/8107628
    最近买了个Kinect中国版,加上新出的KinectSDK 1.6,于是开始尝试起来,先是给同事的一个朋友帮忙,为Flash提供骨骼数据,之前早就给了这个朋友网上一套KinectHtml5源码,这个


代码很早我编译过的,能够在支持Html5上浏览器使用,这个朋友说编译失败,当时还是很疑惑为什么, 只是当时没条件编译, 现在条件具备,就自己再用起这套源码,发现是KinectSDK 


1.0的版本的Demo,怪不得我以前能直接编译通过,而这位朋友编译通不过,因为他采用的是KinectSDK 1.5。这次我采用Kinect SDK 1.6,看看ToolkitBrowser上示例,没多久就把这份代码


修改并编译通过了。后面就尝试在Unity3D上使用,网上查找了些方案,其中这篇文章不错,Kinect+Unity3D 体感游戏开发 — Kinect SDK v1.5,给出几种方案,我做了相应尝试,现在也进


行一下总结:
1、Zigfu的ZDK
    以前用OpenNI的时候用过,没想到能够支持Kinect,于是很高兴的下好了trial版本,果然能用,不过发现一下子能打开Kinect设备,一下子不能打开Kinect设备,很是困惑,后面发现


360安全卫士及360杀毒把Kinect服务当木马的提示,果断设置为信任,也把360安全卫士和360杀毒退出,在测试打开Kinect设备成功率高的多,但依然会有失败的。


2、CMU的封装
    这套在看这篇文章是先下到,只支持Kinect SDK 1.0,本想修改一下用起来,但是懒的基因没有马上动手,而是再Google下,找到了这边文章,下载替换文件,看了一下,Kinect SDK 


1.5跟Kinect SDK 1.6还是有区别,用了一下果然也是用不起来。


3、adevine1618开发的插件
    缺点有说不在维护,所以就没有去试了。


4、根据Zigfu自己写一套C#类库
    前面说到Zigfu的打开不稳定,于是想自己写一套能够同时支持Kinect和OpenNI的封装。没花多长时间,总结了一下需要各抽象层就动手写了骨骼数据方面,于是放到Unity进行测试。发


现MonoDevelop编译没有问题,在Editor下确提示编译出错。这篇文章有提到:Unity3.5 只支持到.Net 3.5, 而Kinect SDK v1.5 最低要求是.Net 4.0. 所以直接在Unity中使用v1.5的


assembly是不行的。不过我尝试才真正体会到真的是不行,在VS2012中改成.Net 3.5的话,编译又通不过,改成.Net 4.0编译通过,在Unity中又通不过,默认是.Net 4.5。很好奇Zigfu是如


何做到的,ZDK下有Kinect10.dll及OpenNI.Net的引用,也是用C#写的一套类库啊,难道是Kinect SDK 1.5,而且用的是.Net 3.5?用Kinect SDK 1.5的话,为何CMU的封装(替换文件了)有


如何跑不起来?


5、Unity Plugin方式,用C++写DLL
    这个动手写以前就肯定是可行的,但还是动手写了一下做了测试,发现Kinect 红外灯能够点亮了。这样比CMU封装更有好处,按更自然的C++方式来实现,仅导出需要的接口就好了。


    这么多方案下,最希望是能够把Zigfu实现能够把Kinect面部识别等更多功能放进去,当然是需要Unity能够支持.Net 4.5了,目前方案是Unity Plugin方式了,把需求放到C++中去完成好


了。

========

资源

http://www.manew.com/labe/plus796.html
体感相关资源,unity3d 体感插件等;


https://pan.baidu.com/s/1hs8t0US

motion-sdk-latest.zip


  • 0
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值