读大三时学过一门课程《游戏编程》,当时遇到一个有趣的问题,没想到现在搞AR又遇到了,就是遮挡的情况。
什么是遮挡?
就是前面的东西挡住后面的。尤其是在二维环境下,因为本来就是一个平面,一定要有前后关系或者分层来解决遮挡问题。
举个例子,我们以前玩小霸王游戏的时候,游戏人物走到一个建筑物旁边,他要从建筑物的前面绕到建筑物的后面,请问怎么处理才能让你不那么假。
没感觉,那先看一张动态图。
是不是这样才会感觉到飞机真的在绕着人飞行。真实的世界里,两个物体之间的遮挡关系是自然而然的,因为我们从小就开始适应这种情况,所以并不会特别察觉,但如果让你自己建造一个虚拟的世界,这个难题就必须要解决了。
在AR中有无遮挡,很重要吗?
看一个AR绘画程序的两种情况对比。
当我们在真实场景中画上虚拟的笔迹,然后我们转一下角度,问题就出现了。正常情况下,我们会知道画在黑色物体背后的画笔应该被挡住看不到才对,但是这个虚拟的画笔一直在我们面前飘着,这就太假了。
然后,如果我们使用了遮挡来处理。
掉落在地上的球,当球滚动到物体下面的时候,就从图像上消失了,这才符合真实的情况。
所以在AR当中,无论是手机AR还是AR眼镜,真实环境和虚拟的增强信息并不是简单叠加。为了欺骗人的双眼和大脑,是需要满足一些真实世界的基本原则,比如重力、灯光、阴影、当它满足一些基本原则的时候,比如灯光、阴影等,不然总会感觉“看起来不太对”。
AR中实现遮挡的三种方法
第一种是比较简单粗暴的处理方式,就是突出重点。
比如我们在AR中观看,真实场景我们很熟悉,我们希望能突出虚拟图像的更重要地位,那就把虚拟的物体渲染得非常亮,远远超过周围环境。带来的后果就是整个场景很扎眼,不舒服。
第二种我们选择用更精细些的手法,但是原理和第一种类似,只是反过来操作。
当我们想看到前面的虚拟图像时,这个虚拟图像实际上应该是在前面的,现实场景是在背景位置,这时候我们不像第一种方式对虚拟物体加亮,而是反其道而行之,把现实部分变暗。
如果人眼能看到一部分现实背景,那就采用光照往没被遮挡住露出来的真实部分打上光,这样就还原了真实的情况。
第三种是针对于光学透视的显示器,你可以简单理解为采用光学透视的AR眼镜就是这一种。
这种方案从理论上讲,就是在整个仪器的前方增加一块用于过滤的电子屏,用来过滤一些不需要的像素。
总结
在以前学习做2D游戏的时候,遮罩的算法是用来解决遮挡问题的,3D游戏里,可以直接用深度来表达物体的前后关系,利用深度轴处理遮挡,就不算是一个需要着重解决的问题。
但AR扫描的现实世界非常复杂,很难短时间重建真实环境中的所有对象,也就没法做出透明遮罩来解决遮挡问题。