我们正在ARKit中开发一个使用人物遮挡的演示应用。因为我们想在最终场景中添加视频,所以我们使用SCNPlane
来渲染视频,以确保他们面向正确的方向。这些视频也是部分透明的,使用我们应用的SCNMaterial
上的自定义着色器(因此一次播放2个视频)。
现在我们遇到了一些问题,人物的遮挡非常不确定(见图)。我们用来测试的视频是一个穿着深色裤子和裙子的女人(如果你想知道图像中的黑色是什么)。
我们遇到的问题是遮挡并不总是与人对齐(如图中所示),并且某人的头发并不总是被正确检测到。
现在我们的问题是什么导致了这些问题?我们如何改进这些问题,直到它们看起来像this?我们目前正在探索这些问题是否是因为我们使用了平面,但简单地使用SCNBox
并不能解决问题。
1条答案
按热度按时间avkwfej41#
更新日期:2023年3月6日。
新深度API
您可以在ARKit 3.5 / 6.0中提高
People Occlusion
和Object Occlusion
要素的质量,这要归功于新的***Depth API***,该API具有可在60 fps下渲染的高质量ZDepth通道。但是,要获取它,您需要配备LiDAR扫描仪的iPhone或iPad。在ARKit 3.0中,除非使用Metal或MetalKit,否则无法提高People Occlusion
要素的质量(所以,这并不容易)。提示:考虑到RealityKit和AR QuickLook框架也支持
People Occlusion
。为什么在使用人物遮挡时会出现此问题?
这是由于深度数据的本质,我们都知道,3D场景渲染的最终图像可以包含5个主要的数字合成通道-
Red
、Green
、Blue
、Alpha
和ZDepth
。当然,还有其他用于合成的有用渲染过程(也称为AOV):
Normals
、MotionVectors
、PointPosition
、UVs
、Disparity
等。但是在这篇文章中,我们只对两个主要的渲染集感兴趣-RGBA
和ZDepth
。ZDepth通道在ARKit 3.0中有三个严重的缺点
问题1. ZDepth的锯齿和反锯齿
渲染ZDepth通道在任何高端软件(如Nuke,Fusion,Maya或Houdini),默认情况下会导致***锯齿状边缘***或所谓的锯齿边缘。游戏引擎也不例外- SceneKit,RealityKit,Unity,Unreal,或Stingray也有这个问题。
当然,你可以说,在渲染之前,我们必须打开一个名为
Anti-aliasing
的特性。而且,是的,它对几乎所有的通道都能正常工作,但对ZDepth就不行了。ZDepth的问题是-每个前景对象的边界像素(特别是当它是透明的)被“转换”到背景对象中,如果anti-aliased
。换句话说,FG和BG的像素在FG对象的边缘上混合。坦率地说,目前专业合成行业解决深度问题的有效方案只有一个-- Nuke合成器使用Deep channels而不是
ZDepth
。但是没有一个游戏引擎支持它,因为Deep
通道大得吓人。所以深度通道comp既不适合游戏引擎,也不适合ARKit / RealityKit。唉!问题2. Z深度的分辨率
常规的
ZDepth
通道必须在32-bit
中渲染,即使RGB
和Alpha
通道都是8-bit
。深度数据的32位文件对CPU和GPU来说是一个沉重的负担。ARKit经常在viewport中合并几个层。例如,在虚拟模型和真实背景角色上合成真实前景角色。你不觉得这对你的设备来说太多了吗?即使这些层是以视口分辨率而不是真实的屏幕分辨率合成的?但是,在16-bit
或8-bit
中渲染ZDepth
通道会压缩真实场景的深度,从而降低合成质量。为了减轻CPU和GPU的负担并保存电池寿命,苹果工程师决定在捕捉阶段使用缩小的ZDepth图像,然后使用Alpha通道将渲染的ZDepth图像放大到视口分辨率和模板(又称为分割),然后使用扩张合成操作来固定ZDepth通道的边缘。这让我们看到了你的照片上的一些令人讨厌的人工制品(某种“痕迹”)。
请查看
Bringing People into AR
here的演示幻灯片pdf。问题3. ZDepth的帧速率
第三个问题源于FPS。ARKit和RealityKit的工作速度为
60 fps
。降低ZDepth图像分辨率并不会减少处理。因此,ARKit 3.0工程师的下一个合理步骤是-将ZDepth的帧率降低到15 fps
。然而,最新版本的ARKit和RealityKit渲染ZDepth通道的速度为60 fps。什么大大提高了人遮挡和物体遮挡的质量。但在ARKit 3. 0中,这暴露了伪影(ZDepth通道的某种“降帧”,导致“拖尾”效果)。使用此type属性时,不能更改合成图像的质量:
因为它是一个可获取的属性,并且在ARKit 3.0中没有ZDepth质量的设置。
当然,如果您想在ARKit 3.0中增加ZDepth通道的帧速率,您应该实现数字合成中的
frame interpolation technique
(中间帧是计算机生成的帧)。但是这种帧插值技术是CPU密集型的,因为我们需要每秒生成45个额外的32位ZDepth帧(45个插值+ 15个真实的=每秒60帧)。
我相信有人可能会使用Metal来改进ARKit 3.0中的ZDepth合成特性,但这对开发人员来说是一个真实的的挑战。
ARKit 6.0和LiDAR扫描仪支持
ARKit 3.5....6.0支持激光雷达(
Light Detection And Ranging
扫描仪)。LiDAR扫描仪提高了人物遮挡功能的质量,因为ZDepth通道的质量更高,即使您在跟踪周围环境时没有物理移动。LiDAR系统还可以帮助您绘制墙壁、天花板、地板和家具,以快速获得用于与真实世界表面动态交互虚拟网格,或者简单地在其上定位3D对象(即使是部分遮挡的虚拟对象)。具有LiDAR的小工具可以实现无与伦比的准确性,检索真实世界表面的位置。通过考虑网格,光线投射可以与非平面曲面或根本没有特征的曲面相交,如白色墙或光线不足的墙。要激活
sceneReconstruction
选项,请使用以下代码:但在代码中使用
sceneReconstruction
示例属性之前,您需要检查设备是否具有LiDAR扫描仪。您可以在AppDelegate.swift
文件中执行此操作:现实工具包2.0
在iPhone Pro或iPad Pro上使用RealityKit 2.0应用程序时,您可以使用多个遮挡选项-ARKit 6.0中提供了相同的选项-改进的
People Occlusion
、Object Occlusion
(例如家具或墙壁)和Face Occlusion
。要在RealityKit 2.0中打开遮挡,请使用以下代码: