scanner scan recognition objective experience examples example developer apple objective-c swift ios11 arkit multiplayer

objective-c - recognition - arkit scan object



ARKit con mĂșltiples usuarios (5)

¿Cuál es la mejor manera, si la hay, de usar el nuevo ARKit de Apple con múltiples usuarios / dispositivos?

Parece que cada dispositivo tiene su propia escena de comprensión individual. Hasta ahora, lo mejor que puedo hacer es utilizar las posiciones de puntos de las características sin procesar e intentar hacer coincidirlos entre dispositivos para unir los diferentes puntos de vista, ya que ARKit no ofrece ninguna referencia de referencia absoluta.

=== Edit1, cosas que he probado ===

1) Puntos de características

He jugado un poco y con las características en bruto expuestas puntos y ahora estoy convencido de que en su estado actual son un callejón sin salida:

  • no son puntos de características en bruto, solo exponen posiciones pero ninguno de los atributos que se encuentran normalmente en los puntos de características rastreados
  • su creación de instancias no se transfiere de una trama a otra, ni las posiciones son exactamente las mismas
  • a menudo sucede que los puntos de las características reportadas cambian mucho cuando la entrada de la cámara casi no cambia, ya sea que aparezca o desaparezca mucho.

Así que, en general, creo que no es razonable tratar de usarlos de alguna manera significativa, no poder hacer ningún tipo de buena coincidencia de puntos dentro de un dispositivo, por no hablar de varios. Una alternativa sería implementar mi propia detección y comparación de puntos de función, pero eso sería más reemplazar ARKit que aprovecharlo.

2) código QR

Como @Rickster sugirió, también he intentado identificar un objeto fácilmente identificable como un código QR y obtener el cambio referencial relativo desde ese punto fijo (vea esta pregunta ). Pero lo más importante es que muy limitante


Ahora, después de lanzar ARKit 2.0 en WWDC 2018, es posible hacer juegos para 2 a 6 usuarios.

Para esto necesitas usar la clase ARWorldMap . Al guardar world maps y usarlos para iniciar nuevas sesiones, su aplicación iOS ahora puede agregar nuevas capacidades de Realidad Aumentada: experiencias multiusuario y AR persistentes.

AR Experiencias multiusuario . Ahora puede crear un marco de referencia compartido enviando objetos ARWorldMap archivados a un iPhone o iPad cercano. Con varios dispositivos que siguen simultáneamente el mismo world map , puede crear una experiencia en la que todos los usuarios (hasta 6) puedan compartir y ver el mismo contenido virtual en 3D (use el nuevo formato de archivo USDZ de Pixar para 3D en Xcode 10 y iOS 12).

session.getCurrentWorldMap { worldMap, error in guard let worldMap = worldMap else { showAlert(error) return } } let configuration = ARWorldTrackingConfiguration() configuration.initialWorldMap = worldMap session.run(configuration)

AR Experiencias persistentes . Si guarda un world map y su aplicación iOS se vuelve inactiva, puede restaurarla fácilmente en el próximo lanzamiento de la aplicación y en el mismo entorno físico. Puede usar ARAnchors del world map reanudado para colocar el mismo contenido 3D virtual (en formato USDZ o DAE) en las mismas posiciones de la sesión guardada anterior.


Como algunas respuestas más recientes se han agregado, AR multiusuario es una característica principal de ARKit 2 (también conocido como ARKit en iOS 12). La charla de WWDC18 sobre ARKit 2 tiene una buena descripción general, y Apple tiene dos proyectos de código de ejemplo de desarrollador para ayudarte a comenzar: un ejemplo básico que solo hace que 2+ dispositivos se conviertan en una experiencia compartida, y SwiftShot , un juego multijugador real creado para AR.

Los puntos principales:

  1. ARWorldMap envuelve todo lo que ARKit conoce sobre el entorno local en un objeto serializable, por lo que puede guardarlo para más tarde o enviarlo a otro dispositivo. En este último caso, la "relocalización" a un mapa del mundo guardado por otro dispositivo en el mismo entorno local proporciona a ambos dispositivos el mismo marco de referencia (sistema de coordenadas mundiales).

  2. Utilice la tecnología de red de su elección para enviar ARWorldMap entre dispositivos: AirDrop, cloud shares, carrier pigeon , etc., todo el trabajo, pero el marco de Conectividad Multipeer de Apple es una opción buena, fácil y segura, por lo que Apple utiliza en sus proyectos de ejemplo. .

  3. Todo esto le brinda solo la base para crear una experiencia compartida: múltiples copias en su aplicación en múltiples dispositivos, todo con un sistema de coordenadas mundial que se alinea con el mismo entorno del mundo real. Eso es todo lo que necesita para que varios usuarios experimenten el mismo contenido AR estático , pero si desea que interactúen en AR, necesitará usar su tecnología de red favorita un poco más.

    La demostración básica AR multiusuario de Apple muestra la codificación de un ARAnchor y el envío a sus compañeros, de modo que un usuario puede tocar para colocar un modelo 3D en el mundo y todos los demás pueden verlo. El SwiftShot construye un protocolo de red completo para que todos los usuarios obtengan las mismas acciones de juego (como disparar tirachinas) y resultados físicos sincronizados (como bloques que se caen después de ser golpeados). Ambos utilizan conectividad multipeer .

(Por cierto, el segundo y tercer punto de arriba son donde obtiene la cifra "2 a 6" de la respuesta de @yy, no hay límite en el lado de ARKit, porque ARKit no tiene idea de cuántas personas pudieron haber recibido el mapa del mundo que salvó. Sin embargo, Multipeer Connectivity tiene un límite de 8 pares. Y cualquier juego / aplicación / experiencia que construyas sobre esto puede tener problemas de escala de latencia / rendimiento a medida que agregues más pares, pero eso depende de tu tecnología y diseño.)

Respuesta original a continuación para el interés histórico ...

Este parece ser un área de investigación activa en la comunidad de desarrolladores de iOS. Conocí a varios equipos que intentaron resolverlo en WWDC la semana pasada, y aún nadie había comenzado a descifrarlo. Así que no estoy seguro de que haya una "mejor manera" todavía, si es que es posible.

Los puntos de característica se ubican en relación con la sesión y no se identifican individualmente, por lo que me imagino que correlacionarlos entre múltiples usuarios sería complicado.

El modo de alineación de sesión gravityAndHeading puede resultar útil: fija todas las direcciones a un marco de referencia absoluto (presumiblemente / estimado), pero las posiciones siguen siendo relativas a donde estaba el dispositivo cuando se inició la sesión. Si pudiera encontrar una manera de relacionar esa posición con algo absoluto (una latitud / longitud, o un iBeacon tal vez) y hacerlo de manera confiable, con suficiente precisión ... Bueno, entonces no solo tendría un marco de referencia que podría ser compartido por varios usuarios, también tendría los ingredientes principales para la AR basada en la ubicación. (Ya sabes, como una flecha virtual flotante que dice girar a la derecha para llegar a la Puerta A113 en el aeropuerto, o lo que sea).

Otra avenida que he oído hablar es el análisis de imágenes. Si pudiera colocar algunos marcadores reales (cosas fácilmente reconocibles por la máquina, como códigos QR) a la vista de múltiples usuarios, tal vez podría usar algún tipo de reconocimiento o seguimiento de objetos (¿un modelo de ML, quizás?) Para identificar con precisión las posiciones y orientaciones de los marcadores en relación con cada usuario, y trabajar desde allí para calcular un marco de referencia compartido. No sé qué tan factible podría ser eso. (Pero si va por esa ruta, o similar, tenga en cuenta que ARKit expone un búfer de píxeles para cada fotograma de cámara capturado).

¡Buena suerte!


Este es un problema muy difícil, la startup más prominente que está trabajando es 6D.ai.

"AR multijugador" es el mismo problema que un SLAM persistente, donde debes posicionarte en un mapa que quizás no hayas construido. Es el problema en el que la mayoría de las empresas automovilísticas están trabajando activamente.


Estoy en el proceso de actualizar el marco de mi controlador de juego ( https://github.com/robreuss/VirtualGameController ) para admitir una capacidad de controlador compartido, por lo que todos los dispositivos recibirían información de los elementos de control en las pantallas de todos los dispositivos. El propósito de esta mejora es admitir la funcionalidad multijugador basada en ARKit. Supongo que los desarrolladores utilizarán el primer enfoque mencionado por diviaki, donde el posicionamiento general del espacio virtual se define al iniciar la sesión en cada dispositivo desde un punto común en el espacio físico, una referencia compartida, y específicamente tengo en mente ser en lados opuestos de una mesa. Todos los dispositivos iniciarían el juego al mismo tiempo y utilizarían un espacio de coordenadas común en relación con el tamaño físico, y al usar las entradas de todos los controladores, el juego permanecería teóricamente sincronizado en todos los dispositivos. Todavía pruebas. El problema potencial obvio es la latencia o la interrupción en la red y la sincronización se desmorona, y sería difícil recuperarla excepto al reiniciar el juego. El enfoque y el marco pueden funcionar para algunos tipos de juegos bastante bien, por ejemplo, juegos sencillos de estilo arcade, pero ciertamente no para muchos otros, por ejemplo, cualquier juego con una aleatoriedad significativa que no se pueda coordinar entre dispositivos.


No a prueba de balas responde más bien a soluciones alternativas, pero tal vez las encuentre útiles. Todos asumen que los jugadores están en el mismo lugar.

  1. DIY ARKit establece su sistema de coordenadas mundial rápidamente después de que se haya iniciado la sesión de AR. Entonces, si puede tener a todos los jugadores, uno tras otro, coloque y alinee sus dispositivos en la misma ubicación física y deje que comiencen la sesión allí. Imagina los bordes internos de una regla cuadrada en L fijados a lo que esté disponible. O cualquier superficie plana con un agujero: sostenga la superficie del teléfono de nuevo mirando a través del agujero con la cámara, sesión de (re) inicio.

  2. Medio Guarde el reproductor alineando el teléfono manualmente, en lugar de eso, detecte un marcador del mundo real con análisis de imagen como lo describió @Rickster.

  3. Involucrado Entrene un modelo Core ML para reconocer iPhones y iPads y la ubicación de su cámara. Como se hace con rostro y ojos humanos. Agregue datos en un servidor, luego desactive ML para ahorrar energía. Nota: asegúrese de que su modelo sea a prueba de cubiertas. :)