对象操纵器 - MRTK2

Object manipulator

ObjectManipulator 是操控行为的新组件,以前可以在 ManipulationHandler 中找到。 对象操控器经过大量的改进和简化。 此组件可以取代即将被弃用的操控处理程序。

使用 ObjectManipulator 脚本可以通过单手或双手来移动、缩放和旋转对象。 可以配置对象操控器来控制对象响应各种输入的方式。 该脚本适用于大多数交互形式,例如 HoloLens 2 关节手、HoloLens 2 手部射线、HoloLens 1 凝视和手势,以及沉浸式头戴显示设备运动控制器输入。

如何使用对象操控器

若要使用对象操控器,请先将 ObjectManipulator 脚本组件添加到 GameObject。 另外,确保向对象添加一个与其可抓取边界匹配的碰撞体。

为使对象能够响应近距关节手输入,还需要添加 NearInteractionGrabbable 脚本。

将刚体组件添加到对象可为对象操控器启用物理学行为。 物理学和碰撞中更详细地介绍了如何通过添加此组件来启用物理行为。

除此之外,还可以通过向对象添加操控约束组件来约束操控。 这些特殊组件用于处理操控并以某种方式改变操控行为。

Using the Manipulation Handler in the Unity editor

检查器属性和字段

Object Manipulator Structure

常规属性

宿主变换

要操控的对象变换。 默认为组件的对象。

操控类型

指定是否可以使用单手或双手操控对象。 由于此属性是一个标志,因此可以同时选择这两个选项。

  • 单手:如果选中,则启用单手操控。
  • 双手:如果选中,则启用双手操控。

允许远距操控

指定是否可以使用远距交互通过指针进行操控。

单手操控属性

近距单手旋转模式

指定用一只手近距抓取对象时对象的行为方式。 这些选项仅适用于关节手。

  • 围绕对象中心旋转:通过手部旋转来旋转对象,不过是围绕对象中心点旋转。 对象在旋转时似乎移动距离较短,但手部与对象之间可能存在一种断开的感觉。 更适用于远距交互。
  • 围绕抓取点旋转:用手围绕拇指与食指之间的抓取点旋转对象。 感觉像是对象被手握住了一样。

远距单手旋转模式

指定用一只手远距抓取对象时对象的行为方式。 这些选项仅适用于关节手。

  • 围绕对象中心旋转:通过手部旋转来旋转对象,不过是围绕对象中心点旋转。 可用于在对象旋转但对象中心不移动的情况下进行远距离检查。
  • 围绕抓取点旋转:通过手部旋转来旋转对象,不过是围绕指针射线击中点旋转。 可用于检查。

双手操控属性

双手操控类型

指定双手操控如何变换对象。 由于此属性是一个标志,因此可以选择任意数目的选项。

  • 移动:如果选中,则允许移动。
  • 缩放:如果选中,则允许缩放。
  • 旋转:如果选中,则允许旋转。

Manipulation Handler

约束

启用约束

此设置将启用链接的约束管理器。 转换变化将由注册到所选约束管理器的约束来处理。

约束管理器

在下拉菜单中可以选择任何附加的约束管理器。 对象操控器确保始终会附加一个约束管理器。 请注意,同一类型的多个组件将统一以相同的名称显示。 为了更容易区分同一对象上的多个约束管理器,可用选项将显示有关所选约束管理器的配置的提示(手动或自动约束选项)。

转到组件

约束管理器选项带有一个“转到组件”按钮。 按下此按钮会将检查器滚动到所选组件,以便对其进行配置。

物理

此部分中的设置仅在对象具有 RigidBody 组件时才出现。

释放行为

指定被操控对象在释放时应保留的物理属性。 由于此属性是一个标志,因此可以同时选择这两个选项。

  • 保持速度:如果选择此选项,在释放对象时,它将保持其线速度。
  • 保持角速度:如果选择此选项,在释放对象时,它将保持其角速度。

使用力量进行近距操控

执行近距操控时是否使用物理力来移动对象。 将此项设置为 false 会产生一种对象更直接地与用户手部相连的感觉。 将此项设置为 true 会遵守对象的质量和惯性定律,但可能会产生一种对象是通过弹簧连接的感觉。 默认值为 false

平滑处理

远距平滑化

是否为远距交互启用不依赖于帧速率的平滑化。 默认启用远距平滑化。

近距平滑化

是否为近距交互启用不依赖于帧速率的平滑化。 默认禁用近距平滑化,因为这种效果可能会造成与手部“断开连接”的感觉。

平滑化已激活

此选项已过时,在将来的版本中会被删除。 应用程序应使用 SmoothingFar、SmoothingNear 或两者的组合。

移动 lerp 时间

应用于运动的平滑化量。 平滑化量为 0 表示不平滑化。 最大值表示不更改值。

旋转 lerp 时间

应用于旋转的平滑化量。 平滑化量为 0 表示不平滑化。 最大值表示不更改值。

缩放 lerp 时间

应用于缩放的平滑化量。 平滑化量为 0 表示不平滑化。 最大值表示不更改值。

操作事件

操控处理程序提供以下事件:

  • OnManipulationStarted:在操控开始时触发。
  • OnManipulationEnded:在操控结束时触发。
  • OnHoverStarted:当手部/控制器悬停在近距或远距可操控对象上时触发。
  • OnHoverEnded:当手部/控制器未悬停在近距或远距可操控对象上时触发。

操控的事件触发顺序是:

OnHoverStarted ->OnManipulationStarted ->OnManipulationEnded ->OnHoverEnded

如果没有操控,你仍会按以下触发顺序收到悬停事件:

OnHoverStarted ->OnHoverEnded

物理学和碰撞

将刚体组件添加到对象操控器所针对的对象可以启用物理学行为。 这不仅可以启用上述释放行为的配置,还可以启用碰撞。 如果没有刚体组件,在操控期间将无法正常碰撞:

  • 被操控对象与静态碰撞体之间的碰撞(即,对象有碰撞体但没有刚体)不起作用,被操控对象将不受影响地直接穿过静态碰撞体。
  • 被操控对象与刚体之间的碰撞(即,对象有碰撞体和刚体)会导致刚体做出碰撞反应,但这种反应是跳跃性的且不自然。 被操控对象也没有碰撞反应。

添加刚体后,应该可以正常碰撞。

无刚体

No Rigid Body

有刚体

Rigid Body

弹性(试验)

通过对象操控器操控对象时,可以使用弹性。 请注意,弹性系统仍处于试验状态。 若要启用弹性,要么链接一个现有的弹性管理器组件,要么通过 Add Elastics Manager 按钮创建并链接一个新的弹性管理器。

Bounds Control Elastics

请参阅