范围框 - MRTK2

Bounding box

注意

边界框已弃用并已由边界控件替代。 使用迁移选项之一来升级现有的游戏对象。

BoundingBox.cs 脚本提供用于在混合现实中转换对象的基本功能。 边界框将在全息影像周围显示一个立方体,以指示可以与之交互。 可以使用立方体的角和边上的手柄缩放或旋转对象。 边界框还会响应用户输入。 例如,在 HoloLens 2 上,边界框会在手指接近时作出反应,提供视觉反馈来帮助感知与对象的距离。 可以轻松自定义所有交互和视觉对象。

有关详细信息,请参阅 Windows 开发人员中心中的边界框和应用栏

示例场景

可以在 BoundingBoxExamples 场景中找到边界框配置的示例。

Bounding Box Examples

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

  1. 向对象添加框碰撞器
  2. BoundingBox 脚本分配给某个对象
  3. 配置选项,例如“激活”方法(请参阅下面的检查器属性部分)
  4. (可选)为 HoloLens 2 样式边界框分配 prefab 和材质(请参阅下面的手柄样式部分)

注意

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

Bounding Box 1

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

  1. 立方体 GameObject 例化

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

    private BoundingBox bbox;
    bbox = cube.AddComponent<BoundingBox>();
    
  3. 配置选项(请参阅下面的检查器属性部分)

    // Make the scale handles large
    bbox.ScaleHandleSize = 0.1f;
    // Hide rotation handles
    bbox.ShowRotationHandleForX = false;
    bbox.ShowRotationHandleForY = false;
    bbox.ShowRotationHandleForZ = false;
    
  4. (可选)为 HoloLens 2 样式边界框分配 prefab 和材料。 这仍然需要通过检查器进行分配,因为要动态加载材料和 prefab。

注意

不建议使用 Unity 的“资源”文件夹或 Shader.Find 来动态加载着色器,因为在运行时可能会丢失着色器置换。

bbox.BoxMaterial = [Assign BoundingBox.mat]
bbox.BoxGrabbedMaterial = [Assign BoundingBoxGrabbed.mat]
bbox.HandleMaterial = [Assign BoundingBoxHandleWhite.mat]
bbox.HandleGrabbedMaterial = [Assign BoundingBoxHandleBlueGrabbed.mat]
bbox.ScaleHandlePrefab = [Assign MRTK_BoundingBox_ScaleHandle.prefab]
bbox.ScaleHandleSlatePrefab = [Assign MRTK_BoundingBox_ScaleHandle_Slate.prefab]
bbox.ScaleHandleSize = 0.016f;
bbox.ScaleHandleColliderPadding = 0.016f;
bbox.RotationHandleSlatePrefab = [Assign MRTK_BoundingBox_RotateHandle.prefab]
bbox.RotationHandleSize = 0.016f;
bbox.RotateHandleColliderPadding = 0.016f;

示例:使用 MinMaxScaleConstraint 设置最小、最大边界框比例

使用 MinMaxScaleConstraint 设置最小和最大比例。 还可以使用 MinMaxScaleConstraint 设置 ManipulationHandler 的最小和最大比例。

GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
bbox = cube.AddComponent<BoundingBox>();
// Important: BoundingBox creates a scale handler on start if one does not exist
// do not use AddComponent, as that will create a  duplicate handler that will not be used
MinMaxScaleConstraint scaleConstraint = bbox.gameObject.GetComponent<MinMaxScaleConstraint>();
scaleConstraint.ScaleMinimum = 1f;
scaleConstraint.ScaleMaximum = 2f;

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

若要在对象周围添加边界框,只需向该对象添加 BoundingBox 组件:

private void PutABoxAroundIt(GameObject target)
{
   target.AddComponent<BoundingBox>();
}

检查器属性

“目标对象”

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

边界覆盖

从对象中设置框碰撞器以进行边界计算。

激活行为

有几个用于激活边界框界面的选项。

  • 启动时激活:在场景启动时,边界框变为可见。
  • 接近时激活:当明确有手接近对象时,边界框变为可见。
  • 指针激活:当边界框成为手射线指针的目标时,边界框变为可见。
  • 手动激活:边界框不会自动变为可见。 可以通过访问 boundingBox.Active 属性使用脚本手动激活它。

最小比例

允许的最小比例。 此属性已弃用,可以添加一个 MinMaxScaleConstraint 脚本。 如果添加此脚本,将从该脚本(而不是边界框)获取最小比例。

最大比例

允许的最大比例。 此属性已弃用,可以添加一个 MinMaxScaleConstraint 脚本。 如果添加此脚本,将从该脚本(而不是边界框)获取最大比例。

框显示

各种边界框可视化选项。

如果平展轴设置为自动平展,脚本将不允许沿轴进行最小范围的操作。 该设置的结果是会得到二维边界框,通常用于细薄对象。

句柄

可以分配材料和 prefab 来覆盖手柄样式。 如果未向手柄分配,将显示为默认样式。

事件

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

  • “旋转开始”:旋转开始时激发。
  • “旋转结束”:旋转结束时激发。
  • 缩放开始:缩放开始时触发。
  • “缩放结束”:缩放结束时激发。
Events

手柄样式

默认情况下,如果只分配 BoundingBox.cs 脚本,手柄将以 HoloLens 第一代样式显示。 若要使用 HoloLens 2 样式手柄,需要分配正确的手柄预制件和材料。

Bounding Box Handle Styles

下面是 HoloLens 2 样式边界框手柄的 prefab、材料和缩放值。 可以在 BoundingBoxExamples 场景中找到此示例。

HandStyles 2

手柄(HoloLens 2 样式设置)

  • “手柄材料”:BoundingBoxHandleWhite.mat
  • “抓取手柄材料”:BoundingBoxHandleBlueGrabbed.mat
  • “缩放手柄预制件”:MRTK_BoundingBox_ScaleHandle.prefab
  • “缩放手柄场记板预制件”:MRTK_BoundingBox_ScaleHandle_Slate.prefab
  • “缩放手柄大小”:0.016(1.6 厘米)
  • “缩放手柄碰撞器填充”:0.016(使可抓取的碰撞器在视觉上略大于手柄)
  • “旋转手柄预制件”:MRTK_BoundingBox_RotateHandle.prefab
  • “旋转手柄大小”:0.016
  • 旋转手柄碰撞器填充:0.016(使可抓取的碰撞器在视觉上略大于手柄)

接近度(HoloLens 2 样式的设置)

根据与手的距离,使用动画显示和隐藏手柄。 它含有两步缩放动画。

Proximity
  • 接近效果激活:启用基于接近度的手柄激活
  • “手柄中等接近度”:第一步缩放的距离
  • “手柄高接近度”:第二步缩放的距离
  • “远距离缩放”:当手离开边界框交互范围时,手柄资产的默认缩放值(上面由“手柄中等接近度”定义的距离。默认使用 0 来隐藏手柄)
  • “中等距离缩放”:当手位于边界框交互范围时,手柄资产的缩放值(上面由“手柄高接近度”定义的距离。使用 1 来显示正常大小)
  • “近距离缩放”:当手位于抓取交互范围时,手柄资产的缩放值(上面由“手柄高接近度”定义的距离。使用 1.x 来显示更大的尺寸)

使用操作手柄使对象可移动

可将边界框与 ManipulationHandler.cs 结合使用,利用远距离交互使对象可移动。 操作手柄同时支持单手和双手交互。 可以使用手部追踪与靠近的对象进行交互。

Manipulation Handler

为了使边界框边缘在用户使用 ManipulationHandler 的远距离交互移动它时行为一致,建议将它的操作开始时 / 操作结束时的事件分别连接到 BoundingBox.HighlightWires / BoundingBox.UnhighlightWires,如上面的屏幕截图所示。

迁移到边界控件

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

如果要升级单个边界框实例,还可以使用组件的属性检查器中的迁移选项。

Bounds Control Migrate