Wednesday, May 9, 2012

Working on radar

It's time to working on radar.. new approach now: multiple viewport to render it.

Post un po' lungo e tecnico, ma penso sia interessante specie per chi come me si sta avventurando nel mondo del rendering 3D in tempo reale.

Terminata la mappa del settore (per ora va bene cosi'), ho deciso di reintrodurre il vecchio radar che mesi e mesi fa avevo iniziato a sviluppare.
E mi son reso conto che, complice probabilmente l'inesperienza, stavo seguendo una strada del tutto sbagliata e certamente inutilmente complicata.
Ricapitoliamo: correva l'anno 2008 quando tentavo di mettere in piedi un prototipo di radar. Allora la strada che avevo deciso di seguire era: prendo uno sprite ovoidale per dare l'illusione di una circonferenza in prospettiva, che mi rappresenta il piano ove poggia la mia astronave, ed, esattamente come avveniva con Elite/Frontier, tiro delle linee perpendicolari alla circonferenza per rappresentare la posizione degli altri oggetti rispetto alla mia astronave che sta al centro del radar.
Bene. L'idea e' anche giusta (L'ha avuta Braben, mica io ;) ), la realizzazione assolutamente no, per i seguenti motivi:

  1. un ellisse NON E' uguale ad un cerchio messo in prospettiva.
  2. dover calcolarsi per ogni oggetto la posizione relativa all'astronave e la corrispondente proiezione sul cerchio in coordinate bidimensionali e', per omaggiare quei pochissimi (se ce ne sono ancora) stranieri che leggono, "a pain in the ass".
La soluzione alla fine e' sorprendentemente più semplice di quanto pensassi: ho un motore 3D che si occupa di tutti questi impicci? Beh, perché non usarlo anche per il radar?
Quindi:

  • Con Blender mi disegno una specie di "rosa dei venti" che mi rappresenta il mio cerchio visto in precedenza. E' semplice: basta un rettangolino ed un modifier "array" col quale replico e ruoto ciascun segnaposto. Ne ho fatti 24, ma posso metterne quanti ne voglio:


  • Esporto la mesh e la importo su  Ogre3D 
  • Su Ogre3D mi creo un secondo universo, dove anziché mettere astronavi, pianeti e quant'altro, metto solo la "rosa dei venti", ed una serie di segnaposti che occupano la stessa posizione degli oggetti rispetto alla mia astronave, ovviamente scalati. Per avere la posizione relativa esistono già dei metodi "worldToLocal" e "localToWorld" che mi permettono agevolmente di ottenere la posizione 3D di un qualsiasi oggetto quando l'origine e' impostata solidale alla astronave anziché al sole.
  • Da queste posizioni tiro una riga perpendicolare al piano che contiene la rosa dei venti. E' un universo in 3d, l'operazione e' banale, non devo effettuare nessuna proiezione, basta disegnare una linea da (x,y,z) a (x,0,z)
  • Posiziono una telecamera poco dietro la rosa dei venti, un po' in alto, e la faccio puntare ovviamente verso la mesh
  • Dico a Ogre di fare il rendering di tutto cio' in un secondo viewport che con un po' di accortezza vado a posizionare proprio dentro lo spazio dedicato al radar.


Il risultato? Eccolo. Per ora c'e' solo la mesh, ma basta per darvi l'idea di quello che sara' l'effetto finale.


Alla prossima!


No comments: