Pregunta

Estoy teniendo un problema de pensamiento y búsqueda aquí y no puedo encontrar la buena dirección para mirar ... Estoy buscando desarrollar un algoritmo para moverme en una imagen de 360 (esfera como) usando el movimiento del dispositivo.

Entonces, si el usuario apunta el dispositivo delante de él, obtiene el punto de origen determinado de la imagen.Mientras mueve el dispositivo a su alrededor, la imagen panorámica se mueve de acuerdo a ella.

¿Alguna idea o fuente que pueda mirar?

Gracias y buena suerte a todos con SWIFT :)

¿Fue útil?

Solución

Veo dos formas fáciles de implementar esto sin problemas de matemáticas:

  1. Utilice los ángulos EULER, es decir, el Roll propiedad de cmattitude . Defina un mapeo entre el ancho de la imagen y el ángulo medido y cuida la singularidad a 180 ° / -180 °. Inconveniente de este enfoque:
    • Posible peligro de Gimbal Lock Cuando los usuarios comienzan a mover sus dispositivos de manera caótica.
    • lo mismo se aplica a la extensibilidad con respecto a una vista completa 3D.
  2. Usa el campo magnético de cmdevicemotion que es robusto contra la cerradura de Gimbal. El magnetómetro es un poco más lento que el acelerómetro / gyro, pero creo que el algoritmo de fusión de Coremotion proporcionará una estimación razonable para que este no sea el punto. Inconvenientes aquí:
    • El campo magnético no siempre está disponible o tiende a ser impreciso de Slighlty.
    • extenderlo a la vista 3D podría ser una molestia.
  3. Ambos enfoques deben ser bastante fáciles de implementar y, por lo tanto, comenzaría con uno de ellos. Si lo desea, debe tener una solución más sofisticada, deberá sumergirse un poco más en las matemáticas. En este caso, una solución PPOSIBLE puede ser usar el dispositivo actual normal (s. Por ejemplo, Encontrar vector normal al dispositivo iOS ), proyectarlo en el plano de la tierra Suface y tomar el delta de los ángulos para el panorama cilíndrico.

    La proyección de la esfera es incluso más fácil en este caso, ya que puede usar el vector nomal directamente.

Otros consejos

Gracias a Kay, podría estar en el camino correcto para lograr este efecto.

Estoy haciendo esta respuesta solo para proporcionar más detalles para aquellos que buscan lo mismo.

Primero necesitas crear un objeto CMMotionManager.

Luego use STARTDEVICEMOTIONUPDATESTOQUEUE para manejar eventos de movimiento.

[self.motionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue currentQueue] withHandler:^(CMDeviceMotion *motion, NSError *error) {
    [self processMotion];
}];

En proceso, solo necesita obtener la actitud basada en la anterior:

// Get attitude difference with previous one
CMAttitude *currentAttitude = self.motionManager.deviceMotion.attitude;
[currentAttitude multiplyByInverseOfAttitude:self.referenceAttitude];

Gracias a esto, conoce el nuevo ángulo hecho por el usuario desde la última actualización. Luego, donde maneja su vista, convierte el nuevo ángulo EULER en la cantidad de píxeles que necesita para mover su imagen. Solo tenga cuidado del ángulo Euler varía entre -180, 180 y se dan en RAD por Apple.Esto podría ser útil:

#define RADIANS_TO_DEGREES(radians) ((radians) * (180.0 / M_PI))

En mi caso, simplemente calcule el nuevo desplazamiento X porque solo estoy moviéndome en el eje X.

Espero que esto ayude.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top