AR游戏最容易骗人的地方,是角色看起来站在地板上,却根本不知道前面那张桌子存在。截图里一切都正常:一只小型机械兽落在客厅地毯中央,影子贴地,比例合适。可它一迈步,就从茶几的桌面中间穿了过去,像穿过一团空气。这种画面不是渲染出了问题,而是理解出了问题。角色被“放进”了摄像头画面,却没有被“放进”房间。
这篇文章想把这件事拆开讲清楚:一个AR角色要在真实客厅里可信地行动,系统需要依次建立哪几层对空间的认识,每一层靠什么输入,会在哪里出错,又怎样反过来改变玩法设计。爱游戏的设计思路,是把“理解房间”当作AR玩法的前置层,而不是贴图之后再补的效果。文中出现的场景都是模拟场景,尺寸和数值是为了说明问题而设的假设示例,并不代表真实测试结果。
摄像头给的是像素,游戏需要的是空间
先说清楚两种AR的差别。第一种是把3D模型叠在摄像头画面上,模型随手机移动而保持大致位置,这是大多数人熟悉的“扫一扫出现一只动物”。第二种是空间游戏:角色要知道地面在哪一层、墙在哪一侧、桌子有多高、沙发能不能坐、门通向哪里,并且据此决定往哪走、躲在哪、什么时候被挡住。前者只需要相机位姿,后者需要一整套关于房间的结构化知识。
摄像头本身只输出颜色。一张沙发的照片和一面沙发形状的墙纸,在像素层面没有区别。要让游戏“知道”房间,系统必须把颜色变成三类可以被规则和路径规划直接使用的信息:
- 几何:哪些位置有表面,表面朝向哪里,离相机多远。这是最底层,回答“这里能不能放东西”。
- 语义:这块表面是地面、墙、桌面还是沙发靠背。回答“这是什么”。
- 可玩性:这块区域角色能不能走、道具能不能放、玩家会不会被引导到危险的位置。回答“游戏可以拿它做什么”。
三层依次依赖:没有几何就谈不上语义,没有语义,可玩性只能靠猜。很多AR体验的“穿模”,本质上是把第三层的工作交给了第一层,也就是只有一块地面平面,然后假设平面之上什么都没有。
SLAM先回答“我在哪”,再回答“周围有什么”
空间理解的起点是SLAM,即同时定位与建图。手机或眼镜在移动时,视觉惯性里程计把相机连续画面和惯性传感器(加速度计、陀螺仪)的读数结合起来,估计设备自己的位姿。同一时刻,系统在画面里提取有辨识度的特征点,比如桌角、画框边缘、地毯花纹的交点,并在多帧之间跟踪它们,反推每个特征点在三维空间里的位置。
结果是一团稀疏点云。它有两个特点值得记住:第一,它很“空”,点只出现在有纹理的地方,一面纯白的墙可能一个点都没有;第二,它没有含义,点云只知道“这里有东西”,不知道那是桌子还是一盆植物。稀疏点云足以让虚拟物体稳定地贴在某个位置,却不足以让角色在房间里走路。
下一步是把点云变成表面。常见做法是先做平面检测:如果一批点近似落在同一个水平面上,就把它们拟合成一块地面或桌面;落在垂直面上的,拟合成墙。有深度传感器或较好的深度估计时,还可以进一步重建三角网格,得到更贴近真实的表面形状,比如沙发扶手的起伏。平面告诉游戏“这里可以放东西”,网格告诉游戏“这里的形状是什么样”。
这一步已经隐含了第一个取舍。平面检测快、稳、省电,但只认“大而平”的东西,茶几上的一摞书、椅背、窗帘都不在它的世界里。网格更细,却需要更多计算、更长的扫描时间,在移动设备上还会带来发热。所以爱游戏更倾向于按玩法需求分级:需要角色在地面上走动的任务,先保证地面与主要障碍的可靠性;需要角色跳上家具的任务,才要求更精细的表面重建。
语义分割让“障碍”有了名字,导航网格让路径有了边界
有了几何,还得知道这些几何是什么。语义分割模型在摄像头画面上给每个区域打标签:地面、墙、天花板、桌子、沙发、椅子、门、窗、植物、人、宠物。这些二维标签再借助深度或网格投影回三维空间,就得到一张带类别的空间地图,业内常称为语义场景(Semantic Scene)。
类别一旦确定,游戏规则就可以差异化处理。地面是默认可行走的;墙不可穿越;桌面可以放道具,但角色不应该“走”上去,除非玩法允许它攀爬;沙发可以坐,也可能是一处掩体;门是相邻空间的通道,窗则应当被标记为“不要引导玩家靠近”。同样是一块竖直的表面,墙和窗帘对游戏的意义完全不同。
接着是可行走区域。做法大致是:取出地面平面,减去所有障碍物在地面上的投影,再按角色的体型向外“膨胀”一圈,因为角色不是一个点,它有身体半径。剩下的连通区域就是导航网格(Navigation Mesh)。路径规划算法在这张网格上找路,得到的就是“绕开桌子”的路线,而不是穿过桌子的直线。
几个容易被忽略的细节,会直接决定角色走得像不像“活在这个房间里”:
- 高度阈值:地毯边缘、门槛、很低的台阶,算障碍还是算可跨越?阈值定得太严,角色会被一条地毯边困住;定得太松,它会踩在真实的书上。
- 动态障碍:人和宠物会移动。玩家自己的脚就是最大的动态障碍,导航网格需要低延迟地把它们从可行走区域里“挖掉”,并在它们离开后恢复。
- 狭窄通道:两把椅子之间的缝隙对小型角色可通行,对大型怪物不可通行。同一张房间地图,需要按角色尺寸生成不同的导航网格。
遮挡、深度与光照:让角色“属于”房间的最后一步
就算路径规划正确,角色也可能看起来像贴在屏幕上。原因通常是遮挡缺失。当角色走到沙发后面,沙发应该挡住它的下半身;如果系统不知道沙发在角色前面,就会把整个角色画在沙发上方,视觉上立刻“穿帮”。遮挡处理需要每一帧的深度信息:真实物体离相机多远,虚拟角色离相机多远,谁近谁就画在前面。
深度的来源有三种,各有代价。专用深度传感器给出的距离较直接,但并非所有设备都具备;多帧视觉估计不依赖额外硬件,但在纹理少、移动慢的场景里不稳;单目深度网络能给出稠密的相对深度,却容易在边缘处“糊”,人的手指、椅子腿这类细结构常常被吞掉。因此遮挡质量在不同设备之间差异很大,爱游戏的做法是把它当作可降级的层:设备能做精确遮挡,就启用;做不到,就退回到只对大件家具做粗遮挡,或者让角色避开被遮挡的位置,从玩法设计上绕开这个短板。
光照是另一层。同一个金属机械兽,放在暖色灯光的客厅和窗边冷光的书房里,本该有不同的高光与色调。光照估计根据画面亮度分布和主光方向,为虚拟物体设置环境光和影子方向。做得不好,角色像贴纸;做得太重,又会在暗光条件下消耗大量算力。它不影响角色能不能走,却决定玩家会不会觉得角色“在这儿”。
三者合起来,才是“角色属于这个房间”的感觉:走路绕开障碍,走到后面被遮挡,影子朝着灯的反方向。少了任何一块,玩家都能立刻察觉,只是未必说得出为什么。
模拟场景:一只角色从沙发走向玩家
下面用一个模拟场景,把上面几层串起来。假设玩家在一间约四米宽的客厅里,沙发靠着左侧墙,中间有一张茶几,右侧是电视柜。玩家站在电视柜前,任务是让一只小型侦察机械兽从沙发跳下来,走到玩家脚边领取道具。这些尺寸只是为了说明而设的示例。
- 扫描阶段:玩家举着手机缓慢环视,系统通过视觉惯性里程计跟踪设备位姿,得到地毯、墙边、茶几边缘的特征点。此时只有稀疏点云和几块水平、垂直平面,机械兽还不知道茶几是茶几。
- 语义阶段:语义分割为画面区域打上“沙发”“茶几”“地面”的标签,并借助深度投回三维。沙发座面被标记为可停留表面,茶几被标记为障碍,其上方空间不可行走。
- 规划阶段:系统从地面平面中挖去沙发底座和茶几的投影,再按机械兽的体型外扩,得到导航网格。沙发到玩家之间的最短直线正好穿过茶几,规划器于是选择了绕茶几右侧的弧线路径,右侧通道宽度大于机械兽体型,可通行。
- 运动与遮挡:机械兽跳下沙发座面,沿弧线行走。经过茶几背后时,深度信息显示茶几近于机械兽,于是茶几遮挡了它的一部分身体,玩家看到的是“从桌子后面绕出来”的样子。
- 意外情况:走到一半,玩家的宠物从右侧通道穿过。动态障碍检测把这一片区域从导航网格中暂时挖掉,机械兽停下并重新规划,改走左侧较窄的缝隙。如果左侧也不通,它会原地待命并发出提示,而不是强行穿过。
这个场景里最有价值的一步,反而是最后的“待命”。空间理解不是要保证角色永远能到达目标,而是要保证系统知道什么时候到不了,并且选择一种不破坏可信度的方式失败。一个会被宠物挡住、然后停下来“看一眼”的角色,比一个毫不迟疑穿过宠物的角色更像活的。
玻璃、镜子、白墙和暗光:空间理解会在哪里失败
把空间理解讲得太顺,是不诚实的。下面这张表列出几种常见的失败情形,它们几乎会出现在每一个真实家庭里。
| 环境情形 | 系统会“看到”什么 | 典型后果 | 玩法层的应对 |
|---|---|---|---|
| 大面积玻璃、落地窗 | 透过玻璃看到室外,深度估计到远处 | 墙面“消失”,角色可能被放到窗外 | 把窗户类区域标记为禁区,不放置任务点 |
| 镜子 | 镜中是一个虚假的房间 | 地图出现“第二个房间”,角色走进镜子 | 发现重复空间时降低置信度,提示玩家避开镜面 |
| 纯白墙面 | 几乎没有特征点 | 墙的位置不稳定,锚点漂移 | 重要物体尽量靠近纹理丰富的家具和墙角 |
| 暗光或逆光 | 画面噪点多、曝光失衡 | 追踪丢失,平面反复抖动 | 提示增加光线,必要时缩小任务范围 |
| 反光地面 | 地板上映出天花灯 | 地面被误判为“更深的一层” | 用多帧一致性过滤,低置信度时不放置 |
| 大量杂物或移动物体 | 物体位置每次扫描不同 | 导航网格过时,角色撞上新放的椅子 | 定期刷新局部区域,对动态物体保守处理 |
这些失败有一个共同点:系统很少“知道自己错了”。平面检测会把玻璃反射面当作一面真实的墙,语义分割会给镜中的沙发同样贴上“沙发”的标签。所以爱游戏更看重的是置信度,而不是单一的“检测结果”。每个平面、每个语义区域、每条可行走边界都带着一个可信程度,游戏规则读到低置信区域时,应该采取保守策略:不放任务点、不让角色进入、必要时向玩家提出一句清楚的话,比如“这一侧的地面我看不太清楚,能再绕着扫一遍吗”。
此外还有一条硬约束:房间扫描涉及家里的真实布局。在爱游戏的设计里,空间地图默认只保存在本机,用来支撑当前体验,并给玩家删除的入口。空间理解越细,越应当克制地对待这些数据。
下一阶段的AR,比的是角色知不知道自己在哪
回到开头那只穿过茶几的机械兽。它的问题不在于模型不够精美,也不在于帧数不够高,而在于游戏从来没有回答过“它出现在哪儿”。把AR游戏的下一阶段理解为“把角色显示得更逼真”,是把力气花在了错的一层;真正拉开差距的,是角色对房间的认识有多具体:知道哪里是路,哪里是障碍,哪里会遮住自己,哪里根本不应该去。
这种认识也改变了设计的顺序。传统做法是先设计角色和任务,再想办法让它们“适配”摄像头画面;空间理解优先的做法,是先问房间能提供什么,再决定角色和任务能做什么。房间里有多大的空地、有几处可藏身的家具、哪一侧是玩家不该去的窗边,这些都是玩法的原材料。关于任务如何根据不同房间重新生成,可以继续读同一个AR任务为什么不能在每个人家里长得一样;而当摄像头移动、锚点开始漂移时会发生什么,AR角色为什么经常穿墙一文有更细的原理说明。
需要坦率说明的是,空间理解永远不会完美。玻璃、镜子、暗光和杂乱的房间,会让任何一套系统出错。可以争取的是两件事:出错时不要假装自己没错,以及让玩法在不完美的理解上仍然成立。当角色学会在“看不清”的地方停下来,而不是穿过去,AR才算真正开始理解现实空间。