约束

使用 ConstraintManager,可以将一组约束组件应用于转换。 默认情况下,约束管理器会自动收集所有附加的约束组件,并将它们应用到目标对象。 但是,用户也可以选择手动配置应用的约束列表,只允许使用附加约束的子集。

注意

MRTK3 目前提供了来自 MRTK 2.x 的有限约束子集。 我们目前正在研究对约束系统进行重构,以使用求解器和弹性统一开发人员工作流。 敬请关注!

目前,以下 MRTK UX 元素支持约束:

约束管理器可在两种模式下运行:

  • 自动约束选择
  • 手动约束选择

约束选择

自动约束选择

Auto Selection mode

默认的“自动”模式将列出所有附加的约束组件。 可以使用“转到组件”按钮直接跳转到检查器中的组件,也可以从下拉列表中添加新约束。

手动约束选择

Manual Selection mode

如果将束管理器设置为手动模式,则仅处理约束列表中链接的约束并将其应用于转换。 首次启用手动模式时,管理器将使用所有当前附加的约束自动填充列表。

注意

“删除条目”操作只会从手动选择列表中删除约束。 该组件仍将出现在 GameObject 上。

执行顺序

每个约束的执行顺序可以在约束本身的“执行顺序”选项中定义。 该顺序将反映在约束管理器中显示的列表中。 当某些约束以不同的顺序组合时,它们的行为会有所不同,因此请记住每个约束的优先级,并相应地调整它们的顺序。

转换约束

可以使用约束以某种方式限制操作。 例如,某些应用程序可能需要旋转,同时要求对象保持垂直。 在这种情况下,可以向对象添加 RotationAxisConstraint,并用于将旋转限制为 y 轴旋转。 MRTK 提供了许多约束,所有这些约束如下所述。

也可以定义新约束,并使用它们创建某些应用程序可能需要的唯一操作行为。 为此,可以创建一个继承自 TransformConstraint 的脚本,并实现抽象的 ConstraintType 属性和抽象的 ApplyConstraint 方法。 新约束应显示在下拉列表中,并且应在添加到对象时自动在约束管理器中注册。

MRTK 提供的所有约束共享以下属性:

Hand Type 指定约束是用于单手操作、双手操作还是同时用于这两种操作。 由于此属性是一个标志,因此可以同时选择这两个选项。

  • 单手:如果选择,约束将在单手操作期间使用。
  • 双手操作:如果选择,约束将在双手操作期间使用。

ProximityType 指定约束是用于近操作、远操作还是同时用于这两种操作。 由于此属性是一个标志,因此可以同时选择这两个选项。

  • 近:如果选择,约束将在近操作期间使用。
  • 远:如果选择,约束将在远操作期间使用。

FaceUserConstraint

此约束限制对象的旋转,以使其始终面向用户。 “人脸离开”选项控制是使用正 Z 轴还是负 Z 轴。

Demonstration of FaceUserConstraint

MinMaxScaleConstraint

此约束限制对象的缩放,这有助于防止用户将对象缩放到无法使用的大小。 它适用于基于句柄的缩放(使用 BoundsControl)和通过双手操作的直接缩放(使用 ObjectManipulator)。 “相对于初始状态”选项定义特定的最小和最大缩放值是否为绝对值,或者它们是否与对象的初始缩放比例相乘。

Demonstration of MinMaxScaleConstraint