在 Unity 中使用 Intel RealSense SDK 2014 的技巧和窍门





0/5 (0投票)
本博客旨在为使用Unity和Intel RealSense SDK 2014的开发者提供信息、建议和链接。
Intel®Developer Zone 提供跨平台应用开发工具和操作指南,平台和技术信息,代码示例,以及同行专业知识,帮助开发者创新和取得成功。加入我们的社区,了解物联网,Android*,Intel® RealSense™ 技术和Windows*,下载工具,获取开发套件,与志同道合的开发者分享想法,并参与黑客马拉松、竞赛、巡展和本地活动。
关于Unity版本的重要说明
- Unity 4.x是32位系统。您可以使用Unity Pro或免费版的Unity,只要您使用Intel RealSense SDK R2版本(v4.)中的签名库。
- Unity 5是64位系统。您必须将64位库(libpxccpp2c.dll 和 libpxccpp2c.dll.signtaure)复制到您的项目中。
可能有帮助的文档。
- Intel提供:RSSDK Unity Toolkit指南安装在C:\Program Files (x86)\Intel\RSSDK\doc\PDF\sdktoolkit.pdf
- Unity入门指南
- 面部追踪教程包括面部位置、姿态、地标和表情检测,面部识别,警报和代码示例
- 手部/关节/斑点追踪教程涵盖手势、手部和关节追踪、斑点和轮廓提取、数据平滑和代码示例
- 原始流捕获教程:使用代码示例捕获和渲染彩色和深度流
- 非官方 - Intel开发者Amit M制作了Unity Toolkit演示和RS/Unity RFB深度对齐视频
- Marty G(来自Sambiglyon)分享了以下指南
- 在Unity中设置SDK文件和在“Inspector”面板中编程对象以响应摄像头输入。
- 将PXC脚本转换为Unity脚本文件使用
- 使用Unity内置的“Input Manager”通过物理控制器原型化RealSense项目控件。
- 简单的手部追踪/物体移动指南。
需要注意的是,可以在不使用Unity Toolkit的情况下使用Unity DLL。如果您发布问题或遇到问题,请区分这两种情况。
一些最低要求:
- 仅支持Gold R1,且仅支持Windows 8.1。唯一支持的摄像头是Creative RealSense F200用户朝向摄像头,该摄像头必须连接到真正的(蓝色)USB 3.0直连端口(非集线器)。
- 需要使用Unity Pro,因为免费版的Unity不支持C++插件。可能存在解决此问题的方法,但Intel不予认可。即使是比赛的一部分,Intel也不会提供任何Pro许可证。但请注意,RSSDK 2014可以使用C#,并且附带了许多用于将摄像头与Unity接口的预构建“扩展”。(感谢Marty!)
- 注意:Gold R1是针对Unity Pro 4.1编译的,并且在v4.5上进行了测试。未在4.6 Beta版本上进行验证。
现在是一些技巧/窍门:
- 全屏:让应用程序在窗口模式/非窗口模式下进入全屏,无论显示分辨率如何。
- 请注意,Intel建议的最低分辨率为1368x768
- 编译前,在Player Settings中,请确保选中“Use Direct3D 11”框。
- 如果Player Settings中只有D3D9可用,请取消选中“Default is Native Resolution”或“Default is Full Screen”,并将默认屏幕宽度和高度设置为1368x768
- 设置为仅使用特定的宽高比:16:9和16:10
- 结果:基于“Resolution Selection Screen”上的“Windowed”复选框设置
- 如果选中,应用程序将以窗口模式启动,但可以调整大小/最大化
- 如果未选中,应用程序将始终以全屏模式启动。
- 请注意,您可以检查分辨率//限制屏幕分辨率,例如
if ( Screen.currentResolution.width > 1366 || Screen.currentResolution.height > 768 ) Screen.SetResolution(1366, 768, true);
-
性能:
-
Unity
Update()
函数中的AcquireFrame首选设置为(false,0)
,以避免影响性能。(在Unity中,这是一个阻塞调用,它将帧率锁定到RS,并用于等待直到任何帧数据可用)
if (sm.AcquireFrame (false) != pxceStatus.PXCM_STATUS_NO_ERROR)
-
虽然双手追踪可能在同一个线程中,但建议为面部和语音或任何多模态使用创建单独的线程。
-
- Unity中的平滑处理:与SDK中一样,有4种平滑处理类型可用。以下是它们在Unity中使用的建议。前两种最受推荐。
- Spring(弹簧):基于时间,但对平滑数据有线性影响(Marty建议平滑因子=1,并使用
TrackingAction
脚本。 - Quadratic(二次):基于时间的平滑处理,可作为稳定器和更平滑的工具。
- Weighted(加权):允许根据任何一组权重(高斯、均匀等)对数据进行平均。对处理手部效果很好。
- Stabilize smoothing(稳定平滑):有利于用户体验,因为它会保持现有位置,直到检测到大的移动
- Spring(弹簧):基于时间,但对平滑数据有线性影响(Marty建议平滑因子=1,并使用
- Unity中的语音/语音识别。Unity可以处理命令和语音转文本(可以使用框架文件夹中的C#包装器示例)。语音合成可能可以通过相同的方式实现(使用C#中的示例)。
- 3D分割 - 胡须。目前,长胡须可能会导致检测速度非常慢,因为胡须会吸收大量红外线,并可能使头部与身体分离,从而混淆检测。该问题正在处理中。
- 面部识别注册。
- 在Gold R1中,2D面部识别仅使用ID#100。
- Gold在Beta版本后进行了更改,现在等待10个连续帧才确认识别(不可设置,因为用于减少误报)。
-
手部追踪(如果超出视场):使用Unity Toolkit中的“HandLost”规则。(RSUnityToolkit/Internals/Rules)。检查检测到的手部数量(
SenseToolkitManager.Instance.HandDataOutput.QueryNumberOfHands()
) -
如果您在使用
UnityEngine.Texture2D PXCMImage.ImageData.ToTexture2D(Int32 plane, Int32 width, Int32 height))
时遇到问题,
请使用指定Texture2D
作为参数的ToTexture2D
。 -
来自Marty G:如果您发现您的物体移动不平稳、不可预测,或者从它们所附加的子对象上撕裂开,请在特定TrackingAction脚本的Inspector面板设置中,将所有“Virtual World Box”和“Real World Box”值设置为零。
-
来自Marty G:如果您希望Unity在
MovingObject
以外的对象中运行脚本,请编辑TriggerObject
中的脚本,在脚本开头(Start()
、Update()
等)指定该对象名称、脚本名称和函数类型。有关更多信息,请参阅此论坛帖子。
期待听到其他技巧和窍门!将尽力每周更新!