2012-12-31 12 views
6

Mi piacerebbe disegnare un orizzonte artificiale. Il centro della vista rappresenterebbe una vista perfettamente orizzontale con il rullo che ruota la linea orizzontale e il pitch lo muove su o giù.Traduzione corretta dell'orizzonte artificiale

La domanda è: qual è il calcolo corretto per tradurre la linea dell'orizzonte in alto o in basso (altezza) dato l'angolo di inclinazione.

La mia ipotesi è che questo probabilmente dipenderà dall'angolo del FOV che si suppone per una telecamera presunta, quindi questo angolo dovrebbe essere un fattore dell'algoritmo ricercato. Idealmente, troverei questo angolo per la fotocamera dell'iPhone/iPad in modo che l'orizzonte artificiale si allinei all'orizzonte reale se si tiene il dispositivo di fronte a sé e si guarda verso l'orizzonte.

Fino ad ora ho indovinato l'offset, ma mi piacerebbe avere la formula esatta.

+0

Prova 'horizon_offset/(screen_height/2) = tan (pitch)/tan (vertical_FOV/2)'. [Vedi] (http://zwibbler.com/shared/3120.png). –

+0

Potresti scriverlo come risposta separata in modo che io possa accettarlo se risulta essere quello giusto? Forse anche elaborando come hai derivato la formula? – Cocoanetics

+0

Una risposta esatta dipende dalla conoscenza di quanto l'utente è lontano dallo schermo e dall'angolo in cui viene trattenuto - se lo schermo non viene visualizzato esattamente a 90 gradi, l'angolo del dispositivo non si tradurrà nell'angolazione dell'orizzonte. Quindi sestanti e quadranti hanno più di una vista da allineare. Gli orizzonti artificiali sugli aerei mostrano invece una scala calibrata per l'altezza, quindi non richiedono tali informazioni. –

risposta

3

Prova horizon_offset/(screen_height/2) = tan (pitch)/tan (vertical_FOV/2).

Guarda l'immagine e la formula deriva da sé.

the picture http://zwibbler.com/shared/3120.png.

Aggiornamento Ho due angoli mescolati. Uno è l'angolo FOV della fotocamera , l'altro è l'angolo di visualizzazione dello schermo . Queste sono due cose diverse. Quest'ultimo dipende dalla distanza di visione. Probabilmente è necessario stimare questa distanza e regolare l'ingrandimento e/o la distanza focale in modo tale che gli oggetti visibili sullo schermo abbiano le stesse dimensioni angolari degli stessi oggetti visibili ad occhio nudo. (Con il mio telefono particolare, avresti bisogno di ingrandire l'immagine di un fattore aggiuntivo di circa 3 dopo lo zoom 5x, se l'utente allunga la mano con il telefono completamente in avanti). Quindi i due angoli sono uguali e la formula funziona.

Se si desidera introdurre l'ingrandimento (ovvero gli oggetti sullo schermo hanno dimensioni diverse rispetto alle controparti reali), moltiplicare l'offset dell'orizzonte per il fattore di ingrandimento.

Aggiornamento 2 Quando si prende in considerazione la distanza di visualizzazione, le dimensioni dello schermo si annullano e lo scostamento diventa semplicemente viewing_distance*tan(pitch_angle) (con ingrandimento dell'unità).

+0

Se ho cambiato il tono, l'orizzonte si muoverà lineare o più veloce, più lontano sono lontano dall'orizzontale? Cosa succede se ruoto il dispositivo di 90 gradi e quindi l'altezza dello schermo diventa più ampia? Assumi lo stesso fattore? Devo risolvere la formula per horizon_offset moltiplicando con (screen_height/2) – Cocoanetics

+0

Inoltre, il FOV verticale non sarebbe lo stesso di quello orizzontale? – Cocoanetics

+0

Ora, quando lo guardo di nuovo, la dimensione dello schermo si annulla e l'offset diventa semplicemente viewing_distance * tan (pitch_angle) (con ingrandimento dell'unità). –