2009-02-25 21 views
6

Uso di OpenGL Sto tentando di disegnare una mappa primitiva del mio campus.Come funzionano lo zoom, la panoramica e la rotazione?

Qualcuno può spiegarmi come viene generalmente implementato il panning, lo zoom e la rotazione?

Ad esempio, con panoramica e zoom, è che mi sto semplicemente regolando il mio viewport? Quindi tracciare e disegnare tutte le mie linee che compongono la mia mappa, e quindi mentre l'utente fa clic e trascina, regola la mia vista?

Per la panoramica, sposta i valori x/y della mia vista e per lo zoom aumenta/diminuisce la visualizzazione di una certa quantità? Che dire della rotazione?

Per la rotazione, devo eseguire trasformazioni affini per ogni polilinea che rappresenta la mappa del campus? Non sarà costoso farlo al volo su una mappa di dimensioni decenti?

Oppure, la vista è rimasta invariata e il panning/zoom/rotazione viene eseguito in qualche altro modo?


Ad esempio, se si va a questo link vedrete lo descrivono panning e zoom esattamente come ho sopra, modificando la finestra.

Non è corretto?

risposta

7

Si ottengono applicando una serie di comandi glTranslate, glRotate (che rappresentano la posizione e l'orientamento della videocamera) prima di disegnare la scena. (tecnicamente, stai ruotando l'intera scena!)

Ci sono funzioni di utilità come gluLookAt che riassumono alcuni dettagli a riguardo.

Per semplificare le cose, si supponga di avere due vettori che rappresentano la fotocamera: posizione e direzione.

gluLookAt prende la posizione, la destinazione e il vettore.

Se si implementa una classe vettoriale, destinaion = position + direction dovrebbe fornire un punto di destinazione.

di nuovo a fare le cose semplici, si può assumere il vettore fino ad essere sempre (0,1,0)

Poi, prima del rendering qualsiasi cosa nella vostra scena, caricare la matrice identità e chiamare gluLookAt

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
gluLookAt(source.x, source.y, source.z, destination.x, destination.y, destination.z, 0, 1, 0); 

Quindi inizia a disegnare gli oggetti

È possibile lasciare l'intervallo dell'utente modificando leggermente la posizione verso destra o verso sinistra. La rotazione è un po 'più complicata in quanto devi ruotare il vettore di direzione. Supponendo che ciò che stai ruotando sia la fotocamera, non qualche oggetto nella scena.

Un problema è, se si ha solo un vettore di direzione "avanti" come lo si sposta? dov'è la destra e la sinistra?

Il mio approccio in questo caso è quello di prendere solo il prodotto incrociato di "direzione" e (0,1,0).

Ora è possibile spostare la telecamera verso sinistra e verso destra utilizzando qualcosa di simile:

position = position + right * amount; //amount < 0 moves to the left 

si può andare avanti con il "vettore di direzione", ma IMO è meglio limitare il movimento ad un piano orizzontale , in modo da ottenere il vettore in avanti allo stesso modo abbiamo ottenuto il giusto vettore:

forward = cross(up, right) 

Per essere onesti, questo è un po 'un approccio hacker.

L'approccio corretto consiste nell'utilizzare una struttura dati più "sofisticata" per rappresentare l'"orientamento" della telecamera, non solo la direzione in avanti. Tuttavia, dal momento che sei appena agli inizi, è bene fare le cose un passo alla volta.

+2

Aggiungo che in nessun momento la "vista" (come impostata su glViewport) entra in questo processo. Il viewport determina in quale area della finestra verrà visualizzato il rendering (in realtà non è vero, ma pensaci in questo modo per ora) e di solito si estenderà all'intera finestra. – Thomas

1

Generalmente ci sono tre passaggi che vengono applicati ogni volta che si fa riferimento a qualsiasi punto nello spazio 3d all'interno di opengl.

Dato un punto locale

  • locale -> Mondo Trasforma
  • Mondo -> Camera Trasforma
  • Camera -.> Schermo Transform (di solito una proiezione dipende se si sta utilizzando la prospettiva o ortogonale

Ognuna di queste trasformazioni sta prendendo il punto 3d e moltiplicato per una matrice.

Quando si ruota la telecamera, generalmente si modifica il mondo -> trasformazione della telecamera moltiplicando la matrice di trasformazione per la trasformazione affine rotazione/panoramica/zoom. Dal momento che tutti i tuoi punti sono resi nuovamente ogni fotogramma, la nuova matrice viene applicata ai tuoi punti e dà l'impressione di una rotazione.

4

Tutte queste "azioni" possono essere ottenute utilizzando le funzioni di trasformazione della matrice vista modello. Dovresti leggere glTranslatef (panning), glScalef (zoom), glRotatef (rotazione). Dovresti anche aver bisogno di leggere alcuni tutorial di base su OpenGL, potresti trovare utile this link.