Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios ArkitAPI示例_Ios_Swift_Augmented Reality_Arkit - Fatal编程技术网

Ios ArkitAPI示例

Ios ArkitAPI示例,ios,swift,augmented-reality,arkit,Ios,Swift,Augmented Reality,Arkit,我正试图了解苹果的ArkitAPI,我已经把他们的API推到了GitHub上 在这个演示/示例项目中,您可以在环境中移动手机摄像头,它会自动检测平面,并在摄像头位于该平面中心的位置放置一组对焦正方形。然后,如果您按下+UI按钮并从多个对象中选择一个,则灯光、杯子、花瓶等将渲染该虚拟对象以代替焦点方块。你可以在行动中看到这一切,这可能比我试图解释它要好 我试图在代码中找到虚拟对象在屏幕上实际被调用和呈现的位置。这将是在它被选中之后,我认为会发生: 但本质上,用户选择一个虚拟对象,然后将其渲染到焦点

我正试图了解苹果的ArkitAPI,我已经把他们的API推到了GitHub上

在这个演示/示例项目中,您可以在环境中移动手机摄像头,它会自动检测平面,并在摄像头位于该平面中心的位置放置一组对焦正方形。然后,如果您按下+UI按钮并从多个对象中选择一个,则灯光、杯子、花瓶等将渲染该虚拟对象以代替焦点方块。你可以在行动中看到这一切,这可能比我试图解释它要好

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


但本质上,用户选择一个虚拟对象,然后将其渲染到焦点广场当前所在的位置-我正在寻找发生这种情况的位置,有什么想法吗?

它添加了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)
        }
    }
}

你很接近。performsgue函数应该告诉您,该操作发生在另一个ViewController中,在本例中是ViewController+ObjectSelection.swift,更具体地说,是virtualObjectSelectionViewController,didSelectObjectAt index:Int。谢谢@axelspark+1-看起来像是virtualObjectManager.loadVirtualObject是将对象加载到屏幕上某个特定位置的地方?是的,但不会加载到设备屏幕上的某个特定位置。该函数的第三个参数将屏幕局部坐标转换为现实世界的全局坐标,这样您就可以将相机视图移出设备的屏幕,但当您移动相机时,对象仍然保持在相同的位置。谢谢@leandrodemarco+1-所以看起来像virtualObjectManager.loadVirtualObject是ARKit将虚拟对象实际加载到屏幕上特定位置的函数?欢迎使用。实际上,如果您开始深入研究该调用,您将看到它在setNewVirtualObjectPosition函数中设置virtualObject节点位置。边注,该属性是更多的SCNKIT比ARKITY属性AHH再次感谢@ LeANDRODIMARCO + 1,它听起来像SCNKIT有点像苹果的OpenGL图形库作为ARKIT的基础?再次感谢!我真的不知道SceneKit在引擎盖下是如何处理和渲染的,但我猜它使用的是金属。ARKit可以与用于3D对象的SceneKit、用于2D的SpriteKit或用于自定义渲染的Metal协同工作。如果创建新项目和增强现实应用程序模板,您可以看到一个使用SpriteKit的基本示例。在这里,您可以选择您希望ARKit使用的3个框架中的哪一个。
    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)
        }
    }
}