在不支持 ARKit 的设备上使用 ARSCNView

Use an ARSCNView on devices that don't support ARKit

是否可以使用 ARSCNView,为支持它的设备配置 ARWorldTrackingConfiguration,为不支持它的设备配置另一种方式(使用 A8 芯片和更低)并且仍然在后台呈现视频?

if ARWorldTrackingConfiguration.isSupported{
    let config=ARWorldTrackingConfiguration()
    config.planeDetection = .horizontal
    sceneView.session.run(config)
}else if AROrientationTrackingConfiguration.isSupported{
    let config=AROrientationTrackingConfiguration()
    sceneView.session.run(config)
}else{
    print("not supported")
    //what here?  <<<
}

您需要一个 运行 宁 ARSession 来将相机馈送驱动到一个 ARSCNView,到 运行 一个 ARSession 您需要一个支持的 ARConfiguration,所有配置都需要 A9。

但是,如果您的低于 A9 的后备计划是拥有一个不获取任何 ARKit 运动跟踪的 SceneKit 视图……您不需要 ARKit。只需使用常规 SceneKit 视图 (SCNView)。要使相机源显示在您的 SceneKit 内容后面,请找到您想要的相机的 AVCaptureDevice,并将其传递给视图中场景的 background.contents

(使用捕获设备作为 SceneKit 背景是 iOS 11 中的新功能。它似乎没有出现在文档中(还没有?),但它被描述 in the WWDC17 SceneKit session。)


顺便说一句,没有任何设备支持方向跟踪但不支持世界跟踪,因此您问题中的多分支 if 语句有点矫枉过正。

下面的代码解决了这个问题,它可能是错误的代码

let device = sceneView.device!
let maskGeometry = ARSCNFaceGeometry(device: device)!
mask = Mask(geometry: maskGeometry, maskType: maskType)

替换为

    let device = MTLCreateSystemDefaultDevice()
    let maskGeometry = ARSCNFaceGeometry(device: device!)!
    mask = Mask(geometry: maskGeometry)