In questa lezione non parleremo di programmazione ma piuttosto di modelli e la scelta di essi per le scene tridimensionali di un videogioco, oltre che accennare alle coordinate 3D in una scena di Unity.
Facciamo un po’ di chiarezza su cosa sia in realtà una scena di Unity e quali modelli potremmo importare all’interno di essa.
Sappiamo che una scena di Unity rappresenta uno spazio tridimensionale, fatto di altezza, larghezza e profondità. (X,Y,Z).
Nell’immagine sovrastante possiamo vedere le tre dimensioni sviluppare sui tre assi X,Y,Z. Il punto in cui si intersecano i tre piani si chiama punto zero o punto focale ed ha coordinate X=0, Y=0, Z=0. In pratica è il centro della scena.
In Unity non esiste un elemento che visualizzi fisicamente il punto zero della scena sullo schermo. Sappiate però che ogni coordinata di posizione di ogni gameObject libero nella scena, sarà in relazione a questo punto e lo potremo visionare sull’Inspector attraverso il Trasform.
Cosa si intende per “libero nella scena“?
Quando degli oggetti non si trovato”sotto” ad un altro oggetto, essi possiedono delle coordinate in relazione del punto 0,0,0 della scena. Essi sono “liberi” nella scena.
Ovvero, l’oggetto capsula nel video si trova nel punto (12,10,10) della scena, e quando essa è libera, sul suo Trasform vediamo scritte le normali coordinate (12, 10 10).
Nel momento in cui abbiamo messo la capsula sotto la sfera (la sfera possiede coordinate (10,10,10)), le coordinate della capsula sono diventate (2,0,0) perché in relazione alla sfera, cioè, il punto di rifermentato è diventato in centro della sfera.
|
Vedremo in seguito che, come per la posizione, anche la scala lavora in relazione degli oggetti su in cui è incapsulato.
Alcune definizioni basilari
Quando un oggetto si trova “sotto” un altro oggetto è detto children (figlio) di esso.
L’oggetto “sopra” ad un oggetto viene definito “parent” (genitore) di esso.
L’oggetto che si trova nel “punto più in alto” della sua gerarchia e dunque non ha parent sopra di esso (dunque “libero” da vincoli) viene definito root (radice) di tutti gli oggetti sotto di esso.
Creazione di modelli 3D
Nel campo della modellazione 3D esistono molti programmi di ottima qualità per la creazione di personaggi e oggetti da inserire in una scena di un gioco. Le questioni teoriche di cui parleremo adesso saranno assimilabili a prescindere dal programma utilizzato per la modellazione.
Tra i più potenti programmi per la modellazione possiamo trovare il 3DS Max, Maya, Lightwave e altri di pari qualità. Personalmente io uso il 3DS Max, da ormai quasi vent’anni. Ma qualsiasi programma di modellazione più o meno professionale può adempiere il lavoro necessario alla creazione di modelli tridimensionali, animati o non. Ultimamente sembra essersi affermato Blender, programma gratuito che in quanto a strumenti non ha nulla da invidiare ai programmi su citati.
Se siete capaci, potrete creare i vostri modelli da voi con il vostro programma di modellazione preferito, oppure potrete scaricarne a volontà dai svariati siti che li mettono a disposizione, sia in forma gratuita che a pagamento. In alternativa, potrete affiancarvi di un bravo modellatore 3D che sappia il fatto suo sulla grafica low-poly adatta ad un videogioco.
Real-time e modelli low-poly
Come forse già saprete, i modelli dedicati ai videogiochi devono avere delle limitazioni di poligoni.
Se avete visto film in computer grafica, tipo Shrek, Cars, Frozen ecc.. avrete notato una strabiliante qualità grafica, ben lontana dalla grafica dei videogiochi.
Se vi siete chiesti perché non fanno i giochi con quella grafica, allora non conoscete la differenza tra la grafica RealTime e la grafica pre-renderizzata ovvero grafica low-poly e grafica hi-poly.
Per low-poly si intende grafica con basso numero di triangoli. Low=basso, poly=poligoni ovvero, grafica da renderizzare in tempo-reale, RealTime.
Ma cosa significa Renderizzare?
Per capire al volo cosa si intende con questo termine, potremmo paragonare la renderizzazione allo sviluppo di una fotografia.
Quando si scatta una foto, scegliamo l’angolazione, il soggetto, la luce giusta e quant’altro… Potremmo paragonare questa prima procedura al nostro lavoro di scelta della luce, scelta dei materiali, posizionamento degli oggetti nella scena… Il vero momento di creazione dove decidiamo come fare le cose, in attesa dell’effetto finale, quando schiacceremo “Play” su Unity.
Quando schiacceremo il click della nostra macchina fotografica avremo impresso la scena sul rullino e vedremo l’effetto finale, si andrà a sviluppare la foto per vedere il risultato del lavoro fatto. Questo lo potremmo paragonare alla renderizzazione della nostra scena. La visualizzazione del nostro lavoro creativo.
Renderizzare significa in definitiva, calcolare l’effetto visivo del nostro lavoro, è l’operazione di calcolo (che compie il processore grafico) dei riflessi, delle luci sui diversi materiali ecc.. che ci mostrerà il risultato.
Impareremo che finché avremo nella scena pochi oggetti e pochi dettagli, la renderizzazione sarà velocissima e il nostro gioco potrà godere di un alto numero di frame per secondo (i tanto agognati FPS).
Quando però la nostra scena conterrà molti oggetti, noteremo uno sforzo maggiore e un probabile “lag”(rallentamento), ovvero un’attesa tra un fotogramma e l’altro di qualche decimo di secondo che farà “scattare” la nostra scena rendendola “poco fluida”. Durante quella breve attesa tra un fotogramma e l’altro, Unity sta renderizzando la scena, ovvero sta facendo i calcoli necessari per far apparire i singoli poligoni come dovrebbero apparire, con la giusta illuminazione, colore, posizione ecc…
Dunque possiamo facilmente intuire che, maggiore è il numero di oggetti e maggiore sarà l’attesa.
La parola oggetti però, in questo caso, non è corretta, dovremmo parlare di triangoli, ovvero: maggiore è il numero di triangoli di una scena e più lunghi sanno i tempi di rendering. Di conseguenza, maggiori dettagli avremo in una scena e più sarà difficile poterla muovere velocemente in tempo reale in un videogioco, in Realtime.
Quando ci muoviamo all’interno di un mondo 3D in un videogioco, l’engine del gioco sta renderizzando la scena ad ogni fotogramma. Si chiama appunto Realtime, tempo reale, perché durante il gioco avvengono all’incirca 30 renderizzazioni al secondo! Possiamo subito capire che evitare scene con troppi triangoli è alla base della creazione di scene destinate al Realtime.
Questa è sostanzialmente la differenza tra la grafica low-poly per il realtime e la grafica hi-poly (alto numero di triangoli) che si utilizza nei filmati pre-renderizzati (filmati in computer grafica).
La grafica pre-renderizzata non soffre di limitazioni perché essa viene “impressa” su un filmato, viene dunque “stampata” e salvata su un video e mai più renderizzata, a differenza dei giochi, che renderizzano la scena decine di volte al secondo.
Nel momento della visualizzazione di un filmato pre-renderizzato non verranno fatti calcoli perchè appunto è stato pre–renderizzato cioè renderizzato in precedenza, prima delle sua visualizzazione.
Si tratterà solo di far scorrere dei fotogrammi che saranno fluidi a prescindere dal numero di poligoni e dettagli della scena perché si tratta di una sequenza di immagini esattamente come un qualunque film.
Per questo motivo i films della Pixar/Dreamworks e qualunque filmato pre-renderizzato, possono essere estremamente dettagliati, si tratta di video e non viene fatto nessun calcolo durante la loro visualizzazione.
Nell’immagine qui sopra abbiamo lo stesso “personaggio” in due versioni, in hi-poly e in low poly.
Si nota subito l’enorme quantità di poligoni usata per il modello high poly, quasi un milione, tanto che la rete di poligoni risulta così fitta che quasi essi non si distinguono l’uno dall’altro.
Nel modello low-poly invece i poligoni si distinguono benissimo, un modello con 2.800 triangoli può essere usato tranquillamente in un gioco. Il modello hi-poly invece risulterebbe estremamente pesante per un videogioco, sopratutto presumendo che ce ne potrebbero essere anche decine contemporaneamente sullo schermo.
Qual’è il numero “giusto” di poligoni per modello?
Non esiste una risposta a questa domanda. Dipende da tantissimi fattori.
In primis dalla quantità di modelli che saranno contemporaneamente nella scena, da che distanza verranno renderizzati e altri fattori.
Il dettaglio medio di un modello sarà sempre un parametro in crescita con il passare degli anni grazie all’avvento di nuovo hardware sempre più performante.
Fino a quache anno fa 5000 poligoni per un modello di un personaggio erano già fantascienza (primi anni 2000).
Oggi, nel 2020, in alcuni casi un singolo modello può sfiorare i 100.000 poligoni.
Ovvio è che, meno poligoni si useranno per i modelli e più fluido sarà il gioco anche su harware meno performanti.