__空间映射渲染器__组件提供空间映射表面的可视化表示。这对于通过可视化方式调试表面并向环境添加视觉效果非常有用。
系统定期向__空间映射渲染器__组件发送有关物理空间变化的数据。每次由空间映射系统向该组件通知这些变化时,该组件都会将返回的表面数据烘焙到包含网格过滤器 (Mesh Filter) 和网格渲染器 (Mesh Renderer) 组件的游戏对象中。空间映射渲染器组件会管理这些表面游戏对象的生命周期。也就是说,该组件负责在场景中创建、更新和销毁表面游戏对象网格渲染器。
下表列出了__空间映射渲染器__组件可用的所有唯一渲染设置 (Render Settings)。
设置 | 描述 | |
---|---|---|
Render State | 所有表面游戏对象都从 Render State 设置中获取材质。更改 Render State 设置(例如,在运行时通过脚本进行更改)时,所有表面游戏对象的渲染材质都将更改为所选 Render State 设置的材质。这样可减少绘制调用次数,进而提高渲染性能。使用共享材质还可以减少应用程序在渲染期间使用的内存量。请从三个选项之中选择一项来渲染表面。 请参阅下面的 Render State 以了解更多信息。 |
|
Occlusion | 应用 Occlusion Material 中定义的材质。这是一种透明材质,可将游戏对象隐藏在真实世界表面的背后。请参阅下面的 Visual Material 和 Occlusion Material 以了解更多信息。 注意:__此设置将启用表面的所有网格渲染器,并覆盖所有其他设置。| | |Visualisation| 应用 Visualization Material__ 中定义的材质来可视化环境中的空间映射表面(通常是线框材质)。请参阅下面的 Visual Material 和 Occlusion Material 以了解更多信息。 注意__:此设置将启用表面的所有网格渲染器,并覆盖所有其他设置。 | | |None| 选择此选项可禁用分配给空间映射表面的所有网格渲染器。| |Occlusion Material||此处选择的材质是空间映射渲染器的 Render State__ 设置为 Occlusion 时应用的材质。默认设置为内置的 SpatialMappingOcclusion 材质。 |
|
Visual Material | 此处选择的材质是空间映射渲染器的 Render State 设置为 Visualization 时应用的可视材质 (Visual Material)。默认设置为内置的 SpatialMappingWireframe 材质。 |
以下是__空间映射渲染器 (Spatial Mapping Renderer)__ 和__空间映射碰撞体 (Spatial Mapping Collider)__ 组件的共同设置。
设置 | 描述 |
---|---|
Surface Parent | 选择希望由空间映射组件生成的表面游戏对象继承自的__表面父级 (Surface Parent)__ 游戏对象。将此设置保留为 None(Game Object) 可自动生成表面父游戏对象。 |
Freeze Updates | 选中此复选框可停止组件向系统查询表面更改。 注意:__每个空间映射组件会定期在空间映射数据中查询物理空间中的表面更改。查询和烘焙表面的过程存在内存、性能和功耗方面的成本。对于希望基本为静态的环境,建议让用户在一段时间内观察环境而不更新表面游戏对象。 如果希望模拟中的环境在很大程度上为静态且不变(如棋盘游戏),可以在应用程序启动时预先扫描所需的表面数据,然后将 Freeze Updates__ 属性设置为 true 以防止进一步更新。这样可以略微提高性能并降低功耗。 |
Time Between Updates | 指定对物理空间中的表面更改进行查询的间隔时间(以小数格式的秒为单位,如 3.7 或 4.6)。默认值为 2.5 秒。请注意,查询越频繁,内存、性能和功耗的成本就越高。 |
Removal Update Count | 在系统删除表面游戏对象之前的更新次数。在此上下文中,可将一次更新视为一帧。默认为 10 次更新。 注意:__当空间映射通知组件表面游戏对象不再位于 SurfaceObserver 的包围体中时(即不再位于系统报告的规定区域中时),将开始进行删除更新倒计时。此设置允许您指定此事件之后在空间映射删除表面游戏对象之前应执行的更新次数。 | | Level of Detail| 组件生成的网格质量(__Low、Medium 或 High__)。默认质量为 Medium。质量越高,生成的碰撞体或渲染网格越精细和准确。使用较低质量的设置可以在性能和功耗方面降低成本。请参阅此表下的图了解三个 Level Of Detail__ 模式的示例。 |
Bounding Volume Type | 组件的包围体区域形状,应用程序在其中接收空间映射数据。此设置可以是 Sphere 或 Axis Aligned Box。默认为 Axis Aligned Box。 注意:__包围体是系统报告物理表面更改并限制空间映射网格范围的规定区域。| | Size In Meters| 组件使用的包围体的大小(以米为单位)。按半径配置 Sphere__;默认半径为 2 米。按面积配置 Axis Aligned Box__;默认值为 Vector3 (4,4,4)。 注意:__观察者的包围体是供空间映射报告物理表面更改的规定区域。 |
两个空间映射组件都允许为每个组件生成的空间网格指定三个细节级别之一(Low、Medium 或 High),如下图所示。
如果可能,请将 Spatial Mapping Colliders 的 Level of Detail 设置为 Low。这样将在计算碰撞交点时提高性能并降低功耗。但是,将 Level of Detail 设置为 Low 可能会对应用程序的视觉效果产生负面影响。
此组件提供了一种动态更改所有生成的表面上的材质的简便方法。Unity 提供了两种预先构建的材质类型供您使用:
Occlusion Material
此材质使游戏对象看起来透明,但通过游戏对象看不到全息图。例如,如果需要一个真实的桌子来隐藏位于其下方的游戏内全息对象,这可能会很有用。
Visual Material
这是 Unity 应用于空间映射渲染器组件中所有表面的线框材质。使用默认的线框着色器时,线框的颜色代表真实世界的距离。这通常是进行调试时最有用的选项,但也可以将其用于呈现视觉效果。该着色器使用颜色映射来指示距离;下表显示了这种颜色映射:
与 HoloLens 的距离 | Color |
---|---|
0 到 1 米 | 黑色 |
1 到 2 米 | 红色 |
2 到 3 米 | 绿色 |
3 到 4 米 | 蓝色 |
4 到 5 米 | 黄色 |
5 到 6 米 | 青色 |
6 到 7 米 | 洋红色 |
7 到 8 米 | 栗色 |
8 到 9 米 | 蓝绿色 |
9 到 10 米 | 橙色 |
10 米或以上 | 白色 |
将新材质指定给 Visual Material 或 Occlusion Material 时,表面游戏对象的材质不会自动更改。要将新材质应用于所有表面,必须将 Render State 设置为已更改的材质(__Visual Material__ 或 __Occlusion Material__)。
如果仅从 Unity Editor 中(直接在场景中的游戏对象上)分配 Render State 中的 Occlusion Material 或 Visual Material 属性,则空间映射会与__空间映射渲染器__组件同时销毁它们。但是,空间映射不会销毁通过脚本随组件分配或更改的任何 Occlusion Material 或 __Visual Material__,因此需要手动销毁它们。
下面的代码片段会更改空间映射在运行时动态应用于所有表面游戏对象的材质。
SpatialMappingRenderer renderer = spatialMappingGameObject.AddComponent<SpatialMappingRenderer>();
renderer.visualMaterial = new Material(Shader.Find("VR/SpatialMapping/Wireframe"));
renderer.renderState = SpatialMappingRenderer.RenderState.Visualization;
__空间映射渲染器__组件会在运行时创建自己独立的一组表面游戏对象。这些游戏对象出现在场景中作为一个表面父游戏对象的子项:
__空间映射渲染器__生成的表面游戏对象包含以下组件
共享的材质(此材质为 Visualization 或 Occlusion Material,具体取决于 Render State 设置)
如果将多个__空间映射渲染器__组件添加到场景,则每个组件都会生成自己的一组表面游戏对象。例如,如果有两个游戏对象包含__空间映射渲染器__组件,则场景将包含两组表面游戏对象:每个组件在运行时生成一组。为了优化目的,请务必牢记这一点。
2018–05–01 页面已发布并进行了编辑审查
在 2017.3 版中更新了 Hololens 空间映射文档