1.前言
- 使用 ConstraintManager,可以将一组约束组件应用于转换。 默认情况下,约束管理器会自动收集所有附加的约束组件,并将它们应用到目标对象。 但是,用户也可以选择手动配置应用的约束列表,只允许使用附加约束的子集.
- 目前,以下 MRTK UX 元素支持约束:
- (BoundsControl)边界控制
- (ObjectManipulator )对象操控器
- 约束管理器可在两种模式下运行:
- 自动约束选择
- 手动约束选择
2.约束选择
2.1 自动约束选择
- 默认的“Auto”模式将列出所有附加的约束组件。 可以使用“Go to component”按钮直接跳转到检查器中的组件,也可以从下拉列表中添加新约束。
2.2 手动约束选择
- 如果将束管理器设置为手动模式,则仅处理约束列表中链接的约束并将其应用于转换。 首次启用手动模式时,管理器将使用所有当前附加的约束自动填充列表。
3.执行顺序
- 每个约束的执行顺序可以在约束本身的“执行顺序”选项中定义。 该顺序将反映在约束管理器中显示的列表中。 当某些约束以不同的顺序组合时,它们的行为会有所不同,因此请记住每个约束的优先级,并相应地调整它们的顺序。
4.转换约束
- 可以使用约束以某种方式限制操作。 例如,某些应用程序可能需要旋转,同时要求对象保持垂直。 在这种情况下,可以向对象添加 RotationAxisConstraint,并用于将旋转限制为 y 轴旋转。 MRTK 提供了许多约束,所有这些约束如下所述。
- 也可以定义新约束,并使用它们创建某些应用程序可能需要的唯一操作行为。 为此,可以创建一个继承自 TransformConstraint 的脚本,并实现抽象的 ConstraintType 属性和抽象的 ApplyConstraint 方法。 新约束应显示在下拉列表中,并且应在添加到对象时自动在约束管理器中注册。
- MRTK 提供的所有约束共享以下属性:
- Hand Type 指定约束是用于单手操作、双手操作还是同时用于这两种操作。 由于此属性是一个标志,因此可以同时选择这两个选项:
- (One Handed)单手:如果选择,约束将在单手操作期间使用。
- (Two Handed)双手操作:如果选择,约束将在双手操作期间使用。
- 手ProximityType 指定约束是用于近操作、远操作还是同时用于这两种操作。 由于此属性是一个标志,因此可以同时选择这两个选项:
- (Near)近:如果选择,约束将在近操作期间使用。
- (Far)远:如果选择,约束将在远操作期间使用。
5.约束类型
5.1 FaceUserConstraint
- 此约束限制对象的旋转,以使其始终面向用户。 “Face Away”选项控制是使用正 Z 轴还是负 Z 轴。
5.2 FixedDistanceConstraint
- 此约束固定了操作开始时被操作对象与另一个对象转换之间的距离。 这适用于诸如固定被操作对象与头部转换之间的距离等行为。 Constraint Transform字段默认为相机转换,是操作对象将具有固定距离的另一个转换。
5.3 MaintainApparentSizeConstraint
- 当此约束被附加到对象时,无论对象与用户有多远,它都将保持与用户相同的表面大小(即它将占据用户视野的相同比例)。 这可用于确保在操作时盖板或面板仍然可读。
5.4 MoveAxisConstraint
- 此约束可用于固定被操作对象沿哪个轴移动。 这可用于在平面表面或沿直线操作对象。
Constraion on Movement 字段指定要阻止移动的轴。 默认情况下,这些轴是全局轴而不是局部轴,但可以在下方进行更改。 由于此属性是一个标志,因此可以选择任意数目的选项。
5.5 MinMaxScaleConstraint
- 此约束限制对象的缩放,这有助于防止用户将对象缩放到无法使用的大小。 它适用于基于句柄的缩放(使用 BoundsControl)和通过双手操作的直接缩放(使用 ObjectManipulator)。 Relative to Initial State选项定义特定的最小和最大缩放值是否为绝对值,或者它们是否与对象的初始缩放比例相乘。
5.6 RotationAxisConstraint
- 此约束可用于固定被操作对象可沿哪个轴旋转。 这可用于使被操作对象保持垂直,但仍允许围绕 y 轴旋转,例如。Constraint On Rotation字段指定要阻止旋转的轴。 默认情况下,这些轴是全局轴而不是局部轴,但可以在下方进行更改。 由于此属性是一个标志,因此可以选择任意数目的选项。