2015-11-14 20 views
12

Nelle ultime settimane ho tentato di imparare la libreria libGDX. Sto trovando difficile, soprattutto per il mio primo sforzo verso lo sviluppo del gioco, per comprendere il sistema delle relazioni Camera/viewport. Una riga di codice che mi è stato detto di usare, e l'API cita, è:Informazioni sulla matrice di proiezione libGDX

batch.setProjectionMatrix(camera.combined); 

Nonostante ben 4 ore di ricerca, sono ancora privi di una completa comprensione delle funzionalità di questo codice. È alla mia comprensione di base che "racconta" il lotto in cui la fotocamera sta guardando. La mia mancanza di comprensione è deprimente e irritante, e sarei grato se qualcuno potesse aiutarmi. Un altro problema con lo snippet di codice è che non sono sicuro di quando è necessario implementarlo (nel metodo di rendering, nel metodo di creazione, ecc.).

risposta

14

Considera di scattare una foto con una fotocamera. Per esempio. utilizzando la fotocamera dello smartphone scattare una foto di una panchina nel parco. Quando lo fai, vedrai la panchina nel parco sullo schermo del tuo smartphone. Questo potrebbe sembrare molto ovvio, ma diamo un'occhiata a ciò che questo comporta.

La posizione della panca sull'immagine è relativa al punto in cui si trovava quando si scatta la foto. In altre parole, è relativo alla fotocamera. In un gioco tipico, non si posiziona l'oggetto rispetto all'oggetto. Invece li metti nel tuo mondo di gioco. La traduzione tra il tuo mondo di gioco e la tua macchina fotografica è fatta usando una matrice (che è semplicemente un modo matematico per trasformare le coordinate). Per esempio. quando sposti la fotocamera a destra, la panca si sposta a sinistra sulla foto. Questo è chiamato View Matrix.

L'esatta posizione della panca sull'immagine dipende anche dalla distanza tra la panca e la fotocamera. Almeno, lo fa in 3D (il 2D è molto simile, quindi continua a leggere). Quando è più lontano è più piccolo, quando è vicino alla fotocamera è più grande. Questa è chiamata proiezione prospettica. Si potrebbe anche avere una proiezione ortografica, nel qual caso la dimensione dell'oggetto non cambia in base alla distanza dalla telecamera. In entrambi i casi, la posizione e le dimensioni della panchina nel parco sono tradotte in posizione e dimensioni in pixel sullo schermo. Per esempio. la panchina è larga due metri nel parco, mentre nella foto è 380 pixel. Questo è chiamato la matrice di proiezione.

camera.combined rappresenta la vista combinata e la matrice di proiezione. In altre parole: descrive dove le cose nel tuo mondo di gioco dovrebbero essere visualizzate sullo schermo.

Chiamare batch.setProjectionMatrix(cam.combined); indicare al batch di utilizzare quella matrice combinata. Dovresti chiamarlo ogni volta che cambia il valore. Questo è in genere quando viene chiamato resize e anche ogni volta che si sposta o si altera in altro modo la fotocamera.

Se non si è sicuri, è possibile chiamarlo all'inizio del metodo render.

+0

Grande spiegazione. –

7

L'altra risposta è eccellente, ma immagino che un modo diverso di descriverlo potrebbe aiutarlo a fare clic.

In generale, il gioco si svolge nello "spazio mondiale", un sistema di coordinate analogo al mondo reale. Nell'algebra lineare, è possibile convertire i punti nello spazio da un sistema di coordinate a un altro moltiplicando le coordinate del punto per una matrice che rappresenta la relazione tra due sistemi di coordinate.

La matrice di visualizzazione viene moltiplicata per un punto per convertirlo dallo spazio del mondo allo spazio della fotocamera (il punto di vista della telecamera). La matrice di proiezione viene utilizzata per convertire un punto dallo spazio della fotocamera allo spazio dello schermo (il rettangolo 2D piatto dello schermo del dispositivo). Quando chiami update() su una videocamera in Libgdx, applica le ultime modifiche alla posizione, all'orientamento, alle dimensioni della finestra, al campo visivo, ecc.alla sua vista e alle matrici di proiezione in modo che possano essere utilizzate negli shader.

Raramente si ha bisogno di occuparsi di cose nello spazio della telecamera in 2D, quindi SpriteBatch non ha bisogno di matrici di visualizzazione e di proiezione separate. Possono essere combinati in una singola matrice che converte direttamente dallo spazio del mondo allo spazio dello schermo, che è già fatto automaticamente nella fotocamera, da cui la matrice camera.combined.

SpriteBatch ha uno shader predefinito predefinito che moltiplica questa matrice di proiezione da tutti i vertici degli sprite in modo che vengano mappati correttamente sullo schermo piatto.

È necessario chiamare setProjectionMatrix ogni volta che si sposta la fotocamera o si ridimensiona lo schermo.

C'è un terzo tipo di matrice chiamata matrice di modello che viene utilizzata per materiale 3D. Una matrice modello descrive l'orientamento, la scala e la posizione del modello nello spazio mondiale. Quindi viene moltiplicato per le coordinate nel modello per spostarle dallo spazio locale allo spazio mondiale.

4

Prendi ad esempio un gioco di sidescrolling di base. Mentre il giocatore si sposta di lato, la telecamera esegue la panoramica per seguirli. Ciò significa che gli oggetti nel mondo non corrispondono necessariamente al punto in cui si trovano sullo schermo, poiché lo schermo e il mondo si spostano l'uno rispetto all'altro.

Ecco un esempio: diciamo che lo schermo è 100px * 100px quadrati (per qualche motivo). Si posiziona un oggetto in posizione (50, 0), quindi è ora al centro e nella parte inferiore dello schermo. Ora dì che sposti il ​​giocatore a destra e l'intero schermo si sposta per seguire il giocatore. Ciò significa che l'oggetto che hai posizionato in precedenza dovrebbe essere stato spostato a sinistra sullo schermo. Quindi è ancora a (50, 0) nel mondo, dal momento che in realtà non si sposta rispetto al resto dello scenario, ma dovrebbe ora essere disegnato a, diciamo, (10, 0) sullo schermo, dal quale parte del mondo che lo schermo sta guardando è cambiato. Questa è la differenza tra "worldspace" (dove un oggetto è nel mondo) e "screenpace" (dove l'oggetto è disegnato sul display attuale).

Quando si tenta di disegnare con un SpriteBatch, per impostazione predefinita si assume che le coordinate dello spazio del mondo siano le stesse delle coordinate dello schermo: quando si dice "disegnare in (50, 0)", verrà disegnato l'oggetto su (50, 0) sullo schermo. Anche se la telecamera si muove, attirerà sempre (50, 0) sullo schermo, così come la telecamera panoramica, l'oggetto seguirà e rimarrà nella stessa posizione sullo schermo.

Visto che in genere non si vuole che si danno il SpriteBatch una matrice proiezione, che è una matrice di trasformazione che indica come convertire screenspace coordinate a WORLDSPACE coordinate, e viceversa. In questo modo, quando dici al batch "draw at (50, 0)", può guardare la matrice ottenuta dalla telecamera e vedere che, dal momento che la telecamera si è mossa, (50, 0) nel mondo significa in realtà (10, 0) sullo schermo e attirerà il tuo sprite nel posto giusto.