此博客主要是记下场景的功能,以方便后续查找类似场景直接调用。
参考官方教程:探索 MRTK3 示例场景 - MRTK3 | Microsoft Learn
所在场景路径为:UnityProjects/MRTKDevTemplate/Assets/Scenes
案例场景:
AudioLoFiExample
音频低保真效果示例
这个场景展示了低保真(Lo-Fi)音频效果。球体发出声音。点击按钮选择下面描述的其中一种效果。
<b>窄带电话</b>
应用窄带电话系统的音频频率范围(300Hz - 3.4kHz)。
<b>宽带电话</b>
应用宽带电话系统的音频频率范围(50Hz - 7kHz)。
<b>AM广播</b>
应用AM广播的音频频率范围(40Hz - 5kHz)。
<b>全频率范围</b>
应用一个比人耳正常听觉范围更宽的音频频率范围(10Hz - 22kHz)。这个设置相当于关闭Lo-Fi效果。
AudioOcclusionExample
这个场景展示了声音遮挡如何通过模拟从封闭空间外部传来的声音的效果,来增强你的体验的沉浸感。
如果你能看到那个球体,你将听到该物体的自然声音。
如果你移动到面板后面,声音将被遮挡。
SpatialMouseSample
此示例场景包括在 MRTK XR 设备下的空间鼠标交互器。您可以使用鼠标的选择、移动和滚动功能来操作场景中的对象。
VirtualizedScrollRectList
VirtualizedScrollRectList是一个辅助组件,它能在Unity ScrollRect中表示非常大的列表,而不需要为大量的GameObject付出代价。它通过维持一定数量的GameObject来完全覆盖ScrollRect的可见区域,并在列表上下滚动时重复使用它们。
这个例子还会自动滚动列表。你可以通过点击向上或向下的按钮来停止自动滚动。
————————————
EyeTrackingBasicSetupExample
这个场景为你提供了在MRTK中开始使用眼动追踪所需的最基本设置。
附加在立方体上的“StatefulInteractable”和“ColorTap”脚本,当被注视时会变成高亮颜色,并且可以通过在它们上方做捏合手势来选择。
EyeTrackingExampleNavigationExample
凝视定向平移和缩放:
看向某个区域进行放大,只需说“放大”。要缩小,只需说“缩小”。
您还可以举起手,捏住然后将手拉向自己以放大您正在看的东西。要缩小,捏住手指并将手从身体推开(向外推)。
一旦放大,您可以通过四处看来平移。
自动滚动:
只需继续阅读,文本便会自动滚动。
目标旋转
全息图将根据你所观察模型的部分而开始旋转。看着地球的侧面,它将自动绕其垂直轴旋转。
EyeTrackingTargetPositioningExample
这个示例场景展示了如何流畅地选择和重新定位目标,它结合了关于你正在看哪里的信息以及来自手和声音的额外输入。
眼睛和手
看着其中一个盒子并捏住。在捏住的同时,你可以通过简单地移动手来移动盒子。在捏住的同时,你也可以看向别处,一个预览将大致出现在你正在看的地方,以便更快速地粗略定位目标。
眼睛和声音
看着下面的其中一个盒子并说
“放这里”。然后看向你想放置全息图的地方并说“到这里”。
EyeTrackingTargetSelectionExample
使用眼动跟踪,你可以轻松定位目标。尽可能快地销毁宝石。
执行以下操作之一:
- 看向并空中点击
- 看向并说“选择”或“爆炸”
- 在蓝色宝石上停留1秒钟
EyeTrackingTargetSelectionExample
使用眼动跟踪,你可以轻松定位目标。尽可能快地销毁宝石。这个演示展示了通过热图可视化用户注意力的一个例子。
实时热图
在左侧的照片中,当你环顾四周时,会逐渐构建一个热图。
热图记录
在右侧,你可以首先在没有任何干扰的情况下记录眼动追踪数据,然后加载并回放这些数据。首先点击“记录”来记录你的眼睛注视点,然后点击“播放”来查看热图回放。- 在蓝色宝石上停留1秒钟
————————————
BoundsControlExamples
BoundsControl允许通过手柄进行对象的操作,提高精度和可靠性。
手柄/盒子视觉效果是作为一个可定制的预制件实现的,分配给BoundsControl组件。我们的实现使用SqueezableBoxVisuals作为边界框的视觉驱动,但开发者可以创建任何他们喜欢的视觉驱动。
用户可以自定义盒子预制件并制作自己的手柄/盒子设置。BoundsHandleInteractable是所有边界手柄应实现的可重用基类。它将操作事件向上转发到BoundsControl组件,该组件实际上计算并移动目标对象。
边界是自动计算的。计算方法可以定制为偏好适应渲染器或碰撞器(或两者的组合!)BoundsControl组件不需要与目标对象在同一个对象上;它也可以是子对象。
CanvasExample
ClippingExamples
裁剪示例
此场景展示了MRTK/Standard着色器与裁剪基元(ClippingPlane、ClippingSphere和ClippingBox)结合使用,以动态裁剪网格上的像素。
说明
尝试使用近距或远距交互抓取平面、球体或箱体基元。然后移动基元,直到它与心形图案相交。您将注意到与基元相交的心形的任何部分都不会被渲染。
附加功能
您还可以抓取心形并将其移动到其他位置。
通过使用两只手操作,可以缩放基元和心形。
注意
出于性能原因,此示例场景一次只允许一个裁剪基元影响渲染器。查看ObjectManipulator的Manipulation Started事件。
ClippingInstancedExamples
这个场景展示了如何结合使用Graphics Tools/Standard着色器和裁剪原语(ClippingPlane、ClippingSphere和ClippingBox)在GPU上对实例化的网格动态裁剪像素。这种方法通过在所有共享相同材质的渲染器之间启用自动批处理,即使它们与不同的裁剪原语交互,也能够显著增加被裁剪的网格数量。
DiagnosticsDemo
MRTK3诊断包是一组子系统和组件,帮助开发人员测量和诊断其混合现实体验。
MRTK3附带了一个基本的性能统计可视化工具SimpleProfiler,位于MRTK Diagnostics > Visualizations中。
如本演示所示的VisualProfiler可以在GitHub上的VisualProfiler for Unity项目中找到:
https://github.com/microsoft/VisualProfiler-Unity
通过响应以下关键词来控制诊断信息的显示:"Profiler"、"Toggle Profiler"、"Show Profiler"、"Hide Profiler"。
DialogExample
使用DialogPool来生成模态对话框,提供可配置的选项集,包括各种正文/标题文本内容选项和按钮。使用流畅的接口从代码中构建您的对话框。
---这段对话是在InspectorDrivenDialog.cs中的检查器中指定的。然后,将标题、正文和按钮参数在使用DialogPool构建了一个对话框之后传递给了对话框。
---所有对话框的属性都可以通过代码设置,使用友好的API。
---如您所见,对话中只会显示请求的选项。这里是一个中性选项,既不是负面也不是正面。
---是的,实际上,你可以请求所有三种选项类型,它们仍然会被正确地布局。
---这个异步方法将等待对话的结果。
DirectionalIndicatorExample
方向指示器示例
这个场景演示了实验性求解器“方向指示器”的使用。该求解器可应用于引导用户转身或定位到场景中的某个期望点的用户体验。
如何使用
使用方向箭头指示器找到场景中的咖啡杯。当咖啡杯出现在视野中时,箭头将消失。
通常,指示器的参考框架将是相机,但它们也可以附加到您的手部或场景中的其他变换。
修改SolverHandler Tracked Target Type以确定应用作参考框架的内容。
方向指示器组件的“DirectionalTarget”属性确定应该被发现的场景中的点。
FontIconExample
MRTK提供了一部分Fluent UI图标集作为字体资源。您可以将其与TextMesh Pro和FontIconSelector脚本一起使用。FontIconSelector脚本使从图标字体SDF资源中选择图标变得容易,而无需键入十六进制代码。以下是来自MRTK Fluent图标集的一些示例。
MagicWindowExample
这个示例场景展示了如何使用MRTK标准着色器实现“魔术窗”或“传送门”效果。配置“模板测试”属性非常重要。查看本示例中用于物体和魔术窗盒子的材料中的模板比较和模板操作属性。
出于性能考虑,HoloLens上的深度提交模式推荐设置为16位,但魔术窗示例依赖于模板缓冲区,而模板缓冲区仅在深度提交模式设置为24位时可用。
为了正确渲染此示例,请确保在
项目设置 > XR插件管理 > OpenXR下
配置“深度提交模式”为“24位”
NonCanvasDialogExample
使用DialogPool来生成模态的非画布对话框,可以提供一组可配置的选项,包括各种主体/标题文本内容选项和按钮。使用流畅的编程接口来构建你的对话框。
SlateDrawingExample
____________________
SolverExamples
解算器是一种组件,它便于根据预定义的算法计算对象的位置和方向。例如,可以将对象放置在用户凝视射线目前碰到的表面上。
解算器提供一系列行为,用于将对象附着到其他对象或系统上。另一个例子是在用户前方(基于相机)悬浮的跟随对象。解算器也可以附加到控制器和对象上,使对象跟随控制器移动。所有解算器都可以安全地堆叠,例如,跟随行为 + 表面磁力 + 动量。
着重介绍SurfaceMagnetism,SurfaceMagnetism
的工作方式是对一组表面的 LayerMask 执行光线投射,并将 GameObject 放置在接触点。
MoveLerpTime 值越高,帧之间的移动增量就会越慢。
如果启用了 MaintainScale,求解器将利用 GameObject 的默认本地缩放。
如果启用了“平滑处理”,则求解器将随着时间的推移,将 GameObject 的转换逐渐更新为计算值。
“表面垂直偏移”按照设定好的距离表面的距离(米),沿着表面上击中点处的法线方向放置 GameObject。
相反,“表面射线偏移”按照设定好的距离表面的距离(米),沿着所执行光线投射的相反方向放置 GameObject。 因此,如果光线投射是用户凝视的方向,则 GameObject 将沿直线从表面上的击中点向摄像头靠近。
“方向模式”确定相对于表面上的法线应用的旋转类型。
-
无 - 不应用旋转
-
跟踪目标 - 对象将面向驱动光线投射的跟踪转换
-
表面法线 - 对象将基于表面上的击中点对齐
-
混合 - 对象将基于表面上的击中点对齐,并且面向跟踪转换。
TapToPlaceExample
"Tap to Place"功能将物体放置在表面上。如果未检测到表面,则物体将相对于TrackedTargetType(头部、控制器射线、手部关节)在Solver Handler中的默认距离处放置。这是一个远程交互组件。
如何使用
要使用此场景,请聚焦于你想要移动的物体,用空气轻点/捏合手势选中它。移动你的头部来移动物体。要放置物体,再次空气轻点/捏合。第二次空气轻点不要求物体处于焦点状态。
最佳调试参数
VanillaUGUIExample
强烈建议使用MRTK提供的UX组件,但MRTK3通过XRI提供了与原始/未修改的UGUI组件的后备兼容性。确保您的原始UGUI画布兼容性的几个要求:
- 画布需要一个TrackedDeviceGraphicRaycaster。它执行从您的XRRayInteractors到画布的2D平面的射线投射。
- 您必须使用XRUIInputModule。
- 确保您的XRRayInteractors已选中<color=#FF9E00>启用UI交互</color>选项。
默认情况下,UGUI组件不会写入z缓冲区。这会导致XR设备上的重投影伪影,因为UI的深度信息不正确。您应通过使用使用zwrite的MRGT画布标准材质的背板来解决此问题。