Nella lezione relativa all’interfaccia di Unity ti ho introdotto brevemente la telecamera ed il suo funzionamento. In questa lezione amplieremo il discorso e impareremo a conoscere la telecamera in Unity 3D come le nostre tasche!
L’oggetto Camera: com’è fatto?
In Unity la camera è un Game Object (sorpreso, eh?) e come tale possiede due componenti di default:
- Un Camera Component, che conterrà tutti i settaggi e le impostazioni relative alla nostra telecamera.
- Un Audio Listener, che sarà il nostro “orecchio sul mondo di gioco”, permettendoci di catturare i suoni prodotti dalle varie fonti sonore.
Ovviamente potrai aggiungere e rimuovere componenti a tuo piacimento, cambiando di conseguenza il comportamento della telecamera. Il componente più importante (e sul quale ci concentreremo in questa lezione) sarà il Camera Component.
Prima di parlare del camera component però, è opportuno introdurti il frustum di visione!
Il frustum di visione
In geometria il frustum è una figura particolare: ricorda moltissimo una piramide cui è stato tagliato via il vertice!

La telecamera di un videogioco funziona in maniera leggermente diversa da quella del mondo reale: essa infatti non vede incondizionatamente tutto ciò che le sta davanti, ma (per limitare lo spreco di risorse hardware e per renderne l’uso più maneggevole) si limita a renderizzare ciò che si trova all’interno di un determinato frustum, che appunto viene definito frustum di visione. Ovviamente avremo la possibilità di regolare le dimensioni del frustum di visione dal camera component, adattandolo così alle nostre esigenze.

Il Camera Component
Ciò che rende una telecamera tale (cioè in grado di riprendere l’azione di gioco) è proprio il Camera Component. Aggiungendone uno ad un oggetto qualsiasi (ad esempio un cubo) esso diventerà una telecamera della nostra scena a tutti gli effetti!
- Clear Flags: Abbiamo detto che la nostra telecamera riprende ciò che si trova all’interno del suo frustum di visione. Dal menù clear flags potremo scegliere cosa vedere dietro gli oggetti inquadrati la nostra telecamera, come se fosse lo sfondo del frustum di visione. Avremo la possibilità di scegliere fra una skybox (che in breve è una sorta di immagine a 360° che simula il cielo), un solid color (cioè una tinta unica settabile tramite la paletta colori sottostante) oppure ,tramite l’opzione Depth Only,di catturare solo la profondità di ciò che viene inquadrato dalla telecamera, senza impostare alcuno sfondo (molto utile quando si ha a che fare con più videocamere attive in contemporanea). Esiste anche l’opzione Don’t clear che sovrappone fra loro i frame del gioco creando strani effetti visivi (difficilmente troverà un’applicazione utile all’interno di un videogioco, a meno che tu non voglia rovinare la vista del tuo caro videogiocatore di proposito!)
- Culling Mask: Esattamente come avviene per le luci (che abbiamo visto in questa lezione), una culling mask ci permette di renderizzare solo alcune tiplogie di oggetti.
- Projection: Tramite questo parametro possiamo scegliere fra due differenti visuali: la visuale prospettica e quella ortografica. Mentre nella visuale prospettica le dimensioni di un oggetto dipendono dalla sua distanza dalla telecamera, in visuale ortografica la distanza non incide sulle dimensioni dell’oggetto (e come effetto di tale cambiamento potrai notare che attivando la visuale ortografica il frustum di visione si trasformerà in un parallelepipedo!).
Monument valley: uno dei videogiochi in visuale ortografica più popolari degli ultimi tempi. Ah, è stato realizzato in Unity! - Field of View/Size e Clipping Planes: Questi parametri serviranno a definire le dimensioni dell’area di gioco visibile. Tramite il parametro Field of view (se la telecamera è prospettica)o il parametro size (se la telecamera è ortografica) regoleremo la larghezza dell’area di gioco visibile. Che si tratti di visuale prospettica o ortografica, tramite i Clipping Planes definiremo la lunghezza dell’area di visione della camera. Nello specifico, modificando il parametro “Near” sceglieremo il punto di inzio da cui la nostra brava telecamera riprenderà la scena, mentre il parametro “Far” indicherà fin dove la telecamera riprenderà la scena. Tutti gli oggetti che si troveranno più vicini del valore “Near” o più lontani del valore “Far” dalla telecamera non verranno ripresi.
La sfera si trovaprima del valore “Near”, mentre il cilindo si trova dopo il valore “Far”: di conseguenza, il cubo è l’unico oggetto inquadrato dalla telecamera! - Viewport Rect e Depth: Durante la creazione di un videogioco ti capiterà di voler mostrare su schermo diverse inquadrature in contemporanea. Che si tratti di una partita in schermo condiviso o semplicemente di mostrare il viso del protagonista in tempo reale nell’interfaccia di gioco, settando correttamente i vari parametri della viewport rect potrai modificare le dimensioni delle varie schermate. Tramite i valori X e Y potrai scegliere da quale punto dello schermo dovrà essere mostrata l’inquadratura, mentre tramite i valori W ed H potrai regolare quale porzione di inquadratura mostrare.Il parametro “Depth” invece ci permetterà di definire dei livelli di profondità tramite cui le varie inquadrature verranno disposte su schermo: la telecamera con valore 0 sarà posta sopra quella con valore -1 e sotto quella con valore 1 e così via.
Due telecamere riprendono gli stessi oggetti da angolazioni diverse. La camera con sfondo blu si trova sopra quella con lo skybox, quindi avrà un valore di depth più alto! - Rendering Path: Da qui potremo scegliere quale tecnica utilizzare per eseguire il rendering della scena. In questo corso non parleremo di tecniche di rendering poiché si tratta di un argomento complesso e poco utile per un corso base. Quindi, almeno per il momento, possiamo glissare sull’argomento senza sentirci in colpa!
- Target Texture: Quest’opzione ci permetterà di creare televisioni, megaschermi e tabelloni vari contenenti video di una parte della scena. Per far sì che ciò avvenga dovrai creare una nuova render texutre dal Project Panel, selezionarla dal relativo pannello del camera component e poi trascinarla sull’oggetto che dovrà accogliere la nostra ripresa. (Attento! Così facendo non potrai più visualizzare l’output della telecamera su schermo, quindi se hai intenzione di utilizzare una target texture, fallo su una telecamera che non sia quella principale!)
- Occlusion Culling: Opzione molto utile che disabilita il rendering degli oggetti non visibili dalla telecamera, rendendo così il processo di rendering più veloce.
- Allow HDR: Abilita l’utilizzo dell’ormai famosissimo “High Dynamic Range rendering” per la telecamera. Normalmente qualsiasi pixel su schermo possiede un valore che va da 0 ad 1 per ogni canale R G e B, dove 0 è il valore minimo ed 1 il valore massimo. Abilitando l’HDR si ha la possibilità di utilizzare valori al di fuori di questa scala,così da poter sfruttare effetti grafici particolari atti ad aumentare il realismo della scena e rendere la telecamera stessa più simile all’occhio umano (di seguito vedremo qualche esempio).
Image Effects: come rendere un’inquadratura mozzafiato!
Per fissare meglio le idee, in questa parte della lezione utilizzerò una delle scene predefinite di Unity. Non dovrai necessariamente scaricarla, ma se vorrai, potrai trovarla sull’asset store col nome di “Corridor Lighting example“.
Adesso è tempo di portare la nostra telecamera al livello successivo: nessun videogioco che si rispetti utilizza una telecamera nuda e cruda, e l’uso di vari filltri ed effetti atti a migliorare l’aspetto generale del gioco è quasi obbligatorio! Andiamo a vedere brevemente come utilizzare alcuni di questi effetti in Unity:

Per prima cosa sarà necessario importare nella nostra scena un package contenente tutti gli script relativi agli effetti che intendiamo applicare. Per farlo ti basterà cliccare qui ed importare il tutto esattamente come abbiamo già fatto con gli standard assets . Dopo un piccolo caricamento tutti gli script responsabili degli effetti che intendiamo aggiungere saranno importati nel nostro progetto di Unity, quindi non resterà che inserirli nella telecamera!
Selezioniamo la telecamera e, dal suo Inspector Panel, clicchiamo su “Add Component>Effects>Post Processing Behaviour“. Tale script avrà bisogno di un oggetto di tipo Post Processing Profile che potremo creare dal nostro project panel, cliccando su Create>Post-Processing Profile (non dimenticare di trascinarlo all’interno del post processing behaviour dopo la sua creazione!) . Selezionando il post processing profile vedremo apparire nel nostro inspector panel tutti gli effetti attivabili. Vediamo insieme i più importanti:
Antialiasing
L’aliasing è una delle principali piaghe della computer grafica: è quella fastidiosissima scalettatura che si presenta nei bordi di una qualsiasi linea obliqua (e di conseguenza nel 99,9% degli oggetti di un videgioco). L’antialiasing è un filtro che pone rimedio a questo problema sfumando i contorni degli oggetti e rendendoli meno definiti ma più belli da vedere.

Bloom
Il Bloom è quell’effetto che si verifica quando una superficie molto luminosa sembra emanare un certo bagliore. Questo effetto va a braccetto con l’HDR di cui abbiamo parlato poche righe sopra: avrai risultati migliori attivandoli entrambi!

Screen Space Ambient Occlusion (SSAO)
Abbiamo già parlato di ambient occlusion nella scorsa lezione. Questo filtro non fa altro che applicare l’effetto di occlusione ambientale a tutti gli oggetti inquadrati dalla telecamera, aumentando così la profondità della scena!

Conclusioni
Questi sono solo alcuni degli effetti che Unity mette a nostra disposizione. Ne esistono decine, e ti consiglio di esaminarli uno per uno di persona: alcuni sono davvero grandiosi! Con questa lezione chiudiamo la parte del corso relativa alla grafica, e con la prossima lezione inaugureremo la parte relativa alla logica parlando di fisica!