ARKit API 举例

ARKit API by example

我正在努力研究 Apple 的 ARKit API,并且我已经将他们的 example ARKitExample project 推到了 GitHub。

在这个 demo/sample 项目中,您在环境中移动 phone 摄像头,它 似乎 可以自动检测平面并放置一组"focus squares" 在你的相机在那个表面上的中心位置。如果您随后从多个对象(lamp、杯子、花瓶等)中的一个按下 "+" UI 按钮和 select,它将在适当的位置渲染该虚拟对象的焦点广场。您可以看到所有这些的实际效果 right here,这可能比我试图解释的要好!

我试图在代码中找到虚拟对象实际被调用和呈现在屏幕上的位置。这将是在 selected 之后,我 认为 发生 here:

@IBAction func chooseObject(_ button: UIButton) {
    // Abort if we are about to load another object to avoid concurrent modifications of the scene.
    if isLoadingObject { return }

    textManager.cancelScheduledMessage(forType: .contentPlacement)
    performSegue(withIdentifier: SegueIdentifier.showObjects.rawValue, sender: button)
}

但本质上,用户 select 是一个虚拟对象,然后它会在焦点方块当前所在的任何位置呈现 - 我正在寻找发生这种情况的地方,有什么想法吗?

它将 virtualObject 实例(它是 SCNNode 的子类)添加为 SCNScene 根节点的子节点:

    func virtualObjectSelectionViewController(_: VirtualObjectSelectionViewController, didSelectObjectAt index: Int) {
    guard let cameraTransform = session.currentFrame?.camera.transform else {
        return
    }

    let definition = VirtualObjectManager.availableObjects[index]
    let object = VirtualObject(definition: definition)
    let position = focusSquare?.lastPosition ?? float3(0)
    virtualObjectManager.loadVirtualObject(object, to: position, cameraTransform: cameraTransform)
    if object.parent == nil {
        serialQueue.async {
            self.sceneView.scene.rootNode.addChildNode(object)
        }
    }
}