iOS – Calcul de la distance, de l'azimut, de l'altitude et de la position relative (réalité augmentée)

Je commence à build une application de réalité augmentée où vous pouvez placer une image sur l'écran de votre vue de camera de réalité augmentée et elle rest dans cette position sur la Terre, donc quelqu'un d'autre avec sa vue camera peut venir et voir sur l'écran augmenté vue de camera de réalité. Pour cela, je sais que je dois calculer une sorte de facteur de distance avec l'azimut et l'élévation.

Donc, j'ai déjà compris comment envoyer les charts de l'object à un server et le récupérer, mais comment puis-je le remettre sur sa position d'origine, par rapport à la Terre. Je sais que j'ai besoin de calculer son:

  • Altitude
  • Coordonnées
  • Azimut
  • Élévation
  • Distance

Mais comment pourrais-je les calculer et les comptabiliser / les assembler? J'espère que tu comprends ce que je veux dire.

Pour affiner votre compréhension laissez-moi vous donner une courte démo de l'application:

Un homme est chez lui, il décide de placer une image d'une peinture sur l'un de ses murs. Il ouvre l'application qui par défaut à l'écran de réalité augmentée, il appuie sur le button plus et ajoute une image de sa photothèque. Dans les coulisses, il enregistre l'location et datatables de position jusqu'à un server, quelqu'un avec l'application et son écran de réalité augmentée arrive, il monte sur le server et trouve les images sauvegardées à proximité, il télécharge ensuite l'image et la place sur le mur de sorte que l'autre homme peut le voir avec son téléphone quand il le déplace par.

Quelle approche devrais-je prendre pour y parvenir? Tout contour, liens, ressources, tutoriels, pensées, expérience, etc. Merci! C'était une question généralement difficile à écrire, j'espère que vous pouvez comprendre. Si ce n'est pas le cas, dites-le moi et je le reformulerai.

Rohan

    Je travaille sur deux applications AR iOS qui font ce qui suit: convertir l'azimut (boussole, angle horizontal) et l'élévation (gyroscope, angle vertical) à une position dans l'espace 3D (par exemple sphérique à cartésien).

    Les frameworks dont vous avez besoin sont:

    • CoreLocation
    • CoreMotion

    Obtenir la geolocation (coordonnées) est assez simple pour la latitude, la longitude et l'altitude. Vous pouvez facilement find ces informations dans plusieurs sources en ligne, mais c'est l'appel principal dont vous avez besoin dans CLLocationManagerDelegate après avoir appelé startUpdatingLocation :

     - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations { latitude = (float) manager.location.coordinate.latitude; longitude = (float) manager.location.coordinate.longitude; altitude = (float) manager.location.altitude; } 

    Obtenir l'angle d'azimut est également assez simple, en utilisant le même délégué que l'location après avoir appelé startUpdatingHeading :

     - (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading { azimuth = (float) manager.heading.magneticHeading; } 

    L'élévation est extraite du gyroscope, qui n'a pas de délégué mais est également facile à mettre en place. L'appel ressemble à ceci (note: cela fonctionne pour mon application fonctionnant en mode paysage, vérifiez le vôtre):

     elevation = fabsf(self.motionManager.deviceMotion.attitude.roll); 

    Enfin, vous pouvez convertir vos coordonnées d'orientation en un point 3D comme ceci:

     - (GLKVector3)sphericalToCartesian:(float)radius azimuth:(float)theta elevation:(float)phi { // Convert Coordinates: Spherical to Cartesian // Spherical: Radial Distance (r), Azimuth (θ), Elevation (φ) // Cartesian: x, y, z float x = radius * sinf(phi) * sinf(theta); float y = radius * cosf(phi); float z = radius * sinf(phi) * cosf(theta); return GLKVector3Make(x, y, z); } 

    Pour cette dernière partie, méfiez-vous des conventions de nommage des angles et des axes car elles varient énormément d'une source à l'autre. Dans mon système, θ est l'angle sur le plan horizontal, φ est l'angle sur le plan vertical, x est gauche-droite, y est bas, et z est arrière-avant.

    En ce qui concerne la distance, je ne suis pas sûr que vous ayez vraiment besoin de l'utiliser, mais si vous le faites, remplacez-le par "rayon".

    J'espère que cela pourra aider

    Swift 3

    Mise à jour du code du gyroscope:

     import CoreMotion ... motionManager.deviceMotionUpdateInterval = 0.1 motionManager.startDeviceMotionUpdates(to: OperationQueue.current!) { deviceManager, error in guard let dm = deviceManager else { return } let roll = dm.attitude.roll let pitch = dm.attitude.pitch let yaw = dm.attitude.yaw print("r: \(roll), p: \(pitch), y: \(yaw)") }