在iOS10中替换ARKit

时间:2017-07-26 16:09:45

标签: ios arkit

我想在一个专为iOS10 +设计的应用中包含ARKit,如果iOS版本<11,我会用SceneKit替换ARKit。

不幸的是,目前似乎无法做到这一点?

3 个答案:

答案 0 :(得分:5)

根据您设定期望的方式,可以将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)
}

一旦你做了类似的事情,你可以将关键部分包装在条件中,在可用时使用ARSCNView,否则使用SCNView。实际上,您可能想为此设置一个方便的功能......

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

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

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)
}

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

  • 当您使用ARKit时,您可以“免费”获得相机控制权;当你自己使用SceneKit时,你必须考虑放置相机的位置以及如何让用户控制它。 (查看WWDC17 SceneKit session以获取有关新iOS 11相机控件的一些提示。)
  • 当您自己使用SceneKit时,您的3D内容定义了用户与之交互的“世界” - 也就是说,您将相机等与内容相关联。使用ARKit时,您必须考虑将内容放在何处以及如何放置相对于现实世界。

但除了这些问题之外,使用ARSCNView中的SceneKit内容与使用SCNView中的SceneKit内容没什么不同,因此对于你的应用程序/游戏的其余部分,你可以分享很多代码AR与非AR用户体验之间的资产。

答案 1 :(得分:3)

您可以使用以下语法有条件地选择包含功能:

if #available(iOS 11.0, *) {
    // Use ARKit
} else {
   // Use SceneKit
}

答案 2 :(得分:0)

与任何框架一样,ARKit存在于其存在的系统版本中,并且不存在于其他系统版本中。 ARKit存在于iOS 11中,而不是iOS 10或之前。 iOS 10用户永远不会使用ARKit(无需升级到iOS 11)。

(即使这样,ARKit也只能用于运行iOS 11的设备子集,因为它的功能高度依赖于硬件。)