WebXR 网格检测模块

社区组报告草案,

关于本文档的更多详细信息
本版本:
https://github.com/immersive-web/real-world-meshing/
问题跟踪:
GitHub
编辑:
(Meta)
参与:
提交问题(未解决的问题)
邮件列表存档
W3C 的 #immersive-web IRC

摘要

本文档状态

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 类型。

为了为 frame 更新 网格,用户代理必须运行以下步骤:
  1. 令 session 为 frame 的会话。

  2. 令 device 为 session 的 XR 设备。

  3. 令 trackedMeshs 为调用 device 的原生网格检测能力,以获取 frame 的时间点所跟踪网格的结果。

  4. 对于 trackedMeshs 中的每个 native mesh,运行:

    1. 如果需要,将 native mesh 视为不存在于 trackedMeshs 中,并继续处理下一个条目。有关可用于判断是否应以这种方式忽略条目的标准,请参阅§ 6 隐私与安全考量。

    2. 如果 session 的已跟踪网格集合包含一个 对应于 native mesh 的对象 mesh,则使用 mesh、native mesh 和 frame 调用更新网格对象算法,并继续处理下一个 条目。

    3. 令 mesh 为使用 native mesh 和 frame 调用创建网格对象 算法的结果。

    4. 将 mesh 添加到 session 的已跟踪网格集合中。

  5. 从 session 的已 跟踪网格集合中移除在调用此算法期间既未创建也未更新的每个对象。

  6. 将 frame 的 detectedMeshes 设置为已跟踪网格集合。

为了根据原生网格对象 native mesh 和 XRFrame frame 创建网格 对象,用户代理必须运行以下步骤:
  1. 令 result 为 XRMesh 的新实例。

  2. 将 result 的原生实体设置为 native mesh。

  3. 将 result 的 meshSpace 设置为一个新的 XRSpace 对象,该对象在创建时将会话设置为 frame 的 session, 并将原生原点设置为跟踪 native mesh 的 原生原点。

  4. 使用 result、native mesh 和 frame 调用更新 网格对象算法。

  5. 返回 result。

以这种方式创建的网格对象 result 被称为对应于传入的原生网格 对象 native mesh。

为了根据原生网格对象 native mesh 和 XRFrame frame 更新网格 对象 mesh,用户代理必须运行以下步骤:
  1. 将 mesh 的帧设置为 frame。

  2. 将 mesh 的 vertices 设置为表示 native mesh 顶点的新顶点数组,并执行所有 必要的转换,以处理原生网格表示之间的差异。

  3. 将 mesh 的 indices 设置为表示 native mesh 顶点的新索引数组,并执行所有 必要的转换,以处理原生网格表示之间的差异。

  4. 如果需要,按照§ 6 隐私与安全考量中的说明,降低 mesh 的 vertices 和 indices 的细节级别。

  5. 将 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 网格检测规范的设计做出了贡献:

一致性

文档 约定

一致性要求通过描述性断言 与 RFC 2119 术语的组合 来表达。 本文档规范性部分中的关键词“MUST”“MUST NOT”“REQUIRED”“SHALL”“SHALL NOT”“SHOULD”“SHOULD NOT”“RECOMMENDED”、 “MAY”和“OPTIONAL” 应按照 RFC 2119 中的说明进行解释。 但是,为便于阅读, 本规范中的这些词并非全部以大写字母形式出现。

除明确标记为非规范性的章节、示例和注释外, 本规范的所有文本均为规范性内容。[RFC2119]

本规范中的示例以“例如”等词语引入, 或使用 class="example" 与规范性文本分隔, 如下所示:

这是一个资料性示例。

资料性注释以“注”一词开头, 并使用 class="note" 与规范性文本分隔, 如下所示:

注:这是一条资料性注释。

索引

本规范定义的 术语

通过引用 定义的术语

参考文献

规范性参考文献

[HR-TIME-3]
Yoav Weiss。高精度时间。URL:https://w3c.github.io/hr-time/
[RFC2119]
S. Bradner。RFC 中用于 表示要求级别的关键词。1997 年 3 月。最佳当前实践。URL:https://datatracker.ietf.org/doc/html/rfc2119
[WEBIDL]
Edgar Chen;Timothy Gu。Web IDL 标准。现行 标准。URL:https://webidl.spec.whatwg.org/
[WEBXR]
Brandon Jones;Manish Goregaokar;Rik Cabanier。WebXR 设备 API。URL:https://immersive-web.github.io/webxr/

资料性参考文献

[WEBXR-ANCHORS-MODULE]
Piotr Bialecki。WebXR 锚点模块。 报告草案。URL:https://immersive-web.github.io/anchors/

IDL 索引

[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;
};

[Exposed=Window] interface XRMeshSet {
  readonly setlike<XRMesh>;
};

partial interface XRFrame {
  readonly attribute XRMeshSet detectedMeshes;
};