unity tutorial example apple ios swift arkit

ios - example - arkit tutorial



Cómo mantener ARKit SCNNode en su lugar (1)

Hey estoy tratando de averiguar. Cómo mantener un nodo simple en su lugar. Mientras camino alrededor en ARKit

Código:

func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) { if let planeAnchor = anchor as? ARPlaneAnchor { if planeDetected == false { // Bool only allows 1 plane to be added planeDetected = true self.addPlane(node: node, anchor: planeAnchor) } } }

Esto agrega el SCNNode

func addPlane(node: SCNNode, anchor: ARPlaneAnchor) { // We add the anchor plane here let showDebugVisuals = Bool() let plane = Plane(anchor, showDebugVisuals) planes[anchor] = plane node.addChildNode(plane) // We add our custom SCNNode here let scene = SCNScene(named: "art.scnassets/PlayerModel.scn")! let Body = scene.rootNode.childNode(withName: "Body", recursively: true)! Body.position = SCNVector3.positionFromTransform(anchor.transform) Body.movabilityHint = .movable wrapperNode.position = SCNVector3.positionFromTransform(anchor.transform) wrapperNode.addChildNode(Body) scnView.scene.rootNode.addChildNode(wrapperNode)

He intentado agregar un plano / nodo de anclaje y colocar el nodo "Cuerpo" en eso pero aún se mueve. Pensé que tal vez tiene algo que ver con la función de actualización.

func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor) { }

O lo más probable es que el ajuste de posición

wrapperNode.position = SCNVector3.positionFromTransform(anchor.transform)

Iv''e examinó todos los archivos / videos de fuentes / proyectos en Internet y nadie tiene una solución simple para este simple problema.


Hay dos tipos de "movimiento" que podrían estar ocurriendo aquí.

Una es que ARKit está refinando continuamente su estimación de cómo la posición del dispositivo en el mundo real se corresponde con el espacio de coordenadas abstracto en el que está colocando el contenido virtual. Por ejemplo, suponga que coloca un objeto virtual en (0, 0, -0.5) y luego mueva su dispositivo hacia la izquierda exactamente 10 cm. El objeto virtual aparecerá anclado en el espacio físico solo si ARKit realiza un seguimiento preciso del movimiento. Pero la odometría visual-inercial no es una ciencia exacta, por lo que es posible que ARKit piense que se movió a la izquierda en 10,5 cm. En ese caso, su objeto virtual parecerá "deslizarse" hacia la derecha en 5 mm, aunque Posición en el espacio de coordenadas ARKit / SceneKit.

Realmente no se puede hacer mucho al respecto, aparte de esperar que Apple fabrique dispositivos con mejores sensores, mejores cámaras o mejores CPU / GPU y mejore la ciencia del rastreo mundial. (En la plenitud del tiempo, probablemente sea una apuesta segura, aunque probablemente no ayude con su proyecto actual).

Ya que también estás tratando con la detección de aviones, hay otra arruga. ARKit está refinando continuamente sus estimaciones de dónde se encuentra un plano detectado. Entonces, aunque la posición en el mundo real del plano no está cambiando, su posición en el espacio de coordenadas ARKit / SceneKit sí lo está.

Este tipo de movimiento generalmente es bueno: si desea que su objeto virtual aparezca anclado a la superficie del mundo real, debe estar seguro de dónde se encuentra esa superficie. Verá algo de movimiento a medida que la detección de planos se sienta más segura de la posición de la superficie, pero después de un corto tiempo, debería ver menos "deslizamiento" cuando mueva la cámara para objetos virtuales anclados en el plan que aquellos que simplemente flotan en el mundo. espacio.

Sin embargo, en su código, no está aprovechando la detección de planos para hacer que su contenido personalizado (de "PlayerModel.scn") se pegue al ancla del plano:

wrapperNode.position = SCNVector3.positionFromTransform(anchor.transform) wrapperNode.addChildNode(Body) scnView.scene.rootNode.addChildNode(wrapperNode)

Este código usa la posición inicial del ancla del plano para colocar wrapperNode en el espacio mundial (porque lo estás convirtiendo en un elemento secundario del nodo raíz). Si, en cambio, hace de wrapperNode un elemento secundario del nodo del ancla del plano (el que recibió en el renderer(_:didAdd:for:) ), permanecerá unido al plano ya que ARKit refina su estimación de la posición del plano. Inicialmente obtendrá un poco más de movimiento, pero a medida que la detección de planos se "asienta", su objeto virtual se "deslizará" menos.

(Cuando hace que el nodo sea un elemento secundario del plano, no necesita establecer su posición: una posición de cero significa que está justo donde está el plano. Inf cualquier cosa, debe establecer su posición solo con relación al plano, es decir, qué tan arriba / abajo / a lo largo de él)