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