手部指导 - MRTK2

手部指导菜单

手部指导是 3D 建模的手部,当系统未检测到用户的手时触发。 这是作为一个“教学”组件实现的,可帮助在未教手势时指导用户。 如果用户在一段时间内未执行指定的手势,则手部将延迟循环。 手部指导可用于表示按下按钮或拾取全息影像。

当前交互模型表示各种手势控件,例如滚动、远距离选择和靠近点击。 下面是现有手部指导示例的完整列表:

  • 近距点击 - 用于按钮或近距离可交互对象
  • 远距选择 - 用于远离的对象
  • 移动 - 用于在空间中移动全息影像
  • 旋转 - 用于显示如何旋转全息影像或对象
  • 缩放 - 用于演示如何作全息影像以放大或缩小全息影像
  • 手翻转 - 用于打开 UI 启动面板或手部菜单
  • 掌上 - 用于蜂鸟时刻的开箱即用体验。 另一个建议可能是打开 UI 启动面板
  • 滚动 - 用于滚动列表或长文档

示例场景

可以在 HandCoachExample 场景中找到示例: MixedRealityToolkit.Examples/Experimental/HandCoach/Scenes

手部 3D 资产

可以在以下位置找到资产: MixedRealityToolkit.SDK/Experimental/HandCoach

质量

如果注意到皮肤网格的扭曲,则需要确保项目使用适当数量的关节。 转到Unity的编辑>项目设置>质量>其他>混合权重。 确保选择“4 个骨头”以查看平滑关节。 项目设置

脚本

交互提示

InteractionHint.cs 脚本提供包装器功能,用于触发手部装备的动画和淡出。

如何设置交互提示

若要设置交互提示,建议使用提供的 prefab“StaticHandCoachRoot_L.prefab”和“StaticHandCoachRoot_R.prefab”。 此预制件包含 InteractionHint 脚本和手部装备以及适当的层次结构,以确保提供的提示动画按预期工作。 否则,你需要将脚本放在游戏对象一个父级上,从手部装备与动画器。

检查器属性

  • HideIfHandTracked 此布尔值指定在跟踪用户的手部时是否应使用手部跟踪状态来隐藏视觉对象。 如果此值设置为 false,则仅使用脚本属性“customShouldHideVisuals”确定是否隐藏提示。

  • MinDelay 此属性指定显示视觉对象的最小延迟。 默认情况下,如果未跟踪用户的手部,手部的视觉对象将在几秒钟后显示。

  • MaxDelay 此属性指定显示视觉对象的最大延迟。 默认情况下,即使正在跟踪用户的手部,手部的视觉对象也会在此秒后显示。

  • UseMaxTimer 如果此布尔值设置为 false,则会禁用最大计时器,并且仅允许在用户手不视野或自定义条件返回 false 时显示手部提示。

  • 重复 此属性控制在通过最小或最大计时器时提示动画播放的次数。 然后,提示会隐藏并再次等待延迟。

  • 自动激活 当此布尔值设置为 true 时,当脚本的 GameObject 在层次结构中处于活动状态并启用脚本时,提示将自动通过计时器逻辑运行。 如果打算通过代码手动控制提示的外观和消失,则仅应将其设置为 false。

  • AnimationState 提示处于活动状态时应播放的动画状态的名称。 如果) 自动激活,则必须在 OnEnable 期间调用 StartHintLoop () 函数 (之前进行设置。

通过脚本控制 InteractionHint

  • StartHintLoop 如果 AutoActivate 标志设置为 true,则此函数将启动 OnEnable 的 show/hide 循环。
  • StopHintLoop 如果当前未播放,此函数将调用淡出动画状态,然后会停用 show/hide 循环,并将手部装备设置为在层次结构中处于非活动状态。
  • AnimationState 此字符串确定循环期间播放的动画状态。 可以更改此字符串以更改播放的状态,但必须在调用 StopHintLoop 后执行此作,并且必须在更改状态后再次调用 StartHintLoop。
  • CustomShouldHideVisuals 可以使用自己的函数进行设置,在想要隐藏手部视觉对象时,该函数应返回 true, (记住 MinMaxTimer,特别是 max 参数)

自定义动画注意事项

淡化默认为 0.5 秒,因此为与钻机一起使用而创建的任何自定义动画至少应为 1.5 秒,以便传达任何有意义的信息

提供的默认淡入和淡出状态、Fade_In和Fade_Out可以通过更改第二个关键帧的时间戳来设置淡出长度来进行调整。

动画器和脚本的设置方式应使设置尽可能简单。 若要添加新的动画状态,只需导入 fbx,确保动画名称设置为不同的名称,然后将该动画拖动到动画器中。

MoveToTarget

MoveToTarget.cs脚本提供随时间推移将手部提示从跟踪位置移动到目标位置的功能。

如何设置 MoveToTarget

提供的预制件“MovingHandCoachRoot_L.prefab”和“MovingHandCoachRoot_R.prefab”在其层次结构中包含 MoveToTarget。 如果要在自己的设置中使用此脚本,则需要将其放置在包含 Rig 的 Animator 的根游戏对象上。

检查器属性

  • TrackingObject 使用你希望钻机在开始运动之前遵循的对象来设置此值。 建议创建一个空的 GameObject 并将其移动到特定位置,以帮助你精确定位跟踪。
  • TargetObject 使用你希望钻机在运动过程中移动到的对象来设置此值。 建议创建一个空的 GameObject 并将其移动到特定位置,以帮助你精确定位跟踪。
  • RootObject 将此设置为跟踪对象和目标对象之间的共享父级,以便可以正确计算相对位置。 包含的 prefab 在其层次结构中同时具有跟踪对象和目标对象,但你可以将目标对象设置为 prefab 外部的 gameObject,并将根对象更改为共享父对象。
  • 期间) 从 TrackingObject 移动到 TargetObject (所需的时间(以秒为单位)。
  • TargetOffset 一个可调偏移量,用于使 GameObject 到达正确的目标位置。 如果动画在动画期间包含位置偏移量,这将很有用。
  • AnimationCurve 默认为线性曲线,但可以更改曲线,以在开始和停止运动路径时提供进/出缓和。

通过脚本控制 MoveToTarget

在自定义脚本中,调用“跟踪 () 同时希望手部装备遵循 TrackingObject,然后在希望手钻机开始对 TargetObject 的动作时调用 MoveToTargetPosition () 。

通过动画控制 MoveToTarget

在需要移动的动画中,设置两个事件:一个事件调用“关注 () ”,一个事件调用 MoveToTargetPosition () 。 应在第一个关键帧上设置 Follow,因为它会导致手钻跟随 TrackingObject。 应在希望钻机开始移动到目标的关键帧上设置 MoveToTargetPosition。 这就是在提供的预制件中使用脚本功能的方式。

RotateAroundPoint

RotateAroundPoint.cs脚本提供随时间推移围绕透视点旋转手部提示的功能。

如何设置 RotateAroundPoint

提供的预制件“RotatingHandCoachRoot_L.prefab”和“RotatingHandCoachRoot_R.prefab”在其层次结构中包含 RotateAroundPoint。 如果要在自己的设置中使用此脚本,则需要将其放置在包含 Rig 的 Animator 的根游戏对象上。

检查器属性

  • CenteredParent 使用希望钻机旋转的父对象来设置此值。
  • InverseParent 使用父级设置此项以将旋转反转为 centeredParent,以便保持手部方向相同。 通常,这将是带有 InteractionHint 脚本的父对象。
  • PivotPosition 将此设置为希望提示开始移动的点。
  • 期间 围绕 CenteredParent 旋转) (所花费的时间(以秒为单位)。
  • AnimationCurve 默认为线性曲线,但可以更改曲线,以在开始和停止运动路径时提供进/出缓和。
  • RotationVector 要沿每个轴旋转多少度。

通过脚本控制 RotateAroundPoint

在自定义脚本中,当希望手部设备围绕 CenteredParent 开始旋转时,调用 RotateToTarget () 。 如果希望位置重置为原始 PivotPosition,请调用 ResetAndDeterminePivot () 。

通过动画控制 RotateAroundPoint

在需要移动的动画中,设置两个事件:一个事件调用 ResetAndDeterminePivot () ,一个事件调用 RotateToTarget () 。 ResetAndDeterminePivot 应在第一个关键帧上设置,因为它会导致手机重置为 PivotPosition。 应在希望钻机开始围绕 CenteredParent 旋转的关键帧上设置 RotateToTarget。 这就是在提供的预制件中使用脚本功能的方式。