swift scenekit augmented-reality arkit

swift - ARKit-Obtener la posición actual de ARCamera en una escena



scenekit augmented-reality (2)

Establecerse como el ARSession.delegate . session(_:didUpdate:) puede implementar la session(_:didUpdate:) que le dará un ARFrame para cada marco procesado en su sesión. El marco tiene una propiedad de camera que contiene información sobre la transformación, rotación y posición de las cámaras.

func session(_ session: ARSession, didUpdate frame: ARFrame) { // Do something with the new transform let currentTransform = frame.camera.transform doSomething(with: currentTransform) }

Como rickster señaló, siempre puede obtener el ARFrame actual y la posición de la cámara a través de él llamando a session.currentFrame . Esto es útil si necesita la posición solo una vez, por ejemplo, para mover un nodo donde ha estado la cámara, pero debe usar el método de delegate si desea obtener actualizaciones sobre la posición de la cámara.

Estoy en el proceso de aprender ARKit y Scenekit simultáneamente, y ha sido un reto.

Con la creación de una sesión ARWorldTrackingSessionConfiguration, me preguntaba si alguien sabía de una manera de obtener la posición de la ''cámara'' del usuario en la sesión de escena. La idea es que quiero animar un objeto hacia la posición actual del usuario.

let reaperScene = SCNScene(named: "reaper.dae")! let reaperNode = reaperScene.rootNode.childNode(withName: "reaper", recursively: true)! reaperNode.position = SCNVector3Make(0, 0, -1) let scene = SCNScene() scene.rootNode.addChildNode(reaperNode) // some unknown amount of time later let currentCameraPosition = sceneView.pointOfView?.position let moveAction = SCNAction.move(to: currentCameraPosition!, duration: 1.0) reaperNode.runAction(moveAction)

Sin embargo, parece que currentCameraPosition siempre es [0,0,0], aunque estoy moviendo la cámara. ¿Alguna idea de lo que estoy haciendo mal? Finalmente, la idea es rotar el objeto alrededor de una esfera invisible hasta que esté frente a la cámara y luego animarlo, haciendo algo similar a esto: Rotar el nodo de SCNCamera mirando un objeto alrededor de una esfera imaginaria (de esa manera el usuario ve el objeto anima hacia ellos)

Gracias por cualquier ayuda.


Sé que se resolvió, pero tengo una pequeña solución para él ... Preferiría agregar un método de delegado de representación ... es un método en ARSCNViewDelegate

func renderer(_ renderer: SCNSceneRenderer, willRenderScene scene: SCNScene, atTime time: TimeInterval) { guard let pointOfView = sceneView.pointOfView else { return } let transform = pointOfView.transform let orientation = SCNVector3(-transform.m31, -transform.m32, transform.m33) let location = SCNVector3(transform.m41, transform.m42, transform.m43) let currentPositionOfCamera = orientation + location print(currentPositionOfCamera) }

por supuesto que no puede, por defecto, agregar los dos SCNVector3 fuera de la caja ... así que necesita pegar fuera de la clase lo siguiente

func +(lhv:SCNVector3, rhv:SCNVector3) -> SCNVector3 { return SCNVector3(lhv.x + rhv.x, lhv.y + rhv.y, lhv.z + rhv.z) }