1. 简介
2. 初始化
2.1. 特性描述符
为了使应用程序表明其有意在会话期间使用网格检测,请求会话时必须使用适当的特性 描述符。本模块引入字符串 mesh-detection,将其作为网格检测特性的新有效特性描述符。
如果设备的跟踪系统公开了原生网格检测能力,则该设备能够支持 mesh-detection 特性。不得将内联 XR 设备视为能够支持 mesh-detection 特性。
创建启用了 mesh-detection 特性的会话时,必须将更新网格算法添加到该会话的帧更新列表中。
const session= await navigator. xr. requestSession( "immersive-ar" , { requiredFeatures: [ "mesh-detection" ] });
3. 网格
3.1. XRMesh
[Exposed =Window ]interface { [XRMesh SameObject ]readonly attribute XRSpace ;meshSpace readonly attribute Float32Array ;vertices readonly attribute Uint32Array ;indices readonly attribute DOMHighResTimeStamp ;lastChangedTime readonly attribute DOMString ?; };semanticLabel
XRMesh 表示
底层 XR 系统检测到的单个三维几何体实例。
meshSpace
是一个用于建立网格坐标系的 XRSpace。
meshSpace
的原生原点会跟踪网格中心。底层 XR 系统定义网格中心的确切含义。由 meshSpace
定义的坐标系的 Y 轴必须表示网格的法向量。
每个 XRMesh 都有一个
关联的原生实体。
每个 XRMesh 都有一个
关联的帧。
vertices
是描述网格形状的顶点数组。这些顶点使用由 meshSpace
定义的坐标系表示。
indices
是一个索引数组,用于描述网格每个顶点的索引。
lastChangedTime
是某些网格属性最后一次发生更改的时间。
注: 网格的姿态不被视为网格
属性,因此网格姿态的更新不会导致 lastChangedTime
发生更改。这是因为网格姿态是由两个不同实体派生的属性——meshSpace
以及作为相对空间的 XRSpace,
姿态将通过 getPose()
函数相对于该空间进行计算。
4. 获取检测到的网格
4.1. XRMeshSet
[Exposed =Window ]interface {XRMeshSet readonly setlike <XRMesh >; };
XRMeshSet 是
XRMesh 的集合。它是
获取在 XRFrame
中检测到的网格集合的主要机制。
partial interface XRFrame {readonly attribute XRMeshSet ; };detectedMeshes
XRFrame
被扩展为包含 detectedMeshes
属性,该属性包含帧中仍在被跟踪的所有网格。该集合最初为空,并将由更新
网格算法填充。如果在帧不处于活动状态时访问此属性,
用户代理必须抛出 InvalidStateError。
XRSession
也被扩展为包含一个关联的已跟踪网格集合,该集合最初
为空。集合中的元素将为 XRMesh
类型。
-
令 session 为 frame 的会话。
-
令 device 为 session 的 XR 设备。
-
对于 trackedMeshs 中的每个 native mesh,运行:
-
从 session 的已 跟踪网格集合中移除在调用此算法期间既未创建也未更新的每个对象。
-
将 frame 的
detectedMeshes设置为已跟踪网格集合。
XRFrame
frame 创建网格
对象,用户代理必须运行以下步骤:
-
令 result 为
XRMesh的新实例。 -
将 result 的原生实体设置为 native mesh。
-
将 result 的
meshSpace设置为一个新的XRSpace对象,该对象在创建时将会话设置为 frame 的session, 并将原生原点设置为跟踪 native mesh 的 原生原点。 -
使用 result、native mesh 和 frame 调用更新 网格对象算法。
-
返回 result。
以这种方式创建的网格对象 result 被称为对应于传入的原生网格 对象 native mesh。
XRFrame
frame 更新网格
对象 mesh,用户代理必须运行以下步骤:
-
将 mesh 的帧设置为 frame。
-
将 mesh 的
vertices设置为表示 native mesh 顶点的新顶点数组,并执行所有 必要的转换,以处理原生网格表示之间的差异。 -
将 mesh 的
indices设置为表示 native mesh 顶点的新索引数组,并执行所有 必要的转换,以处理原生网格表示之间的差异。 -
如果需要,按照§ 6 隐私与安全考量中的说明,降低 mesh 的
vertices和indices的细节级别。 -
将 mesh 的
lastChangedTime设置为时间。
5. 原生设备概念
5.1. 原生网格检测
网格检测 API 提供有关在用户环境中检测到的三维表面的信息。本规范
假定用户代理可依赖底层平台提供的原生网格检测能力来实现
mesh-detection 特性。具体而言,底层 XR
设备应提供一种方式,以查询与特定 XRFrame
的时间相对应的时刻所跟踪的所有网格。
此外,还假定被跟踪的网格(称为原生网格对象)会在不同帧之间保持其标识——
也就是说,给定底层系统在时间 t0 返回的网格对象 P,
以及底层系统在时间 t1 返回的网格对象 Q,用户代理可以
查询底层系统,以确定 P 和 Q 是否对应于同一个逻辑网格对象。底层系统
还应提供一个可用于查询时间 t 的姿态位置的原生原点,但不能保证网格姿态始终已知(例如,
对于仍在跟踪但在给定时间无法定位的网格)。此外,原生
网格对象应公开一个用于描述所检测网格近似形状的多边形。
此外,底层系统应将原生网格识别为原生实体,以便
创建 XRAnchor。
有关更多信息,请参阅 WebXR 锚点模块
§ native-anchor 一节。
6. 隐私与安全考量
网格检测 API 会公开有关用户物理环境的信息。如果用户代理选择这样做,则可以限制所公开的网格
信息(例如网格的多边形)。用户代理可通过以下一些方式减少公开的信息:
在更新网格对象算法中降低
网格多边形的细节级别(例如减少
顶点数量,或者对顶点坐标进行舍入/量化),
或者通过在更新网格算法中表现得如同该网格对象
不存在于 trackedMeshs 集合中一样,完全移除该网格(例如,
如果检测到的网格被认为过小/过于详细而不适合公开,并且用户代理尚未实现
减少网格公开细节的机制,则可以这样做)。网格的姿态(可通过 meshSpace
获取)也可以被量化。
由于网格检测 API 中的概念可用于[webxr-anchors-module] 规范所公开的方法,因此与 WebXR 锚点模块相关的一些隐私与安全考量 也适用于此处。有关详细信息,请参阅 WebXR 锚点模块 § privacy-security 一节。
由于网格检测 API 扩展了 WebXR 设备 API,WebXR 设备 API § 13. 安全、隐私与舒适性考量一节也适用于 WebXR 网格检测模块所公开的特性。
7. 致谢
以下人员为 WebXR 网格检测规范的设计做出了贡献: