Come potrebbe semplicemente chiamando Pitch () e Yaw () provocano la fotocamera al fine Roll ()?

StackOverflow https://stackoverflow.com/questions/784445

  •  16-09-2019
  •  | 
  •  

Domanda

Sono la codifica di un gioco di base di OpenGL e ho avuto un po 'di codice che gestisce il mouse in termini di muovere la fotocamera.

Sto usando il seguente metodo:

int windowWidth = 640;
int windowHeight = 480;

int oldMouseX = -1;
int oldMouseY = -1;

void mousePassiveHandler(int x, int y)
{
    int snapThreshold = 50;

    if (oldMouseX != -1 && oldMouseY != -1)
    {
        cam.yaw((x - oldMouseX)/10.0);
        cam.pitch((y - oldMouseY)/10.0);


        oldMouseX = x;
        oldMouseY = y;

        if ((fabs(x - (windowWidth / 2)) > snapThreshold) || (fabs(y - (windowHeight / 2)) > snapThreshold))
        {
            oldMouseX = windowWidth / 2;
            oldMouseY = windowHeight / 2;
            glutWarpPointer(windowWidth / 2, windowHeight / 2);
        }
    }
    else
    {
        oldMouseX = windowWidth / 2;
        oldMouseY = windowHeight / 2;
        glutWarpPointer(windowWidth / 2, windowHeight / 2);
    }


    glutPostRedisplay();

}

Tuttavia, dopo aver guardato in giro in tondo troverete la fotocamera inizia a "roll" (Ruota). Dal momento che sto solo chiamando beccheggio e imbardata, non vedo come questo sia possibile.

Ecco il codice che sto usando per la mia classe Camera: http://pastebin.com/m20d2b01e

Per quanto ne so, la mia macchina fotografica "rolling" non dovrebbe accadere. Dovrebbe semplicemente lanciare su e giù o imbardata sinistra e destra. NON rotolare.

Quale potrebbe essere la causa?

È stato utile?

Soluzione

Congratulazioni - avete scoperto la teoria dei gruppi di Lie!

Si, è possibile. Il risultato di una serie di trasformazioni dipende l'ordine in cui vengono eseguiti. Facendo un passo seguito da un imbardata non è la stessa come facendo un imbardata, seguita da un passo. Infatti, nel limite di infinitesimali yaws e piazzole, la differenza ammonta ad un rullo puro; il generale caso è un po 'più complicato.

(I fisici chiamano questo le "relazioni di commutazione di il gruppo di rotazione".)

Se si ha familiarità con matrici di rotazione, si può lavorare fuori abbastanza facilmente.

Altri suggerimenti

Si avrà probabilmente bisogno di usare quaternioni per la composizione di rotazioni, se non si sta facendo così già . Questo evita il problema di gimbal lock che si può ottenere quando orientare una macchina fotografica per rotazione attorno ai 3 assi .

Ecco come convertire tra di loro.

Bene, se si avvia fuori in attesa orizzontale verso l'orizzonte, passo fino a 90 gradi, poi imbardata a sinistra di 90 gradi, poi passo verso il basso di 90 gradi, devi essere alla ricerca nella stessa direzione, come hai iniziato, ma l'orizzonte sarebbe essere verticale (come se ci si laminati di 90 gradi a sinistra).

Modifica : Penso che il problema è che imbardata / pitch / roll sarebbe opportuno se la fotocamera viene trattato come un aeroplano. Quello che probabilmente vuole fare è trattare come un punto in una sfera, tenere traccia di dove sulla sfera si punta la fotocamera. Invece di imbardata / piazzola, utilizzare le coordinate sferiche tenere traccia di theta (latitudine) e phi (longitudine). Essi possono sembrare simili, ma si consideri il caso estremo in cui la telecamera punta direttamente su. Con imbardata / pitch, è ancora possibile impostare liberamente l'imbardata e il passo da quella direzione straight-up. Con theta / phi, si può regolare solo theta verso il basso, e non importa quanto si phi regolata, diminuendo theta sarebbe ancora dare una fotocamera che è parallelo all'orizzonte. Questo è come il lavoro di FPS fotocamera (non si può guardare così in basso che si sta cercando dietro di voi).

Modifica 2 : Guardando il codice macchina fotografica si è collegato al, si vuole essere utilizzando il rotLati(float angle) e rotLongi(float angle) funzioni

Matematicamente la ragione di questo è che le rotazioni nello spazio 3D non commutano. Ciò significa che passo () seguito da imbardata () non è la stessa di imbardata () seguito da passo (), ma una conseguenza di questo fatto è che i tre tipi di rotazioni sono indissolubilmente legate e non è possibile eseguire alcuna due di loro senza ottenere alcuni del terzo. In altre parole, qualsiasi sequenza di campo (es) e imbardata () s produrrà un effetto notevole rotolo () nel tempo, a meno che la seconda metà della sequenza è l'esatto del primo tempo. (C'è un sacco di matematica piuttosto intricato coinvolti in questo, ma i dettagli non sono particolarmente rilevanti)

Pitch / imbardata / rollio sono tutti relativi all'orientamento del veicolo. Quando si pitch su / giù, si cambia l'asse di imbardata. Allo stesso modo, quando si imbardata, si cambia l'asse campo. Quindi è possibile cambiare l'orientamento in modo simile a una manovra rotolo solo da una combinazione e Pitch & imbardata manovre.

Credo che questa circostanza è chiamata giunto cardanico Blocco - c'è un esempio di esso con illustrazioni su la pagina di wikipedia.

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