边界控件 — MRTK2

边界控件

BoundsControl 是作行为的新组件,以前在 BoundingBox 中可以找到。 边界控件在设置中进行了许多改进和简化,并添加了新功能。 此组件是将弃用的边界框的替代组件。

BoundsControl.cs 脚本提供转换混合现实中对象的基本功能。 边界控件将在全息影像周围显示一个框,以指示可以与之交互。 框的角和边缘上的控点允许缩放、旋转或平移对象。 边界控件也会对用户输入做出反应。 例如,在HoloLens 2上,边界控件响应手指邻近感应,提供视觉反馈以帮助感知与对象的距离。 可以轻松自定义所有交互和视觉对象。

示例场景

可以在场景中找到边界控件配置 BoundsControlExamples 的示例。

边界控件示例

检查器属性

目标对象

此属性指定边界控件作将转换的对象。 如果未设置对象,则默认为所有者对象。

激活行为

有多个选项可用于激活边界控件接口。

  • 启动时激活:场景启动后,边界控件变为可见。
  • 按邻近感应激活:当关节手靠近对象时,边界控件变为可见。
  • 按指针激活:当边界控件成为手部指针的目标时,边界控件变为可见。
  • 按邻近感应和指针激活:当边界控件被手部射线指针作为目标或关节手靠近对象时,它变为可见。
  • 手动激活:边界控件不会自动变为可见。 可以通过访问 boundsControl.Active 属性通过脚本手动激活它。

边界替代

设置对象中的框碰撞体,以便进行边界计算。

框边距

向用于计算控件范围的碰撞体边界添加填充。 这不仅会影响交互,还会影响视觉对象。

平展轴

指示控件是否平展在一个轴中,使其为 2 维,并禁止沿该轴进行作。 此功能可用于薄对象,如石板。 如果平展轴设置为 “平展自动” ,则脚本将自动选取范围最小的轴作为平展轴。

平滑

平滑部分允许为控件的缩放和旋转配置平滑行为。

视觉对象

可以通过修改相应的视觉对象配置之一来配置边界控件的外观。 视觉对象是链接的或内联的可编写脚本的对象,在 配置对象部分进行了更详细的介绍。

配置对象

控件附带一组配置对象,这些对象可以存储为可编写脚本的对象,并在不同的实例或预制件之间共享。 可以将配置共享和链接为单个可编写脚本的资产文件或预制件内的嵌套可脚本资产。 还可以直接在实例上定义其他配置,而无需链接到外部或嵌套的可脚本资产。

边界控件检查器将通过在属性检查器中显示消息来指示配置是共享还是内联为当前实例的一部分。 此外,共享实例不能直接在边界控件属性窗口中进行编辑,而是必须直接修改它链接到的资产,以避免对共享配置进行任何意外更改。

目前,边界控件为以下功能提供配置对象选项:

Box 配置

框配置负责呈现一个实心框,其边界通过碰撞体大小和框填充定义。 可以设置以下属性:

  • 框材料:定义未发生交互时应用于呈现框的材料。 仅当设置此材料时,才会呈现框。
  • 框抓取材料:当用户通过近处或远距离交互抓取与控件交互时,框的材料。
  • 平展轴显示比例:如果其中一个轴 平展,则应用于框的刻度将显示。

缩放句柄配置

此属性抽屉允许修改边界控件的比例图柄的行为和可视化效果。

  • 手柄材料:应用于手柄的材料。
  • 手柄抓取材料:应用于抓取手柄的材料。
  • 处理 prefab:缩放句柄的可选 prefab。 如果设置为非 ,则 MRTK 将使用多维数据集作为默认值。
  • 句柄大小:缩放句柄的大小。
  • 碰撞体填充:要添加到句柄碰撞体中的填充。
  • 作时绘制系绳:当活动时,将绘制一条从交互开始点到当前手部或指针位置的系绳线。
  • 句柄忽略碰撞体:如果碰撞体在此处链接,句柄将忽略与此碰撞体的任何碰撞。
  • 句柄板预制件:在平展控件时用于句柄的 prefab。
  • 显示缩放句柄:控制句柄的可见性。
  • 缩放行为:可以设置为统一缩放或非一致性缩放。

旋转处理配置

此配置定义旋转句柄行为。

  • 手柄材料:应用于手柄的材料。
  • 手柄抓取材料:应用于抓取手柄的材料。
  • 处理 prefab:句柄的可选 prefab。 如果设置了非 ,则 MRTK 将使用球体作为默认值。
  • 句柄大小:句柄的大小。
  • 碰撞体填充:要添加到句柄碰撞体中的填充。
  • 作时绘制系绳:当活动时,将绘制一条从交互开始点到当前手部或指针位置的系绳线。
  • 句柄忽略碰撞体:如果碰撞体在此处链接,句柄将忽略与此碰撞体的任何碰撞。
  • 句柄预制碰撞体类型:要与创建的句柄一起使用的碰撞体类型。
  • 显示 X 的句柄:控制 X 轴控点的可见性。
  • 显示 Y 的句柄:控制 Y 轴控点的可见性。
  • 显示 Z 的句柄:控制 Z 轴控点的可见性。

翻译处理配置

允许为边界控件启用和配置转换句柄。 请注意,默认情况下禁用翻译句柄。

  • 手柄材料:应用于手柄的材料。
  • 手柄抓取材料:应用于抓取手柄的材料。
  • 处理 prefab:句柄的可选 prefab。 如果设置了非 ,则 MRTK 将使用球体作为默认值。
  • 句柄大小:句柄的大小。
  • 碰撞体填充:要添加到句柄碰撞体中的填充。
  • 作时绘制系绳:当活动时,将绘制一条从交互开始点到当前手部或指针位置的系绳线。
  • 句柄忽略碰撞体:如果碰撞体在此处链接,句柄将忽略与此碰撞体的任何碰撞。
  • 句柄预制碰撞体类型:要与创建的句柄一起使用的碰撞体类型。
  • 显示 X 的句柄:控制 X 轴控点的可见性。
  • 显示 Y 的句柄:控制 Y 轴控点的可见性。
  • 显示 Z 的句柄:控制 Z 轴控点的可见性。

链接配置启用边界控件的线框功能。 可以配置以下属性:

  • 线框材料:应用于线框网格的材料。
  • 线框边缘半径:线框的粗细。
  • 线框形状:线框的形状可以采用立方体或柱形。
  • 显示线框:控制线框的可见性。

邻近感应效果配置

根据与手部的距离显示和隐藏具有动画的手柄。 它具有两步缩放动画。 默认设置设置为HoloLens 2样式行为。

边界控制邻近感应
  • 邻近感应效果活动:启用基于邻近感应的句柄激活
  • 对象中等邻近度:第一步缩放的距离
  • 对象近距:第二步缩放的距离
  • 远距:当手超出边界控件交互的范围时,句柄资产的默认小数位数值 (由上面“处理中等邻近度”定义的距离。默认情况下,使用 0 隐藏句柄)
  • 中等比例:当手位于边界控件交互的范围内时,句柄资产的刻度值 (由“处理近距”所定义的距离。使用 1 显示正常大小)
  • 接近比例:当手处于抓取交互范围内时,手柄资产的刻度值 (上面由“处理近距”定义的距离。使用 1.x 显示更大的大小)
  • 远增长率:当手部从中等距离移动到远距离时,对邻近缩放对象缩放比例进行评分。
  • 中等增长速率:当手部从中等到接近时,对邻近缩放的对象缩放进行评分。
  • 接近增长速率:当手部从靠近对象中心移动到对象中心时,对邻近缩放的对象缩放比例进行评分。

约束系统

边界控件支持在使用边界控件句柄时使用 约束管理器 来限制或修改转换、旋转或缩放行为。

属性检查器将在下拉列表中显示附加到同一游戏对象的所有可用约束管理器,其中包含一个滚动和突出显示所选约束管理器的选项。

边界控件约束

事件

边界控件提供以下事件。 此示例使用这些事件播放音频反馈。

  • 旋转已启动:旋转开始时触发。
  • 旋转停止:旋转停止时触发。
  • 已启动缩放:缩放开始时触发。
  • 缩放停止:缩放停止时触发。
  • 翻译已启动:在翻译开始时触发。
  • 翻译已停止:在翻译停止时触发。
边界控件事件

弹性 (实验)

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

边界控件弹性

句柄样式

默认情况下,仅分配 BoundsControl.cs 脚本时,会显示 HoloLens 第一代样式的句柄。 若要使用HoloLens 2样式手柄,需要分配适当的手柄预制件和材料。

边界控件句柄样式 2

下面是HoloLens 2样式边界控件手柄的预制件、材料和缩放值。 可以在场景中找到此示例 BoundsControlExamples

边界控件 HandleStyles

处理HoloLens 2样式) (安装程序

  • 句柄材料:BoundingBoxHandleWhite.mat
  • 手柄抓取材料:BoundingBoxHandleBlueGrabbed.mat
  • 缩放句柄 Prefab:MRTK_BoundingBox_ScaleHandle.prefab
  • 缩放句柄板板 Prefab:MRTK_BoundingBox_ScaleHandle_Slate.prefab
  • 缩放手柄大小:0.016 (1.6 厘米)
  • 缩放手柄碰撞体填充:0.016 (使可抓取碰撞体略大于手柄视觉)
  • 旋转手柄 Prefab:MRTK_BoundingBox_RotateHandle.prefab
  • 旋转句柄大小:0.016
  • 旋转手柄碰撞体填充:0.016 (使可抓取碰撞体略大于手柄视觉)

使用对象作器的转换更改

边界控件可与 结合使用 ObjectManipulator.cs ,以允许某些类型的作 (例如,在不使用句柄的情况下移动对象) 。 作处理程序支持单手交互和双手交互。 手部跟踪 可用于近距离与对象交互。

边界控件对象作器

为了使边界控件边缘在使用 ObjectManipulator的远距离交互移动边缘时的行为方式相同,建议分别将“作开始结束 / BoundsControl.HighlightWires / BoundsControl.UnhighlightWires时”的事件连接到 ,如上面的屏幕截图所示。

如何使用Unity检查器添加和配置边界控件

  1. 将 Box 碰撞体添加到对象
  2. 将脚本分配给 BoundsControl 对象
  3. 配置选项,例如“激活”方法 (请参阅下面的 “检查器属性” 部分)
  4. (可选) 为HoloLens 2样式边界控件分配预制件和材料 (请参阅下面的处理样式部分)

注意

在检查器中使用 “目标对象 ”和“ 边界重写 ”字段,在具有多个子组件的对象中分配特定对象和碰撞体。

边界控件

如何在代码中添加和配置边界控件

  1. 实例化多维数据集 GameObject

    GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
    
  2. 使用 AddComponent<> () 将脚本分配给BoundsControl具有碰撞的对象

    private BoundsControl boundsControl;
    boundsControl = cube.AddComponent<BoundsControl>();
    
  3. 直接在控件上或通过其中一个可编写脚本的配置来配置选项 (请参阅下面的 检查器属性配置 部分)

    // Change activation method
    boundsControl.BoundsControlActivation = BoundsControlActivationType.ActivateByProximityAndPointer;
    // Make the scale handles large
    boundsControl.ScaleHandlesConfig.HandleSize = 0.1f;
    // Hide rotation handles for x axis
    boundsControl.RotationHandlesConfig.ShowRotationHandleForX = false;
    
  4. (可选) 为HoloLens 2样式边界控件分配预制件和材料。 这仍然需要通过检查器分配,因为应动态加载材料和预制件。

注意

建议不要使用 Unity 的“Resources”文件夹或 Shader.Find 来动态加载着色器,因为在运行时可能缺少着色器排列。

BoxDisplayConfiguration boxConfiguration = boundsControl.BoxDisplayConfig;
boxConfiguration.BoxMaterial = [Assign BoundingBox.mat]
boxConfiguration.BoxGrabbedMaterial = [Assign BoundingBoxGrabbed.mat]
ScaleHandlesConfiguration scaleHandleConfiguration = boundsControl.ScaleHandlesConfig;
scaleHandleConfiguration.HandleMaterial = [Assign BoundingBoxHandleWhite.mat]
scaleHandleConfiguration.HandleGrabbedMaterial = [Assign BoundingBoxHandleBlueGrabbed.mat]
scaleHandleConfiguration.HandlePrefab = [Assign MRTK_BoundingBox_ScaleHandle.prefab]
scaleHandleConfiguration.HandleSlatePrefab = [Assign MRTK_BoundingBox_ScaleHandle_Slate.prefab]
scaleHandleConfiguration.HandleSize = 0.016f;
scaleHandleConfiguration.ColliderPadding = 0.016f;
RotationHandlesConfiguration rotationHandleConfiguration = boundsControl.RotationHandlesConfig;
rotationHandleConfiguration.HandleMaterial = [Assign BoundingBoxHandleWhite.mat]
rotationHandleConfiguration.HandleGrabbedMaterial = [Assign BoundingBoxHandleBlueGrabbed.mat]
rotationHandleConfiguration.HandlePrefab = [Assign MRTK_BoundingBox_RotateHandle.prefab]
rotationHandleConfiguration.HandleSize = 0.016f;
rotationHandleConfiguration.ColliderPadding = 0.016f;

示例:使用 MinMaxScaleConstraint 设置最小、最大边界控制规模

若要设置最小和最大刻度,请将 附加到 MinMaxScaleConstraint 控件。 当边界控件自动附加并激活约束管理器时,MinMaxScaleConstraint 将在附加和配置转换后自动应用于转换更改。

还可以使用 MinMaxScaleConstraint 为 ObjectManipulator设置最小和最大缩放。

GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
bcontrol = cube.AddComponent<BoundsControl>();
// Important: BoundsControl creates a constraint manager on start if one does not exist.
// There's no need to manually attach a constraint manager.
MinMaxScaleConstraint scaleConstraint = bcontrol.gameObject.AddComponent<MinMaxScaleConstraint>();
scaleConstraint.ScaleMinimum = 1f;
scaleConstraint.ScaleMaximum = 2f;

示例:在游戏对象周围添加边界控件

若要在对象周围添加边界控件,只需向其添加组件 BoundsControl

private void PutABoundsControlAroundIt(GameObject target)
{
   target.AddComponent<BoundsControl>();
}

从边界框迁移

使用 边界框 的现有预制件和实例可以通过作为 MRTK 工具包一部分的 迁移窗口 升级到新的边界控件。

若要升级边界框的单个实例,组件的属性检查器内还有一个迁移选项。

边界控件 Migrate

另请参阅