使用 ARKit 和 SCNKit 定位虚拟资产

Positioning virtual assets with ARKit and SCNKit

我正在尝试更好地理解 SCNKit 和 ARKit 并有一个准系统 Xcode 部署了 9 个增强现实应用程序并在我的 iPhone 上工作(我将其用作简单测试设备)。

此应用程序的源代码是 here

基本上,应用程序启动,相机初始化,它在场景(世界视图)内渲染 3D 战斗机,其方式类似于 Pokemon Go 将怪物注入您的相机视口(无论您将相机指向何处)在)。很酷!

这段代码全部由 Xcode 为我 auto-generated 编写。因此,我试图了解确定 位置 到 position/orient 战斗机的逻辑所在(标题为 art.scnassets/ship.scn 的 SCN 文件)。从 here 我们看到喷气式飞机正在装载:

override func viewDidLoad() {
    super.viewDidLoad()
    
    // Set the view's delegate
    sceneView.delegate = self
    
    // Show statistics such as fps and timing information
    sceneView.showsStatistics = true
    
    // Create a new scene
    print("Hello there Mr. Zac")
    
    let scene = SCNScene(named: "art.scnassets/ship.scn")!
    
    // Set the scene to the view
    sceneView.scene = scene
}

但我不明白该应用程序如何选择 位置来放置 jet/ship 并将其定向到哪个方向。我问是因为作为第一步,我想尝试重新定位喷气式飞机,然后将其换成我自己的资产文件。

那个"logic"如有,住在两地

  1. ship.scn 文件不仅定义了模型,还定义了模型在场景中的位置。 (也就是说,在全局 "world" 坐标 space 中。)

    在该 Xcode 项目模板中附带的 scn 文件中,模型位于类似 0, 0, -0.5 的位置,因此如果将相机放置在坐标原点系统,船直接出现在镜头前,距离半米。

  2. ARKit 本身定义 scene/world space 相对于设备的初始真实世界 position/orientation。 By default,该坐标系的 z 轴与设备的初始方向匹配,因此当您启动 AR 会话时,任何放置在 "in front of" 坐标原点的东西都会出现在相机前面。