Domanda

Sto riscontrando un problema di riflessione e ricerca qui e non riesco a trovare la buona direzione a cui guardare...Sto cercando di sviluppare un algoritmo per muovermi in un'immagine a 360 gradi (come una sfera) utilizzando il movimento del dispositivo.

Quindi se l'utente punta il dispositivo davanti a sé ottiene il punto di origine determinato dell'immagine.Mentre sposta il dispositivo intorno a sé, l'immagine panoramica si sposta di conseguenza.

Qualche idea o fonte a cui posso esaminare?

Grazie e buona fortuna a tutti con Swift :)

È stato utile?

Soluzione

Vedo due semplici modi per implementarlo senza troppi problemi di matematica:

  1. Usa gli angoli di Eulero, ad es.IL roll proprietà di CMAttitude.Definisci una mappatura tra la larghezza dell'immagine e l'angolo misurato e prenditi cura della singolarità a 180° / -180°.Svantaggio di questo approccio:
    • Possibile pericolo di Blocco del giunto cardanico quando gli utenti iniziano a spostare i propri dispositivi in ​​modo caotico.
    • Lo stesso vale per l'estensibilità per quanto riguarda una vista 3D completa.
  2. Usa il campo magnetico da CMDeviceMotion che è robusto contro il Gimbal Lock.Il magnetometro è un po' più lento dell'accelerometro/giroscopio, ma penso che l'algoritmo di fusione del CoreMotion fornirà una stima ragionevole, quindi non sarà questo il punto.Svantaggi qui:
    • Il campo magnetico non è sempre disponibile o tende ad essere leggermente impreciso.
    • Estenderlo alla visualizzazione 3D potrebbe essere una seccatura.

Entrambi gli approcci dovrebbero essere abbastanza facili da implementare e quindi inizierei con uno di essi.Se poi desideri avere una soluzione più sofisticata, dovrai immergerti un po' più a fondo nei calcoli matematici.In questo caso una possibile soluzione può essere quella di utilizzare l'attuale dispositivo normale (v.Per esempio Trovare il vettore normale sul dispositivo iOS), proiettatelo sul piano della superficie terrestre e prendete il delta degli angoli per il panorama cilindrico.

La proiezione della sfera in questo caso è ancora più semplice poiché puoi utilizzare direttamente il vettore nominale.

Altri suggerimenti

Grazie a Kay potrei essere sulla strada giusta per raggiungere questo effetto.

Sto facendo questa risposta solo per fornire maggiori dettagli per chi cerca la stessa cosa.

Per prima cosa è necessario creare un oggetto cmmotionmanager.

Quindi utilizzare StartDeviceMotionUpdatestoqueque per gestire gli eventi di movimento.

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

In Processmotion hai solo bisogno di ottenere l'atteggiamento in base alla precedente:

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

Grazie a questo conosci il nuovo angolo effettuato dall'utente dall'ultimo aggiornamento. Quindi dove gestisci la tua vista converti il nuovo angolo Eulero nella quantità di pixel che devi spostare l'immagine. Basta stare attento all'angolo Eulero varia tra -180, 180 e viene fornito in Rad da Apple.Questo potrebbe essere utile:

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

Quindi nel mio caso calcolo solo il nuovo X offset perché sto solo muovermi sull'asse X.

Spero che questo aiuti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top