理解真实世界
运行时告诉你「用户所在房间」的五种方式 —— 每一种形状不同,会撒的谎也不同。
读完这一区,你可以
区分寻找落点、维护位置、处理遮挡和匹配光照分别需要的信息。
开始之前
先读会话与参考空间;桌面演示无需 AR 设备。
建议阅读顺序
- AR 命中测试命中测试问的是:从设备发出的这条射线,落在运行时确实识别出来的哪个表面上 —— 而返回的答案带着朝向,那恰恰是第一版实现最容易扔掉的部分。约 8 分钟
- 平面检测平面检测给你的不是房间里表面的清单,而是运行时当下的意见 —— 而这个意见每一帧都在长大、分裂、合并、遗忘,并且不会通知你。约 5 分钟
- 锚点锚点是运行时给你的一个承诺:随着它对房间了解得更多,它会不断修正这个位姿 —— 也就是说,你这一帧读到的位姿和上一帧不是同一个值,而这正是你要的东西。约 6 分钟
- 深度感知遮挡不是画出来的效果,而是一次逐片元的比较:真实表面有多远,你这个像素有多远 —— 而给出答案的那张深度缓冲,比彩色画面粗一个数量级。约 6 分钟
- 光照估计光照估计回答的是同一个问题 —— 从这里看,这个房间的光长什么样 —— 但它用三种不同的货币作答,而只用其中最便宜的那一种,正是大量 AR 内容至今看起来像贴上去的原因。约 6 分钟
理解真实世界
这是站上最大的一区,也是最吃心智模型的一区。在 VR 里你的场景就是全部真相;在 AR 里它是一个客人,住在一个运行时自己都还在摸索的房间里。而这里的每一个 API,都是在回答同一个问题的不同版本:设备到底知道这个房间的什么,你又该信它几分?
五篇构成一条从「一个点」到「整个场景」的递进。命中测试给你一条射线和它底下的一个表面。平面检测给你一批多边形,它们会生长、会合并、身份还会变。锚点则是一次坦白:运行时的地图正在你脚下被改写,用世界坐标摆下的内容除非你明说,否则一定会漂。深度感知交给你一张逐像素的距离缓冲,分辨率低、有噪声,但足以让虚拟物体躲到真实物体后面。光照估计收尾,告诉你光从哪边落下来,让你摆进去的东西不至于像贴片。
把它们统一起来的是:这些 API 返回的都不是事实,而是运行时当下的最佳猜测 —— 精度和置信度因设备而异,并随用户走动而改善。把一个检测到的平面当成固定矩形、或者把一个深度值当成测量结果,这样的代码在演示里能跑,在真实房间里会垮。这一区每一篇都花了篇幅讲「这个 API 被允许以什么方式出错」,因为那恰恰是规范写得明明白白、而多数教程跳过的部分。
按这个顺序读
先读命中测试。它是这个问题最小的版本,一条射线对一个表面,并且引入了一个关键观念:答案是异步到达的,而且可能根本没有。
接着平面,然后锚点。平面把「单个表面」推广成一个会随时间变化的集合;而锚点正是这种不稳定的直接后果,只有先见过它才讲得通。
深度和光照放最后。这两个都不负责摆放任何东西。它们改变的是「已经摆好的东西怎么被画出来」,而那是比「放对位置」更晚的问题。
把概念连起来
从“把一个物体放在桌上”开始,依次考虑落点、锚定、遮挡与光照。如果设备缺少其中一项能力,说明体验如何降级。