在 iOS10 中替代 ARKit

  • 本文关键字:ARKit iOS10 ios arkit
  • 更新时间 :
  • 英文 :


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

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

根据您设定期望的方式,可以使用 SceneKit 作为 ARKit 的"后备"——特别是来自ARSCNView的 。

您可以轻松创建的 3D 内容体验,当在支持 ARKit 的设备上运行时,该体验通过 AR 出现在"现实世界中",在没有 ARKit 的情况下运行时,则在完全虚拟的环境中(即,在没有相机馈送作为背景的情况下以 3D 渲染

(。

注意: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 会话,了解有关新的 iOS 11 摄像机控件的一些提示。
  • 当您单独使用 SceneKit 时,您的 3D 内容定义了用户与之交互的"世界",即您放置与您的内容相关的摄像机等。使用 ARKit 时,您必须考虑将内容放置在相对于现实世界的位置和方式。

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

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

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

与任何框架一样,ARKit 存在于它存在的系统版本中,而不是其他系统版本中。ARKit 存在于 iOS 11 中,而不是在 iOS 10 或更早版本中。iOS 10 用户永远无法使用 ARKit(除非升级到 iOS 11(。

(即便如此,ARKit 也只能在运行 iOS 11 的一小部分设备上使用,因为它的功能高度依赖于硬件。

最新更新