替换iOS10中的ARKit

XCo*_*ode 1 ios arkit

我想将ARKit包含在专为iOS10 +设计的应用程序中,如果iOS版本低于11,我将用SceneKit替换ARKit。

不幸的是,似乎目前尚无办法?

ric*_*ter 7

根据您对期望的设置方式,可以将SceneKit用作ARKit的“后备”,特别是来自ARSCNView

您可以轻松地创建一个3D内容体验,当在支持ARKit的设备上运行时,它可以通过AR在“真实世界”中出现,并且在完全虚拟的设置(即以3D渲染,而没有相机作为背景)时,在没有ARKit的情况下运行。

注意: ARKit支持不仅限于iOS 11,还需要A9设备。因此,您可能会想到iOS 11上较旧的硬件的回退体验,而不仅仅是iOS较旧的版本。

为此,您需要能够在运行时换出您的视图类。这意味着不创建ARSCNView故事板,而是初始化一个故事板并将其添加到代码中视图控制器的根视图中。

override func viewDidLoad() {
    super.viewDidLoad()
    let sceneView = ARSCNView(frame: view.bounds)
    sceneView.scene = // ... set up your SceneKit scene ...
    view.addSubview(sceneView)
}
Run Code Online (Sandbox Code Playgroud)

一旦执行了类似的操作,就可以将关键部分包装ARSCNView在可用的条件中,SCNView否则可用。实际上,您可能想要为此设置方便的功能...

var canUseARKit: Bool {
    if #available(iOS 11.0, *) {
        return ARWorldTrackingSessionConfiguration.isSupported
    } else {
        return false
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以条件化您的视图设置:

override func viewDidLoad() {
    super.viewDidLoad()
    let sceneView: SCNView
    if canUseARKit {
        sceneView = ARSCNView(frame: view.bounds)
    } else {
        sceneView = SCNView(frame: view.bounds)
    }
    sceneView.scene = // ... set up your SceneKit scene ...
    view.addSubview(sceneView)
}
Run Code Online (Sandbox Code Playgroud)

当然,此后还有更多工作要做:

  • 使用ARKit时,您可以“免费”获得摄像机控制;单独使用SceneKit时,您必须考虑将相机放置在何处以及如何让用户控制它。(有关新的iOS 11相机控件,请查看WWDC17 SceneKit会话以获取一些提示。)
  • 当您单独使用SceneKit时,您的3D内容将定义用户与之交互的“世界”-即,您将相机等与您的内容相关联。使用ARKit时,您必须考虑相对于现实世界放置内容的位置和方式。

但是除了这些担心之外,在其中使用SceneKit内容与在中使用SceneKit内容ARSCNView没有什么不同SCNView,因此对于其余的应用程序/游戏,您可以在AR和非AR用户体验之间共享大量代码和资产。