会话与生命周期

一个页面如何向浏览器申请沉浸式会话,以及拿到之后它能假设些什么。

这个站上其余的一切都依赖这一区。WebXR 页面不是简单地「切到 3D」,它是在**协商**:申请某个模式的会话、列出需要的特性、等待一次用户手势和一次权限决定。只有到这一步之后它才拿到 XRSession,也只有到这一步之后,别的 API 才有意义。

这里四篇跟着一次会话从申请走到成帧。第一篇是申请本身:`immersive-vr` 和 `immersive-ar` 对运行时到底意味着什么,以及怎么查出你申请的特性里真正拿到了哪些。参考空间回答的是会话**故意留白**的那个问题 —— (0, 0, 0) 落在真实房间的哪一点;同一行代码在一台设备上把桌子放在地上,在另一台上放到胸口,而差别不在场景里。会话可见性讲的是那种「内容还在屏幕上、输入却去了别处」的状态。混合模式则是会话在另一头交还给你的东西:你的内容是**替换**了房间,还是**叠在**它上面,以及页面被允许知道多少。

这一区最常见的错误,是把会话当成一个布尔值:XR 开、XR 关。但一个会话有模式,有一组**可能少于你申请的**已授权特性,有一个原点会被运行时在你脚下挪动的参考空间,还有一个会改变你该怎么渲染的混合模式。按布尔值那版写出来的代码,在开发者自己的头显上能跑,在别人的头显上就崩。

本区包含

  1. WebXR 会话WebXR 会话是网页与头显之间的那次握手:一个调用接管两块屏幕,而你选的参考空间决定了地板在哪里。
  2. 参考空间WebXR 里你写下的每一个位置都是相对某个东西的。那个东西就是参考空间 —— 坐标系里唯一一件你的代码从不明说的事。
  3. 会话可见性系统菜单压在你的画面上时,用户依然看得见你画的每一帧。visibilityState 就是在告诉你这件事,而你的代码必须把它当成单独的一种情况处理。
  4. 环境混合模式一个属性 —— session.environmentBlendMode —— 告诉你用户能不能看见内容背后的真实房间。而在它的三个取值之一里,黑色不是一种颜色,是你场景上的一个洞。

按这个顺序读

先读会话。它确立了会话模式、特性描述符、参考空间、viewer pose 这套词汇。站上其余每一页都在用它们,而且不会再重新定义一遍。

参考空间排第二,因为这个站上每一个坐标都是在某个参考空间里写出来的,而后面的页面不会再每次都说明。它也是解释第一个常见 bug 的那一页:尺寸对、形状对,就是位置不对。

会话可见性第三。它很短,也是那种能错上好几个月都没人察觉的生命周期细节 —— 故障只在用户正盯着系统菜单、而不是盯着你的应用时才露面。

混合模式放最后。它回答的是你第一次启动 AR 会话之后立刻会冒出来的问题:为什么背景在一台设备上渲染成黑色,在另一台上却能看见房间?