web-dev-qa-db-fra.com

ARKit avec plusieurs utilisateurs

Quel est le meilleur moyen, le cas échéant, d’utiliser le nouvel ARKit d’Apple avec plusieurs utilisateurs/appareils?

Il semble que chaque appareil obtienne sa propre scène individuellement. Ma meilleure hypothèse à ce jour est d’utiliser des positions brutes de points de caractéristiques et d’essayer de les faire correspondre sur différents appareils pour coller les différents points de vue, car ARKit n’offre aucune référence référentielle absolue.

=== Edit1, les choses que j'ai essayées ===

1) Points caractéristiques

J'ai joué avec les points bruts exposés et je suis maintenant convaincu que dans leur état actuel, ils sont une impasse:

  • ils ne sont pas des points de caractéristiques bruts, ils exposent uniquement les positions mais aucun des attributs généralement trouvés dans les points de suivi suivis
  • leur instanciation ne se poursuit pas d'une image à l'autre, et les positions ne sont pas exactement les mêmes
  • il arrive souvent que les points caractéristiques rapportés changent beaucoup lorsque l'entrée de la caméra ne change presque pas, beaucoup apparaissant ou disparaissant.

Donc dans l’ensemble, je pense qu’il est déraisonnable d’essayer de les utiliser de manière significative, ne pas être en mesure de faire un bon point d’appariement au sein d’un même appareil, et encore moins plusieurs . Alternative permettrait d’implémenter ma propre détection et correspondance de points caractéristiques, mais ce serait plus remplacer ARKit que de l'exploiter.

2) code QR

Comme @Rickster l’a suggéré, j’ai également essayé d’identifier un objet facilement identifiable, tel qu’un code QR, et d’obtenir le changement de référentiel relatif à partir de ce point fixe (voir cette question ). C’est un peu difficile et cela m’implique de faire appel à openCV pour estimer pose de la caméra. Mais plus important encore très limitant

26
Guig

Maintenant, après avoir publié ARKit 2.0 à la WWDC 2018, il est possible de créer des jeux pour 2 à 6 utilisateurs. 

Pour cela, vous devez utiliser la classe ARWorldMap. En enregistrant world maps et en les utilisant pour démarrer de nouvelles sessions, votre application iOS peut désormais ajouter de nouvelles fonctionnalités de réalité augmentée: expériences multi-utilisateurs et persistantes.

AR Expériences multi-utilisateurs. Vous pouvez maintenant créer un cadre partagé d'une référence en envoyant des objets ARWorldMap archivés à un iPhone ou à un iPad proche. Avec plusieurs appareils suivant simultanément le même world map, vous pouvez créer une expérience dans laquelle tous les utilisateurs (jusqu'à 6) peuvent partager et voir le même contenu 3D virtuel (utilisez le nouveau format de fichier USDZ de Pixar pour la 3D dans Xcode 10 et 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 Expériences persistantes. Si vous enregistrez un world map et que votre application iOS devient inactive, vous pouvez facilement la restaurer au prochain lancement de l'application et dans le même environnement physique. Vous pouvez utiliser ARAnchors à partir du world map repris pour placer le même contenu 3D virtuel (au format USDZ ou DAE) aux mêmes positions de la session enregistrée précédente.

3
ARGeo

Comme certaines réponses plus récentes l'ont ajouté, l'AR multi-utilisateur est une fonctionnalité clé d'ARKit 2 (également appelé ARKit sur iOS 12). _ { La conférence WWDC18 sur ARKit 2 } _ a une vue d'ensemble de Nice et Apple propose deux exemples de projets de code à l'intention des développeurs pour vous aider à démarrer: un exemple de base qui intègre à partir de 2 périphériques plus une expérience partagée. et SwiftShot _, un vrai jeu multijoueur conçu pour AR.

Les points principaux:

  1. ARWorldMap encapsule tout ce que ARKit sait à propos de l'environnement local dans un objet sérialisable afin que vous puissiez le sauvegarder pour plus tard ou l'envoyer à un autre appareil. Dans ce dernier cas, la "relocalisation" sur une carte du monde enregistrée par un autre appareil du même environnement local confère aux deux appareils le même cadre de référence (système de coordonnées du monde).

  2. Utilisez la technologie de réseau de votre choix pour envoyer la ARWorldMap entre appareils: AirDrop, les partages en nuage, pigeon voyageur, etc., tout fonctionne, mais le Multipeer Connectivity Framework d’Apple est une option efficace, simple et sécurisée. C’est donc ce que Apple utilise dans ses exemples de projets. 

  3. Tout cela ne vous donne que la base pour créer une expérience partagée: plusieurs copies de votre application sur plusieurs appareils, le tout utilisant un système de coordonnées mondial s'alignant sur le même environnement réel. C’est tout ce dont vous avez besoin pour que plusieurs utilisateurs utilisent le même contenu static AR, mais si vous voulez qu’ils interact dans AR, vous devez utiliser davantage votre technologie de réseau préférée. 

    La démo de base de l'AR multi-utilisateur d'Apple montre comment encoder une ARAnchor Et l'envoyer à ses pairs, de sorte qu'un utilisateur puisse appuyer pour placer un modèle 3D Dans le monde et que tous les autres puissent le voir. Le exemple de jeu SwiftShot construit un protocole réseau complet de sorte que tous les utilisateurs bénéficient des mêmes actions de jeu (comme se lancer des frondes, ainsi que des résultats de physique synchronisés (comme des blocs qui tombent après avoir été frappés). Les deux utilisent Multipeer Connectivity .

(BTW, les deuxième et troisième points ci-dessus sont ceux où vous obtenez le chiffre "2 à 6" de réponse de @ andy - il n'y a pas de limite du côté d'ARKit, car ARKit n'a aucune idée du nombre de personnes qui ont pu en recevoir Cependant, Multipeer Connectivity a une limite de 8 pairs et quel que soit le jeu/l'application/l'expérience que vous construisez, vous risquez de rencontrer des problèmes de latence/de performances lorsque vous ajoutez des pairs, mais cela dépend de votre technologie et de votre conception. .)

Réponse originale ci-dessous pour l'intérêt historique ...


Cela semble être un domaine de recherche actif dans la communauté des développeurs iOS - j'ai rencontré plusieurs équipes qui tentaient de le comprendre à WWDC la semaine dernière et personne n'avait encore commencé à le résoudre. Je ne suis donc pas sûr qu'il existe encore un "meilleur moyen", voire même un moyen réalisable. 

Les points caractéristiques sont positionnés par rapport à la session et ne sont pas identifiés individuellement. J'imagine que leur corrélation entre plusieurs utilisateurs serait délicate. 

Le mode d'alignement de session gravityAndHeading pourrait s'avérer utile: cela corrige toutes les directions vers un cadre de référence absolu (supposé/estimé), mais positions sont toujours relatives à l'endroit où le périphérique était quand la session a commencé. Si vous pouviez trouver un moyen de relier cette position à quelque chose d'absolu - un lat/long ou un iBeacon peut-être - et le faire de manière fiable, avec suffisamment de précision ... Eh bien, vous n'auriez pas seulement un cadre de référence qui pourrait être partagé par plusieurs utilisateurs, vous auriez également les ingrédients principaux pour la RA basée sur la localisation. (Vous savez, comme une flèche virtuelle flottante qui indique tourner là-bas pour se rendre à la porte A113 de l'aéroport ou peu importe.)

L'analyse d'image est une autre avenue dont j'ai entendu parler. Si vous pouviez placer de vrais marqueurs - des éléments facilement reconnaissables comme les codes QR - à la vue de plusieurs utilisateurs, vous pourriez peut-être utiliser une forme de reconnaissance ou de suivi d'objet (un modèle ML, peut-être?) Pour identifier avec précision les positions et les orientations des marqueurs. par rapport à chaque utilisateur, puis recommencez pour calculer un cadre de référence partagé. Je ne sais pas comment cela pourrait être possible. (Mais si vous suivez cette voie, ou similaire, notez que ARKit expose un tampon de pixels } pour chaque image de caméra capturée.)

Bonne chance! 

10
rickster

Les réponses ne sont pas des solutions pare-balles mais plutôt des solutions de contournement, mais vous les trouverez peut-être utiles. Tous supposent que les joueurs sont au même endroit.

  1. DIYARKit configure son système de coordonnées mondial rapidement après le démarrage de la session AR. Donc, si vous pouvez avoir tous les joueurs, les uns après les autres, placer et aligner leurs appareils sur le même emplacement physique et les laisser commencer la session là-bas. Imaginez les bords intérieurs d'une règle carrée en L fixée sur ce qui est disponible. Ou toute surface plane trouée: maintenez le téléphone sur la surface en regardant à travers le trou avec l'appareil photo, initiez-vous à une session.

  2. Moyen Enregistrez le lecteur en alignant le téléphone manuellement, au lieu de cela, détectez un marqueur du monde réel avec une analyse d'image, comme décrit par @Rickster.

  3. Impliqué Entraînez un modèle Core ML à reconnaître les iPhones et les iPads ainsi que leur emplacement. Comme si c'était fait avec le visage et les yeux humains. Regroupez les données sur un serveur, puis désactivez ML pour économiser de l'énergie. Remarque: assurez-vous que votre modèle est à l'abri de la couverture. :)

1
diviaki

C’est un problème extrêmement difficile - la startup la plus importante qui y travaille est 6D.ai .

"AR multijoueur" est le même problème que le SLAM persistant, où vous devez vous positionner sur une carte que vous n'avez peut-être pas construite. C’est le problème sur lequel la plupart des constructeurs automobiles travaillent activement.

0
Jordan

Je suis en train de mettre à jour la structure de mon contrôleur de jeu ( https://github.com/robreuss/VirtualGameController ) afin de prendre en charge une fonctionnalité de contrôleur partagé, afin que tous les périphériques reçoivent les entrées des éléments de contrôle sur les écrans de tous les dispositifs. Le but de cette amélioration est de prendre en charge la fonctionnalité multijoueur basée sur ARKit. Je suppose que les développeurs utiliseront la première approche mentionnée par diviaki, où le positionnement général de l’espace virtuel est défini en démarrant la session sur chaque périphérique à partir d’un point commun dans l’espace physique, d’une référence partagée et, plus précisément, de mon esprit. sur les côtés opposés d'une table. Tous les appareils lanceraient le jeu en même temps et utiliseraient un espace de coordonnées commun par rapport à leur taille physique. En utilisant les entrées de tous les contrôleurs, le jeu resterait théoriquement synchronisé sur tous les appareils. Toujours en test. Le problème potentiel évident est la latence ou les perturbations sur le réseau et la synchronisation se désagrège, et il serait difficile à récupérer sauf en redémarrant le jeu. L'approche et la structure peuvent fonctionner assez bien pour certains types de jeux - par exemple, les jeux simples de style arcade, mais certainement pas pour beaucoup d'autres - par exemple, tout jeu avec un caractère aléatoire important qui ne peut pas être coordonné sur plusieurs appareils. 

0
Rob Reuss