iOS – Cálculo de distancia, acimut, elevación y position relativa (Realidad aumentada)

Estoy comenzando a build una aplicación de realidad aumentada donde puedes colocar una image en la pantalla en la vista de la camera de realidad aumentada y permanece en esa position en la Tierra, para que otra persona con su vista de camera pueda verla y verla aumentada vista de camera de realidad Para esto sé que necesito calcular algún tipo de factor de distancia junto con azimut y elevación.

Entonces, ya he descubierto cómo enviar los charts del object a un server y recuperarlos, pero ¿cómo puedo volver a ubicarlo en su position original, en relación con la Tierra? Sé que necesito calcular su:

  • Altitud
  • Coorderadas
  • Azimut
  • Elevación
  • Distancia

Pero cómo los calcularía y los contabilizaría / los uniría. Espero entiendas lo que quiero decir.

Para refinar tu comprensión, déjame darte una breve demostración de la aplicación:

Un hombre está en su casa, decide colocar una image de una pintura en una de sus panetworkinges. Abre la aplicación que por defecto es la pantalla de realidad aumentada, presiona el button de más y agrega una image de su biblioteca de fotos. Detrás de escena, guarda la location y los datos de position hasta un server, alguien con la aplicación y su pantalla de realidad aumentada llega, sube al server y encuentra imágenes guardadas cerca, luego descarga la image y la coloca en el muro para que el otro hombre pueda verlo con su teléfono cuando lo mueve.

¿Qué enfoque debo tomar para lograr esto? Cualquier esquema, enlaces, resources, tutoriales, pensamientos, experiencia, etc. ¡Gracias! Esta fue una pregunta generalmente difícil de escribir, espero que puedan entender. Si no, por favor dímelo y volveré a escribir.

Rohan

Estoy trabajando en dos aplicaciones AR iOS que hacen lo siguiente: convertir el azimut (brújula, ángulo horizontal) y la elevación (giroscopio, ángulo vertical) a una position en el espacio 3D (por ej., Esférico a cartesiano).

Los frameworks que necesita son:

  • CoreLocation
  • CoreMotion

Obtener la geolocation (coorderadas) es bastante sencillo para la latitud, la longitud y la altitud. Puede encontrar fácilmente esta información en varias fonts en línea, pero esta es la llamada principal que necesita desde CLLocationManagerDelegate después de llamar a 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; } 

Obtener el ángulo acimut también es bastante sencillo, utilizando el mismo delegado que la location después de llamar a startUpdatingHeading :

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

La elevación se extrae del giroscopio, que no tiene un delegado pero también es fácil de configurar. La llamada tiene este aspecto (nota: esto funciona para que mi aplicación se ejecute en modo horizontal, comtesting la tuya):

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

Finalmente, puede convertir sus coorderadas de orientación en un punto 3D como:

 - (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); } 

Para esta última parte, tenga mucho cuidado con las convenciones de denominación de angularjs y ejes, ya que varían enormemente de una fuente a otra. En mi sistema, θ es el ángulo en el plano horizontal, φ es el ángulo en el plano vertical, x es de izquierda a derecha, y está hacia abajo, y z está de atrás de frente.

En cuanto a la distancia, no estoy seguro de que realmente necesites usarlo, pero si lo haces, simplemente sustitúyelo por "radio".

Espero que ayude

Swift 3

Actualización del código del giroscopio:

 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)") }