理解真实世界

运行时告诉你「用户所在房间」的五种方式 —— 每一种形状不同,会撒的谎也不同。

这是站上最大的一区,也是最吃心智模型的一区。在 VR 里你的场景就是全部真相;在 AR 里它是一个客人,住在一个运行时自己都还在摸索的房间里。而这里的每一个 API,都是在回答同一个问题的不同版本:**设备到底知道这个房间的什么,你又该信它几分?**

五篇构成一条从「一个点」到「整个场景」的递进。命中测试给你一条射线和它底下的一个表面。平面检测给你一批多边形,它们会生长、会合并、身份还会变。锚点则是一次坦白:运行时的地图正在你脚下被改写,用世界坐标摆下的内容除非你明说,否则一定会漂。深度感知交给你一张逐像素的距离缓冲,分辨率低、有噪声,但足以让虚拟物体躲到真实物体后面。光照估计收尾,告诉你光从哪边落下来,让你摆进去的东西不至于像贴片。

把它们统一起来的是:**这些 API 返回的都不是事实**,而是运行时当下的最佳猜测 —— 精度和置信度因设备而异,并随用户走动而改善。把一个检测到的平面当成固定矩形、或者把一个深度值当成测量结果,这样的代码在演示里能跑,在真实房间里会垮。这一区每一篇都花了篇幅讲「这个 API 被允许以什么方式出错」,因为那恰恰是规范写得明明白白、而多数教程跳过的部分。

本区包含

  1. AR 命中测试命中测试问的是:从设备发出的这条射线,落在运行时**确实识别出来**的哪个表面上 —— 而返回的答案带着朝向,那恰恰是第一版实现最容易扔掉的部分。
  2. 平面检测平面检测给你的不是房间里表面的清单,而是运行时当下的意见 —— 而这个意见每一帧都在长大、分裂、合并、遗忘,并且不会通知你。
  3. 锚点锚点是运行时给你的一个承诺:随着它对房间了解得更多,它会不断修正这个位姿 —— 也就是说,你这一帧读到的位姿和上一帧不是同一个值,而这正是你要的东西。
  4. 深度感知遮挡不是画出来的效果,而是一次逐片元的比较:真实表面有多远,你这个像素有多远 —— 而给出答案的那张深度缓冲,比彩色画面粗一个数量级。
  5. 光照估计光照估计回答的是同一个问题 —— 从这里看,这个房间的光长什么样 —— 但它用三种不同的货币作答,而只用其中最便宜的那一种,正是大量 AR 内容至今看起来像贴上去的原因。

按这个顺序读

先读命中测试。它是这个问题最小的版本,一条射线对一个表面,并且引入了一个关键观念:答案是异步到达的,而且可能根本没有。

接着平面,然后锚点。平面把「单个表面」推广成一个会随时间变化的集合;而锚点正是这种不稳定的直接后果,只有先见过它才讲得通。

深度和光照放最后。这两个都不负责**摆放**任何东西。它们改变的是「已经摆好的东西怎么被画出来」,而那是比「放对位置」更晚的问题。