【问题标题】:ARKit API by exampleARKit API 示例
【发布时间】:2017-09-12 11:06:45
【问题描述】:

我正在尝试围绕 Apple 的 ARKit API 进行思考,我已将他们的 example ARKitExample project 推送到 GitHub。

在此演示/示例项目中,您将手机摄像头在您的环境中移动,它似乎会自动检测平面并在您的摄像头居中的位置放置一组“焦点方块”那个表面。如果您随后按下"+" UI 按钮并从多个对象(灯、杯子、花瓶等)中选择一个,它将渲染该虚拟对象以代替焦点方块。您可以在right here 中看到所有这些,这可能比我试图解释它更好!

我试图在代码中找到实际调用虚拟对象并在屏幕上呈现的位置。这将是在它被选中之后,我认为发生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)
}

但本质上,用户选择了一个虚拟对象,然后在焦点方块当前所在的任何地方渲染它——我正在寻找发生这种情况的地方,有什么想法吗?

【问题讨论】:

  • 你很接近。 performSegue 函数应该告诉您该操作发生在另一个 ViewController 中,在本例中为 ViewController+ObjectSelection.swift,更具体地说,virtualObjectSelectionViewController(_: VirtualObjectSelectionViewController, didSelectObjectAt index: Int)
  • 谢谢@axelspark (+1) - 所以看起来virtualObjectManager.loadVirtualObject 是对象被加载到屏幕上特定位置的地方?
  • 它会被加载,但不会加载到设备屏幕上的特定位置。该函数的第三个参数将“屏幕局部”坐标转换为“真实世界全局”坐标,因此您可以将相机视图“移出设备屏幕”,但当您移动相机时,对象仍保持在同一位置返回

标签: ios swift augmented-reality arkit


【解决方案1】:

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

【讨论】:

  • 啊,谢谢@leandrodemarco (+1) - 所以看起来virtualObjectManager.loadVirtualObject 是ARKit 函数,它实际上将虚拟对象加载到屏幕上的特定位置?
  • 不客气。实际上,如果您开始深入研究该调用,您会发现它在setNewVirtualObjectPosition 函数中设置了virtualObject(节点)位置。旁注,该属性更像是 SCNKit 而不是 ARKit
  • 啊,再次感谢@leandrodemarco(再次+1),并且它听起来 像SCNKit 有点像Apple 的OpenGL(图形库)作为ARKit 的基础?再次感谢!
  • 我真的不知道 SceneKit 如何在后台处理和渲染,但我猜它使用了 Metal。 ARKit 可以与用于 3D 对象的 SceneKit、用于 2D 的 SpriteKit 或用于自定义渲染的 Metal 结合使用。如果您创建一个新项目和增强现实应用程序模板,您可以看到一个使用 SpriteKit 的基本示例。在那里,您可以选择您希望 ARKit 使用这 3 个框架中的哪一个。
猜你喜欢
  • 2019-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-21
  • 2018-12-10
  • 1970-01-01
  • 2012-07-22
相关资源
最近更新 更多