Kinect插件使用
Kinect Scripts文件夹下所有managers(管理器)的用途:
这些在KinectScripts文件夹下的管理器都是组件,你可以根据你想实现的功能在项目中使用它。
KinectManager 是最通用的组件,需要它与传感器交互以获取底层数据,譬如彩色数据流和深度数据流,以及身体和关节在Kinect空间中的位置(单位:米)。
AvatarController的目的是将检测到的关节位置和旋转传递到一个可操纵骨骼上。
CubemanController效果同上,但是它通过transforms 和线来展现关节和骨骼,以便于定位人体追踪问题;
FacetrackingManager(脸部追踪)用于处理脸部点阵和头/脖子旋转。如果与此同时KinectManager存在且可用的情况下, 它将被KinectManager 内部调用来获得头和脖子更精准的位置和旋转。
InteractionManager(交互) 用于控制手型光标,同时检测手部的抓取、释放以及点击.
最后呢SpeechManager用于识别声控(语言识别控制)。
示例文件夹包含了许多简单的示例(一些将在下文提及),你可以参考学习、直接使用或者拷贝部分代码到你的脚本中。
如何将Kinect v2-Package 功能模块用在你自己的Unity 工程里面:
- 将 ‘KinectScripts’文件夹从插件包的Assets文件夹拷贝到你工程的 Assets文件夹下.该文件夹包含了 脚本,接口和过滤器(filters )。
- 将 ‘Resources’文件夹从插件包的Assets文件夹拷贝到你工程的 Assets文件夹下。这个文件夹包含了所有需要的库和资源,你可以不必拷贝那些你不打算用到的库(譬如64位库和Kinect-v1的库)来节省空间。
- 将 ‘Standard Assets’文件夹从插件包的Assets文件夹拷贝到你工程的 Assets文件夹下。它包含Kinect v2的MS包装类,等到Unity检测并编译新复制的资源和脚本。
- 将KinectManager.cs脚本作为组件添加到主相机或者其他已存在与游戏场景中的游戏对象上。作为与底层传感器交互获取底层数据的通用组件,它真的很重要。
- 使用其他你想加入到项目中的Kinect相关组件,所有这些组件均内部依赖于 KinectManager 。
如何将 AvatarController脚本用于你自己的模型上:
- 确认你的模型处于T-pose(可选),这是Kincet关节方向的归零姿势。
- 在Assets文件下选中该模型资源,在inspector面板上选中“Rig”标签。
- 将AnimationType设置成 ‘Humanoid’,将AvatarDefinition设置成 ‘Create from this model’。
- 点击Apply按钮。然后点击Configure按钮来确认关节被正确的指定了,完成以上步骤我们退出配置窗口。
- 将模型放置到游戏场景中。
- 将KinectScript文件夹下的AvatarController脚本作为组件添加到游戏场景中的模型游戏对象中。
- 确保你的模型上还挂有Animator组件,必须是激活且它的Avatar合理设置.
- 如有需要,可以启用或者禁用AvatarController组件上的MirroredMovement(镜像移动)和VerticalMovement(垂直方向移动) 设置项。记住:如果镜像运动被启用 ,模型的Y方向将旋转180°。
- 运行场景测试Avatar模型。如果需要,调整AvatarController的某些设置,然后重试
。
如何让Avatar的手绕着骨骼运动:
要做到这一点,你需要将KinectManager的“Allowed Hand Rotations”设置为“All”。KinectManager是示例场景中MainCamera的组件。
此设置有三个选项:
- None - 关闭所有手的旋转,
- Default - 启用手的旋转,除了骨头周围的扭曲,
- All- 将所有手的旋转开启
如何利用Kinect 与GUI 按键和组件进行交互:
- 将InteractionManager添加到主摄像头或场景中的其他一直会存在的对象上。它用于控制手形光标并检测手的握拳,释放和点击。握拳即手掌拽紧拇指在其他手指之上,释放 - 将手打开,当用户的手不移动(静止不动)约2秒钟时,会产生点击。
- 启用InteractionManager组件的“Control
Mouse Cursor”设置。该设置将手形光标的位置和点击传输到鼠标光标,这样就可以与GUI按钮,Toggles和其他组件进行交互。 - 如果需要使用拖放功能与GUI进行交互,请启用InteractionManager组件的“Control Mouse Drag”设置。一旦它检测到握拳并且拖动直到手释放的过程,以开始拖动功能。如果您启用此设置,您也可以以握拳姿势点击GUI按钮,而不是普通的的手点击(即保持原位,在按钮上方约2秒钟)。
如何获得depth(深度)或color(彩色)相机textures(纹理):
首先,如果需要深度纹理,确保KinectManager组件的Compute User Map设置被启用即可,如果您需要彩色相机纹理,则KinectManager的Compute Color Map设置启用。
然后在你的脚本的Update()方法中写上如下内容:
KinectManager manager = KinectManager.Instance;
if(manager && manager.IsInitialized())
{
Texture2D depthTexture = manager.GetUsersLblTex();
Texture2D colorTexture = manager.GetUsersClrTex();
// do something with the textures
}
如何获得身体关节的位置:
这个示例在KinectScripts / Samples / GetJointPositionDemo(脚本)。 您可以将其作为组件添加到场景中的游戏对象,以便在运行时看效果。 只需选择需要的关节并可选是否保存到csv文件。 不要忘记将KinectManager作为组件添加到场景中的游戏对象。 它通常挂载在示例场景中MainCamera上。 这是演示脚本的主要部分,用于检索选定关节的位置:
KinectInterop.JointType joint =KinectInterop.JointType.HandRight;
KinectManager manager = KinectManager.Instance;
if(manager && manager.IsInitialized())
{
if(manager.IsUserDetected())
{
long userId = manager.GetPrimaryUserID();
if(manager.IsJointTracked(userId, (int)joint))
{
Vector3 jointPos = manager.GetJointPosition(userId, (int)joint);
// do something with the joint position
}
}
}
如何让游戏对象跟随用户的旋转:
这与前面的示例类似,在KinectScripts / Samples / FollowUserRotation(脚本)中演示。 要在实际中看到它,可以在场景中创建一个Cube,并将该脚本作为组件挂载其上。不要忘记将KinectManager作为组件添加到场景中的游戏对象。 它通常是示例场景中MainCamera的组件。
如何让游戏对象跟随头部位置和旋转呢?
您需要将KinectManager和FacetrackingManager作为组件添加到场景中的游戏对象。
例如,它们是KinectAvatarsDemo场景中MainCamera的组件。
然后,为了获得头部的位置和脖子的方向,在脚本中需要这样的代码:
KinectManager manager = KinectManager.Instance;
if(manager && manager.IsInitialized())
{
if(manager.IsUserDetected())
{
long userId = manager.GetPrimaryUserID();
if(manager.IsJointTracked(userId, (int)KinectInterop.JointType.Head))
{
Vector3 headPosition = manager.GetJointPosition(userId, (int)KinectInterop.JointType.Head);
Quaternion neckRotation = manager.GetJointOrientation(userId, (int)KinectInterop.JointType.Neck);
// do something with the head position and neck orientation
}
}
}
如何获得面部标志点的坐标?
您需要拿到各个FaceFrameResult对象的引用。
演示:KinectScripts / Samples / GetFacePointsDemo(脚本)。
您可以将其作为组件添加到场景中的游戏对象,以便查看运行中的效果。在脚本中调用其公共方法:GetFacePoint()获取面部标志点坐标。
不要忘记将KinectManager和FacetrackingManager作为组件添加到场景中的游戏对象。
一般来说,它们是KinectAvatarsDemo场景中MainCamera的一个组件。
如何将Kinect捕捉的运动与Mecanim动画混合
- 使用AvatarControllerClassic代替AvatarController组件。仅仅指定那些需要被传感器动画捕捉的关节。
- 将AvatarControllerClassic的SmoothFactor设置为0,以便立即应用被检测到骨骼的各个朝向。
- 为Mecanim动画层创建一个 (avatar-body-mask )阿凡达身体遮罩并应用,在这个遮罩里面,将上述提到的Kinect动画捕捉关节点的Mecanim动画设置为禁用。但别禁用根节点。
- 将KinectManager(一般位于示例场景的主相机上)组件的Late Update Avatars设为可用。
- 运行场景确认上述设置,当一个玩家被传感器检测到时,他的部分关节会被AvatarControllerClassic组件捕捉动画,其他部分 - 由Animator组件负责。
如何将你的模型添加到 FittingRoom-demo
- 每一个模型,导入它们并在Unity编辑器Assets视窗选中。
- 选中Rig选项卡,将AnimationType设置为:‘Humanoid’ ,并且将AvatarDefinition改为‘Create from this model’(基于此模型创建)。
- 点击应用(Apply)按钮,然后点击Configure按钮来确认所有需要的关节点都被正确的分配。衣服模型一般不能使用所有的关节点,因为它会导致阿凡达定义无效。这种情况下你可以通过手动分配丢失的关节点(显示为红色)
- 记住:这些关节在这个模型中位置必须与Kinect关节的结构相匹配。在示例KinectOverlayDemo2中有涉及,否则模型可能不会完全的覆盖用户的身体。
- 在FittingRoomDemo的Resources文件夹下一个个子文件夹来为你的模型分类(Shirts, Pants, Skirts等等)。
- 在模型分类文件夹,为第一步所有导入的模型继续创建文件名为数字且连续的文件夹形如:0000,0001,0002,
- 将你的模型移入这些数字标记的文件夹,每个文件夹一个模型。他们的贴图及材质球需要被一并移入。然后将这个Fbx文件重命名为‘model.fbx’.
- 你可以在各自的文件夹下放入每个模型的jpg格式(100 x 143px, 24bpp)的预览图,并将其重命名为 ‘preview.jpg.bytes’,如果你没有放入预览图,FittingRoom示例的模型选择菜单将显示‘No preview’(无预览).
- 打开FittingRoomDemo1场景。
- 为你的分类模型添加ModelSelector到KinectController游戏对象,将Model category与上面第5页中创建的子文件夹的名称相同。将Number of models设置与第6步中创建的子文件夹数值一一对应。
- ModelSelector的其他设置必须与Demo中存在的ModelSelector一致。比如:
‘Model relative to camera’ 必须设置成‘BackgroundCamera’,
‘Foreground camera’必须设置为:‘MainCamera’,
‘Continuous scaling’ – enabled.
scale-factor (缩放因子)尽量设置为原来的1 并且'Vertical offset(垂直偏移量)’-设为:0.
稍后,你可以对他们进行微调以便更好地实现模型到身体的覆盖。 - 如果你想选中的模型在模型类别变更后持续的覆盖用户的身体,请将ModelSelector组件的Keep selected model设置启用,如果有几个类别(即ModelSelectors),例如用于衬衫,裤子,裙子的实例等等。在这种情况下,当类别改变并且用户开始选择裤子时实例时,选择的衬衫模型仍然覆盖用户的身体。
- CategorySelector组件为改变模型和类别提供手势控制,并负责为同一用户切换模型类别(例如衬衫,裤子,领带等)。第一个用户已经存在一个CategorySelector(玩家索引为:0),你无需添加。
- 如果你计划做多人 fitting-room(换衣间),为每一个新增的用户添加一个CategorySelector组件。也可能需要为这些用户将使用的模型类别添加相应的ModelSelector组件。
- 运行场景,确保你的模型能在列表被选中且正确的覆盖用户身体。找到实现模型到身体完美覆盖的缩放因子和垂直偏移,可能需要些许调试。
- 如果要关闭场景中的光标交互,请禁用KinectController游戏对象的InteractionManager组件。
如果您想关闭手势(滑动切换模型,抬手改变类别),请禁用CategorySelector组件的相应设置。
如果您想关闭或更改T-Pose姿态校准,请更改KinectManager组件的“玩家校准姿态”(Player calibration pose)设置。 - 最后但并非最不重要:您可以使用FittingRoomDemo2场景来利用或试验单个叠加模型。 如果需要,调整AvatarScaler的比例因子设置以精确调整模型的全身,手臂或腿骨的比例。 如果您希望模型在每个Update中被重新缩放,请启用“连续缩放”(Continuous Scaling)设置。
UI点击事件的实现
- 获取左手(右手)关节的3D坐标
- 3D坐标转换为屏幕坐标
- 屏幕坐标转换UGUI坐标(得到手的位置在UGUI的位置)
- 判断手的位置是否在UGUI控件上
- 手如果在UGUI控件上,判断是否握拳
- 握拳就表示点击了该UGUI了
最后为我微信公众号引个流,欢迎大家关注我的微信公众号,大家一起学习一起进步
Kinect插件使用的更多相关文章
- UE4.5.0的Kinect插件(Plugin)---插件使用说明<二>
声明:所有权利保留. 转载必须说明出处:http://blog.csdn.net/cartzhang/article/details/43563959 一.起因: 写了个UE4的Kinect的插件,结 ...
- UE4.5.0的Kinect插件(Plugin)<一>
声明:所有权利保留. 转载必须说明出处:http://blog.csdn.net/cartzhang/article/details/43193431 UE4 Plugin,在UE4的官网,放出了有个 ...
- Kinect 开发 —— 显示骨骼用户插件
public partial class SkeletonViewer : UserControl { private readonly Brush[] _SkeletonBrushes = new ...
- 使用HTML5开发Kinect体感游戏
一.简介 我们要做的是怎样一款游戏? 在前不久成都TGC2016展会上,我们开发了一款<火影忍者手游>的体感游戏,主要模拟手游章节<九尾袭来 >,用户化身四代,与九尾进行对决, ...
- Unity使用Kinect初级教程
准备 首先,你需要准备的东西 Windows 8以上系统的电脑,当然,配置不要太渣⊙︿⊙ Kinect for Windows开发套件 安装好Kinect for Windows SDK,这个应该属于 ...
- Kinect for Windows SDK开发入门(15):进阶指引 下
Kinect for Windows SDK开发入门(十五):进阶指引 下 上一篇文章介绍了Kinect for Windows SDK进阶开发需要了解的一些内容,包括影像处理Coding4Fun K ...
- Kinect开发笔记之二Kinect for Windows 2.0新功能
这是本博客翻译文档的第一篇文章.笔者已经苦逼的竭尽全力的在翻译了.但无奈英语水平也是非常有限.不正确或者不妥当不准确的地方必定会有,还恳请大家留言或者邮件我以批评指正.我会虚心接受. 谢谢大家. ...
- 关于使用Unity开发Kinect时出现的Runtime Error错误的解决方式
一.开发环境: 1. 硬件:Kinect 2.0 2. 操作系统:Windows10 3. Unity版本:5.x以上 4. Kinect SDK:KinectSDK-v2.0_1409 5. Kin ...
- unity插件各领域王者
移动端手势操作 Easy Touch 获取 缓动 iTween 获取 可视化编程 Playmaker1.9.0 获取 UI NGUI,UGUI 获取 Shader着色器可视化编程 AmplifySha ...
随机推荐
- 在winform下实现左右布局多窗口界面的方法(二)
这篇文章主要介绍了在winform下实现左右布局多窗口界面的方法之续篇 的相关资料,需要的朋友可以参考下 在上篇文章在winform下实现左右布局多窗口界面的方法(一)已经实现了左右布局多窗口界面,今 ...
- [调试日志]用php函数var_export把多维数组file_put_contents写入并打印到日志,以方便调试之多维数组,用php5中的var_export函数示例,顺带介绍http_build_query(转)
一行解决写入日志: file_put_contents("/tmp/jack.txt", var_export($layReturnArr,TRUE),FILE_APPEND); ...
- 洛谷【P2024】[NOI2001]食物链
浅谈并查集:https://www.cnblogs.com/AKMer/p/10360090.html 题目传送门:https://www.luogu.org/problemnew/show/P202 ...
- MySQL自带的性能压力测试工具mysqlslap详解
使用语法如下:# mysqlslap [options] 常用参数 [options] 详细说明: --auto-generate-sql, -a 自动生成测试表和数据,表示用mysqlslap工具自 ...
- 在ARM模式下捕获VM并创建新VM
在ASM模式下,可以通过Manage Portal上捕获VM的Image,并创建新的VM.在ARM模式下,在Portal上目前还没有这个功能,要做VM镜像的捕获和创建新的VM需要用powershell ...
- Java-API:java.text.SimpleDateFormat
ylbtech-Java-API:java.text.SimpleDateFormat 1.返回顶部 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶部 0. https://do ...
- Oracle 内存结构
内存结构 Oracle内存,进程与数据库的图 sga:系统全局区,用来存放操作的数据,库缓存,数据字典等控制信息的内存区域, pga:进程全局区,服务进程专用的内存区域,大多数内容非共享 uga:用 ...
- jdk中那些常见的类不能被继承的
对于java中的类,如果是使用final修饰的话,那么这个类就不能够被继承,因为jdk的开发者认为,有一些最基本的类没要必要对开发者开放,如果用户 继承时操作有误,很可能引入很多问题.为了防止用户对基 ...
- TP-Link WR703N OpenWRT固件修改WAN LAN排序
有一种方法就是macvlan了.添加到rc.local文件中,具体不再阐述. 此方法只适合编译固件的情况下调整WAN/LAN顺序. wr703n等(包含其他未列出的单网口路由,AP),修改WAN LA ...
- Java中弱引用、软引用、虚引用及强引用的区别
Java中弱引用VS软引用 Java中有如下四种类型的引用: 强引用(Strong Reference) 弱引用(WeakReference) 软引用(SoftReference) 虚引用(Phant ...