范围框 - MRTK2
BoundingBox.cs
脚本提供用于在混合现实中转换对象的基本功能。 边界框将在全息影像周围显示一个立方体,以指示可以与之交互。 可以使用立方体的角和边上的手柄缩放或旋转对象。 边界框还会响应用户输入。 例如,在 HoloLens 2 上,边界框会在手指接近时作出反应,提供视觉反馈来帮助感知与对象的距离。 可以轻松自定义所有交互和视觉对象。
有关详细信息,请参阅 Windows 开发人员中心中的边界框和应用栏。
示例场景
可以在 BoundingBoxExamples
场景中找到边界框配置的示例。
如何使用 Unity 检查器添加和配置边界框
- 向对象添加框碰撞器
- 将
BoundingBox
脚本分配给某个对象 - 配置选项,例如“激活”方法(请参阅下面的检查器属性部分)
- (可选)为 HoloLens 2 样式边界框分配 prefab 和材质(请参阅下面的手柄样式部分)
注意
使用检查器中的“目标对象”和“边界覆盖”字段,在具有多个子组件的对象中分配特定对象和碰撞器。
如何在代码中添加和配置边界框
立方体 GameObject 例化
GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
使用 AddComponent<>() 将
BoundingBox
脚本分配给具有碰撞体的对象private BoundingBox bbox; bbox = cube.AddComponent<BoundingBox>();
配置选项(请参阅下面的检查器属性部分)
// Make the scale handles large bbox.ScaleHandleSize = 0.1f; // Hide rotation handles bbox.ShowRotationHandleForX = false; bbox.ShowRotationHandleForY = false; bbox.ShowRotationHandleForZ = false;
(可选)为 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 来覆盖手柄样式。 如果未向手柄分配,将显示为默认样式。
事件
边界框提供以下事件。 此示例使用这些事件来播放音频反馈。
- “旋转开始”:旋转开始时激发。
- “旋转结束”:旋转结束时激发。
- 缩放开始:缩放开始时触发。
- “缩放结束”:缩放结束时激发。
手柄样式
默认情况下,如果只分配 BoundingBox.cs
脚本,手柄将以 HoloLens 第一代样式显示。 若要使用 HoloLens 2 样式手柄,需要分配正确的手柄预制件和材料。
下面是 HoloLens 2 样式边界框手柄的 prefab、材料和缩放值。 可以在 BoundingBoxExamples
场景中找到此示例。
手柄(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 样式的设置)
根据与手的距离,使用动画显示和隐藏手柄。 它含有两步缩放动画。
- 接近效果激活:启用基于接近度的手柄激活
- “手柄中等接近度”:第一步缩放的距离
- “手柄高接近度”:第二步缩放的距离
- “远距离缩放”:当手离开边界框交互范围时,手柄资产的默认缩放值(上面由“手柄中等接近度”定义的距离。默认使用 0 来隐藏手柄)
- “中等距离缩放”:当手位于边界框交互范围时,手柄资产的缩放值(上面由“手柄高接近度”定义的距离。使用 1 来显示正常大小)
- “近距离缩放”:当手位于抓取交互范围时,手柄资产的缩放值(上面由“手柄高接近度”定义的距离。使用 1.x 来显示更大的尺寸)
使用操作手柄使对象可移动
可将边界框与 ManipulationHandler.cs
结合使用,利用远距离交互使对象可移动。 操作手柄同时支持单手和双手交互。 可以使用手部追踪与靠近的对象进行交互。
为了使边界框边缘在用户使用 ManipulationHandler
的远距离交互移动它时行为一致,建议将它的操作开始时 / 操作结束时的事件分别连接到 BoundingBox.HighlightWires
/ BoundingBox.UnhighlightWires
,如上面的屏幕截图所示。
迁移到边界控件
使用边界框的现有预制件和实例可以通过 MRTK 工具包中的迁移窗口升级到新边界控制。
如果要升级单个边界框实例,还可以使用组件的属性检查器中的迁移选项。