关于unity kinect检测延迟的问题,我现在就来分享一下我在做项目时,对unity kinect方面的研究的一些总结,大家可以在我总结的基础上进行扩充,当然也可以指正,将其完善是最好的。

最近没事,正好捡起Kinect再研究下,话说最近一次研究Kinect也是去年了,那个时候总是看人家的,自己也很少去做也很少去写,其实程序这东西真的要自己动手,光看没用,会说也不行,真正动起手来才知道个中真理。

今年寒假用了下MS的Kinect SDK(不过都是基于WPF的),MS的东西果然很简单。最近由于项目需要要重新研究下在Unity3D里面使用Kinect,原来一直用的是OpenNI的NITE的封装包,直接拿过来用,很简单。但是寒假看了MS的SDK后就一直想在Unity3D里面也可以调用MS的SDK。于是自己就非常想写一个自己的Unity3D和Kinect结合的类库或者插件。所以最近几天自己一直在忙着百度、google,想看看有没有可以参考的资料。不过搜遍各大网站,发现关于Kinect开发的资料是越来越多,但是关于Unity3D和Kinect结合的资料一直很少,所以我就想看自己能不能把unity kinect检测延迟方面的东西研究透彻。能搜到的资料不多,翻来覆去都是那么几篇,虽然是有一定启发,但是还是不够。不过倒是发现OpenNI2发布了,OpenNI2在架构上比OpenNI有了很大差别,可以说是焕然一新。


根据网上找的资料,总结下自己最近的“收获”:

1.Kinect目前可以使用的SDK有以下3个:

(1)MS的SDK,目前更新到了V1.7,在官网上有历史版本可以下载。

MS的SDK从beta算起有7  8个了,而且MS的SDK各个版本都有不同程度的更新和变化,可以使用C++也可以使用C#,不过自己半路出家,只是在最初的beta1和现在V1.6的,其他的没用过,而且全是用C#开发的WPF程序。要想使用MS的SDK一定要注意自己目前安装的是哪个版本的SDK。(不会C++是一种悲剧啊= =)

(2)OpenNI的SDK,这里指的是老的OpenNI,安装起来超级麻烦,而且要安装特定的驱动,不能用微软的驱动,最主要的是老版本的OpenNI在它之上NITE一统天下。关于这个版本的SDK,自己也就是在使用它的Unity Kinect Wrapper的时候接触过,但是了解不深,而且它提供的是C++接口,看来自己与它无缘了。

(3)OpenNI2的SDK,这是最新的OpenNI的SDK,在它之后多出了很多中间件,你可以使用NITE2也可用别的。去它官网转了一圈(http://www.openni.org)发现它没有提供C#的接口,还是得用C++开发。试着搜索了下Unity3D这类关键词,想看看它在1.x的时候的封装包有没有跟着更新。结果半喜半忧,它是提供了一个可以跟Unity3D结合的插件,但是却是ZigFu的,貌似1.x的那个Unity3D Kinect Wrapper封包已经没了。



2.可以跟Unity3D结合的插件:

其实关于在Unity3D中使用Kinect的方法网上介绍的无外乎还是那几个(貌似去年就是这几个),而且随着OpenNI2的发布,去年曾经吵的“火热”的那个OpenNI的Kinect Wrapper也很少提了。而且想要在Unity3D中使用MS的SDK要分版本,V1.5、V1.6、V1.7的SDK好像都互相不兼容。借用网上大牛写的总结(http://blog.csdn.net/yuanchunfa/article/details/8107628)。在Unity3D中使用Kinect也就是5种方案。

(1)Zigfu:这个是OpenNI官网可以找到的。挺好用的,不过很遗憾要收费,而且网上找不到破解的dll。

(2)CUM(卡耐基梅陇大学)的Kinect Wrapper。这个wrapper是基于MS beta版本的SDK。想要在V1.5和V1.6里面使用要替换文件,我直接找的人家改好的V1.6的Wrapper,不知道适不适用于V1.5的。

(3)adevine1618的开发包,网上说不在更新了,在github上找到了这个封包,本来想下载下它的dll源码来看看作为参考的,结果不知道是github的原因还是天朝的原因,一直下载不下来。不过现在想想他很可能是基于C++来写的插件,所以自己也就欣慰了,下载下来的话自己半吊子的C++知识也不会有太大收获。

(4)仿照Zigfu自己写一套C#类库,不过那篇文章也说了,Unity现在只支持到.net 3.5而Kinect V1.6最少要.net 4.0。我也试着写了一个C#的DLL,里面封装了Kinect的启动,停止什么的方法。不过在Unity3d里面真的提示错误,看错误也就知道是因为使用了高版本的.net资源的原因。

(5)用C++自己写一套插件,那篇文章说了,这个可以实现,不过本人没用C++做过Kinect的开发,而且自己的C++水平写出来肯定会成篇的bug,也就放弃了。



看完上面的5种方法,想了一下其实自己现在能用的解决方案也就三种,并且都实验了下:

(1)使用Zigfu,个人认为Zigfu的API做的不怎么样(也可能是没付费的原因,难道想学JBoss?),用的不顺手,而且到时候如果需要的话只能付费获商业许可。那个水印也够烦人,目前Zigfu的插件是针对Unity3d 4.0的,在3.5下面能用,但是有莫名其妙的错误(自己试试就知道了)虽不影响开发,但是很烦人。最主要的是Zigfu的dll没有找到破解版,收费还不便宜(对于穷学生来说那是天价了)。

(2)CUM的wrapper,自己花了两天时间着重看了下CUM的那个封包的源码,发现收获不小。不过在使用那个封包的时候一直报数组越界的错误,虽然知道是哪儿的问题,但是自己根本解决不了。不过对写自己的C#类库倒是有不小的帮助。

(3)使用去年的OpenNI的那个基于NITE的Unity3D wrapper。这个肯定行,但是在这个与时俱进的年代,谁都想用新的,OpenNI2都发布了,自己也不想用OpenNI了,而且OpenNI 1.x的安装还那么麻烦。所以这个方案不到万不得已不会使用。



接下来准备反编译Zigfu的dll文件,看看能不能成功,如果能成功,那么就仿照它的思路写一套自己的C#类库,就起名叫UDK,如果能写出来自己会放到网上将他开源的,到时候希望能有大牛指点,同时希望能有更多的开源代码放出来大家共同学习进步。