swiftshot reality quick look augmented apps apple swift augmented-reality arkit

swift - reality - ¿Cuál es la diferencia entre usar ARAnchor para insertar un nodo e insertar directamente un nodo?



ios augmented reality (2)

SCNVector3 es simplemente "una representación de un vector de tres componentes". SCNVector3 docs .

Al utilizar ARAnchor, tiene acceso a un vector de tres componentes, pero también puede "rastrear las posiciones y orientaciones de objetos reales o virtuales en relación con los documentos de ARAnchor de la cámara". Y es por eso que usa la sesión para agregar el ancla en lugar de usar la escena.

Vea los documentos y puede ver la diferencia en términos de la API :)

Espero eso ayude.

En ARKit, he encontrado 2 formas de insertar un nodo después del hitTest

  1. Inserte un ARAnchor y luego cree el nodo en el procesador (_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode?

    let anchor = ARAnchor(transform:hit.worldTransform) sceneView.session.add(anchor:anchor)

  2. Inserte el nodo directamente

    node.position = SCNVector3(hit.worldTransform.columns.3.x, hit.worldTransform.columns.3.y, hit.worldTransform.columns.3.z) sceneView.scene.rootNode.addChildNode(node)

Ambos buscan trabajar para mí, pero ¿por qué de una manera u otra?


Actualización: a partir de iOS 11.3 (también conocido como "ARKit 1.5"), hay una diferencia entre agregar un ARAnchor a la sesión (y luego asociar el contenido de SceneKit con él a través de ARSCNViewDelegate llamada ARSCNViewDelegate ) y simplemente colocar el contenido en el espacio de SceneKit.

Cuando agrega un ancla a la sesión, le dice a ARKit que un cierto punto en el espacio mundial es relevante para su aplicación. ARKit puede realizar un trabajo adicional para asegurarse de que su espacio de coordenadas del mundo se alinee con precisión con el mundo real, al menos en la vecindad de ese punto.

Por lo tanto, si está tratando de hacer que el contenido virtual aparezca "adjunto" a algún punto de interés del mundo real, como poner un objeto en una mesa o en una pared, debería ver menos "desviación" debido a la inexactitud del seguimiento mundial si da ese objeto es un ancla que si lo colocas en el espacio de SceneKit. Y si ese objeto se mueve de una posición estática a otra, querrá quitar el anclaje original y agregar uno a la nueva posición después.

Además, en iOS 11.3 puede optar por la "relocalización", un proceso que ayuda a ARKit a reanudar una sesión después de que se interrumpe (por una llamada telefónica, cambio de aplicaciones, etc.). La sesión sigue funcionando mientras intenta averiguar cómo mapear dónde estaba antes de donde está ahora, lo que podría dar lugar a que las posiciones de los anclajes en el espacio mundial cambien una vez que la relocalización tenga éxito.

(Por otro lado, si solo estás haciendo invasores del espacio que flotan en el aire, el espacio del mundo que se adapta perfectamente no es tan importante, y por lo tanto no verás mucha diferencia entre los anclajes basados ​​y los no anclados). posicionamiento)

Vea la información sobre "Use anclajes para mejorar la calidad de rastreo alrededor de objetos virtuales" en el artículo / código de ejemplo de Interacción en 3D y Interfaz de Usuario de Manipulación 3D de Apple en Realidad Aumentada .

El resto de esta respuesta sigue siendo históricamente relevante para iOS 11.0-11.2.5 y explica algún contexto, así que lo dejo a continuación ...

Considere primero el uso de ARAnchor sin SceneKit.

  • Si está utilizando ARSKView , necesita una forma de hacer referencia a las posiciones / orientaciones en el espacio 3D (del mundo real), porque SpriteKit no es 3D. Necesita ARAnchor para realizar un seguimiento de las posiciones en 3D para que puedan asignarse en 2D.

  • Si está construyendo su propio motor con Metal (o GL, por alguna extraña razón) ... no es una API de descripción de escena en 3D, es una API de programación de GPU, por lo que realmente no tiene una noción de espacio mundial. Puede usar ARAnchor como un puente entre la noción de ARKit del espacio mundial y lo que sea que construya.

Entonces, en algunos casos, necesita ARAnchor porque esa es la única forma sensata de referirse a las posiciones 3D. (Y, por supuesto, si está utilizando la detección de planos, necesita ARPlaneAnchor porque ARKit realmente moverá esos relativos al espacio de la escena a medida que refinó sus estimaciones de dónde están los planos).

Con ARSCNView , SceneKit ya tiene un espacio de coordenadas del mundo 3D, y ARKit hace todo el trabajo de hacer que ese espacio coincida con el espacio del mundo real que ARKit proyecta. Entonces, dada una transformación float4x4 que describe una posición (y orientación, etc.) en el espacio mundial, puede:

  • Cree un ARAnchor , agréguelo a la sesión y responda a la devolución de llamada ARSCNViewDelegate para proporcionar contenido de SceneKit para cada ancla, que ARKit agregará y posicionará en la escena por usted.
  • Cree un SCNNode , establezca su simdTransform y agréguelo como un elemento secundario del rootNode de la escena.

Mientras tenga una ARSession ejecución, no hay diferencia entre los dos enfoques, son formas equivalentes de decir lo mismo. Así que si te gusta hacer las cosas a la manera de SceneKit, no hay nada de malo en eso. (Incluso puede usar SCNVector3 y SCNMatrix4 lugar de los tipos SIMD si lo desea, pero tendrá que realizar conversiones de ida y vuelta si también obtiene tipos SIMD de las API de ARKit).

La única vez que estos enfoques difieren es cuando la sesión se reinicia. Si el seguimiento mundial falla, reanuda una sesión interrumpida y / o comienza una sesión nuevamente, el "espacio mundial" puede que ya no se alinee con el mundo real de la misma manera que lo hizo cuando colocó contenido en la escena.

En este caso, puede hacer que ARKit elimine los anclajes de la sesión; consulte el método run(_:options:) y ARSession.RunOptions . (Sí, todos ellos, porque en este punto ya no puede confiar en que ninguno de ellos sea válido). Si colocó contenido en la escena utilizando anclas y devoluciones de llamada de delegado, ARKit detendrá todo el contenido. (Obtiene devoluciones de llamada de delegado que se están eliminando). Si colocó contenido con SceneKit API, permanece en la escena (pero muy probablemente en el lugar equivocado).

Por lo tanto, el tipo de uso depende de cómo desea manejar los fallos e interrupciones de la sesión (y, aparte de eso, no hay una diferencia real).