Domanda

Usando OpenGL sto cercando di disegnare una mappa primitiva del mio campus.

Qualcuno può spiegarmi come panning, zoom e rotazione di solito è implementato?

Per esempio, con panning e zoom, è che semplicemente mi regolando la mia finestra? Così ho tracciare e disegnare tutte le mie linee che compongono la mia mappa, e poi come l'utente fa clic e trascina regola la mia finestra?

Per panning, lo fa spostare l'x / y valori della mia finestra e per lo zoom lo fa aumentare / diminuire la mia finestra da una certa quantità? Che dire per la rotazione?

Per la rotazione, fare quello che devo fare affine trasforma per ogni polilinea che rappresenta la mia mappa del campus? Non Questo sarà costoso da fare al volo su una mappa di dimensioni decenti?

In alternativa, è la finestra a sinistra lo stesso e la panoramica / zoom / rotazione è fatto in un certo otherway?


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

E 'questo non è corretta?

È stato utile?

Soluzione

Sono risultati applicando una serie di glTranslate, comandi glRotate (che rappresentano la posizione della fotocamera e orientamento) prima di disegnare la scena. (Tecnicamente, si sta ruotando tutta la scena!)

Ci sono funzioni di utilità come gluLookAt che sorta astratto alcuni dettagli su questo.

Per simplyify le cose, si supponga di avere due vettori che rappresentano la vostra macchina fotografica: posizione e direzione.

gluLookAt prende la posizione, la destinazione, e fino vettore.

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

Ancora una volta a rendere 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 di identità e chiamare gluLookAt

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

Poi iniziare a disegnare gli oggetti

È possibile lasciare che il lasso utente modificando leggermente la posizione a destra oa sinistra. La rotazione è un po 'più complicato come si deve ruotare il vettore di direzione. Partendo dal presupposto che quello che stai rotazione è la fotocamera, non un oggetto nella scena.

Un problema è, se avete solo un vettore di direzione "avanti" come si fa lo si sposta? dove è la destra e la sinistra?

Il mio approccio in questo caso è 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

È possibile 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 è quello di utilizzare una maggiore struttura dati "sofisticato" per rappresentare il "orientamento" della telecamera, non solo la direzione in avanti. Tuttavia, dal momento che si sono appena agli inizi, è bene prendere le cose un passo alla volta.

Altri suggerimenti

Tutte queste "azioni" può essere realizzato utilizzando il modello vista funzioni matrice di trasformazione. Si dovrebbe leggere su glTranslatef (panning), glScalef (zoom), glRotatef (rotazione). Si dovrebbe anche bisogno di leggere qualche tutorial di base su OpenGL, si potrebbe trovare questo link utile.

Generalmente ci sono tre punti che vengono applicati quando si fa riferimento a qualsiasi punto dello spazio 3D all'interno 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)

Ciascuna di queste trasformazioni sta prendendo il tuo punto 3d, e moltiplicando per una matrice.

Quando si sta ruotando la fotocamera, è generalmente cambiando il mondo -> fotocamera trasformare moltiplicando la matrice trasformata dal di rotazione / pan / zoom affine trasformazione. Poiché tutti i punti sono nuovamente resi ciascun fotogramma, la nuova matrice viene applicato ai punti, e dà l'aspetto di una rotazione.

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