unity kinect检测延迟

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

在项目开发过程中,我对Unity Kinect相关内容进行了深入研究。在此,我将分享研究总结,希望大家能在此基础上进行扩充,也欢迎指正,共同完善。

最近,我重新拾起Kinect进行研究,上一次研究还是去年。以往我总是看别人的代码和文章,自己动手实践较少。但程序这门学问,光看不练、光说不做是不行的,只有亲自上手才能领悟其中真谛。

今年寒假,我使用了微软(MS)基于WPF的Kinect SDK,发现微软的SDK使用起来很简单。由于项目需求,我需要重新研究在Unity3D中使用Kinect。之前我一直使用OpenNI的NITE封装包,直接拿来用很方便。然而,寒假接触了微软的SDK后,我就想在Unity3D中也能调用它,于是打算编写一个自己的Unity3D和Kinect结合的类库或插件。为此,我在各大网站上搜索参考资料,发现Kinect开发资料虽多,但关于Unity3D和Kinect结合的资料却很少。所以,我决定深入研究Unity Kinect检测延迟方面的内容。不过能搜到的资料有限且重复,虽有一定启发,但还远远不够。在此期间,我发现OpenNI2发布了,其架构相较于OpenNI有了很大的改进。

根据网上资料,我总结了近期的“收获”:

一、Kinect目前可用的SDK

1. 微软(MS)的SDK

目前已更新到V1.7,在官网上可下载其历史版本。微软的SDK从测试版算起有七八个版本,每个版本都有不同程度的更新和变化。该SDK支持C++和C#开发,我是半路出家接触编程,只使用过最初的beta1和现在的V1.6版本,且都是用C#开发的WPF程序,其他版本未曾使用。使用微软的SDK时,一定要注意当前安装的版本。(不会C++真是一大遗憾啊)

2. OpenNI的SDK(老版本)

安装过程极为繁琐,需要安装特定驱动,不能使用微软的驱动。老版本的OpenNI之上NITE占据主导地位。我仅在使用其Unity Kinect Wrapper时接触过这个版本的SDK,了解并不深入。它提供的是C++接口,看来我与它缘分较浅。

3. OpenNI2的SDK

这是最新的OpenNI SDK,之后出现了很多中间件,可使用NITE2或其他中间件。我访问其官网(http://www.openni.org)发现,它没有提供C#接口,仍需使用C 开发。我搜索了与Unity3D相关的关键词,想了解其1.x版本的封装包是否有更新。结果喜忧参半,它提供了一个可与Unity3D结合的插件,但该插件来自ZigFu,似乎1.x版本的Unity3D Kinect Wrapper封包已不再存在。

二、可与Unity3D结合的插件

网上介绍的在Unity3D中使用Kinect的方法就那么几种(貌似去年也是这些),随着OpenNI2的发布,去年曾备受关注的OpenNI的Kinect Wrapper也很少被提及。并且,在Unity3D中使用微软的SDK要区分版本,V1.5、V1.6、V1.7的SDK似乎互不兼容。参考网上大牛的总结(http://blog.csdn.net/yuanchunfa/article/details/8107628),在Unity3D中使用Kinect有以下五种方案:

1. Zigfu

可在OpenNI官网找到,使用起来较为方便,但可惜需要付费,且网上找不到破解的DLL文件。

2. CUM(卡耐基梅陇大学)的Kinect Wrapper

该Wrapper基于微软测试版的SDK,若要在V1.5和V1.6版本中使用,需要替换文件。我直接使用了别人修改好的V1.6版本的Wrapper,不确定是否适用于V1.5版本。

3. adevine1618的开发包

网上称该开发包已停止更新,我在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,所以只能放弃。

综合考虑以上五种方法,我认为目前可行的解决方案有三种,并都进行了实验:

1. 使用Zigfu

我认为Zigfu的API设计不太理想(可能是未付费的原因),使用起来不顺手。若有需求,需要付费获取商业许可,其水印也很烦人。目前Zigfu的插件是针对Unity3D 4.0的,在3.5版本下虽能使用,但会出现莫名其妙的错误(亲自尝试便知),虽不影响开发,但令人心烦。最重要的是,我未找到Zigfu的破解版DLL,其收费对于学生来说过于昂贵。

2. CUM的wrapper

我花了两天时间仔细研究了CUM封包的源码,收获颇丰。但在使用该封包时,一直出现数组越界的错误,虽知道问题所在,但无法解决。不过,这对我编写自己的C#类库有很大帮助。

3. 使用去年基于NITE的OpenNI的Unity3D wrapper

这种方法肯定可行,但在追求新事物的时代,大家都想用新的技术。OpenNI2已经发布,且OpenNI 1.x的安装过程非常麻烦,所以不到万不得已,我不会使用这个方案。

接下来,我打算反编译Zigfu的DLL文件,若能成功,我将仿照其思路编写一套自己的C#类库,命名为UDK。若编写成功,我会将其开源发布到网上,希望能得到大牛的指点,也希望能有更多的开源代码供大家共同学习进步。