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()方法中写上如下内容:
1 KinectManager manager = KinectManager.Instance; 2 if(manager && manager.IsInitialized()) 3 { 4 Texture2D depthTexture = manager.GetUsersLblTex(); 5 Texture2D colorTexture = manager.GetUsersClrTex(); 6 // do something with the textures 7 }
如何获得身体关节的位置:
这个示例在KinectScripts / Samples / GetJointPositionDemo(脚本)。 您可以将其作为组件添加到场景中的游戏对象,以便在运行时看效果。 只需选择需要的关节并可选是否保存到csv文件。 不要忘记将KinectManager作为组件添加到场景中的游戏对象。 它通常挂载在示例场景中MainCamera上。 这是演示脚本的主要部分,用于检索选定关节的位置:
1 KinectInterop.JointType joint =KinectInterop.JointType.HandRight; 2 KinectManager manager = KinectManager.Instance; 3 if(manager && manager.IsInitialized()) 4 { 5 if(manager.IsUserDetected()) 6 { 7 long userId = manager.GetPrimaryUserID(); 8 if(manager.IsJointTracked(userId, (int)joint)) 9 { 10 Vector3 jointPos = manager.GetJointPosition(userId, (int)joint); 11 // do something with the joint position 12 } 13 } 14 }
如何让游戏对象跟随用户的旋转:
这与前面的示例类似,在KinectScripts / Samples / FollowUserRotation(脚本)中演示。 要在实际中看到它,可以在场景中创建一个Cube,并将该脚本作为组件挂载其上。不要忘记将KinectManager作为组件添加到场景中的游戏对象。 它通常是示例场景中MainCamera的组件。
如何让游戏对象跟随头部位置和旋转呢?
您需要将KinectManager和FacetrackingManager作为组件添加到场景中的游戏对象。
例如,它们是KinectAvatarsDemo场景中MainCamera的组件。
然后,为了获得头部的位置和脖子的方向,在脚本中需要这样的代码:
1 KinectManager manager = KinectManager.Instance; 2 if(manager && manager.IsInitialized()) 3 { 4 if(manager.IsUserDetected()) 5 { 6 long userId = manager.GetPrimaryUserID(); 7 if(manager.IsJointTracked(userId, (int)KinectInterop.JointType.Head)) 8 { 9 Vector3 headPosition = manager.GetJointPosition(userId, (int)KinectInterop.JointType.Head); 10 Quaternion neckRotation = manager.GetJointOrientation(userId, (int)KinectInterop.JointType.Neck); 11 // do something with the head position and neck orientation 12 } 13 } 14 }
如何获得面部标志点的坐标?
您需要拿到各个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了