Disegni con il Domino in Unity 3D

Ispirato da questa combinazione di video (primo e secondo) che per combinazione ho visto in rapida successione, ho deciso di ricreare i mosaici creati dalle tessere del domino che cadono utilizzando Unity3D e il suo motore fisico.

Ho incontrato due problemi: per prima cosa so veramente poco di modellazione 3D, e anche la semplice creazione di una tessera di domino in SketchUp, e la sua esportazione ed importazione in Unity, ha richiesto un tempo imbarazzante.

L’altra cosa su cui ho perso un sacco di tempo è stato il piazzamento della telecamera: idealmente avrei anche gestito i movimenti della stessa, ma la posizione iniziale ha richiesto veramente tanto, anche perché le tessere sono generate in real time e quindi l’ho sostanzialmente dovuta puntare contro uno sfondo bianco.

Importare l’immagine e colorare adeguatamente le tessere del domino, invece, è stato sorprendentemente facile: ho semplicemente creato una texture nella quale ho caricato una immagine quadrata, e quindi sono andato a prendere i colori nei pixel relativi utilizzando Texture2D.GetPixel.

L’animazione praticamente è venuta da se applicando un rigidbody e un collider alle tessere del domino. Ho quindi fatto inclinare la prima tessera di ogni fila in modo da cominciare a far cadere le tessere.

Qui è emerso il problema di ottimizzazione: con 100 tessere funziona tutto a meraviglia, ma con 6700 il tutto cominciava a rallentare mano a mano che le tessere cominciavano a cadere. Il sistema fisico continuava a ricalcolare la posizione delle tessere sostenute su altre tessere andando a rallentare il funzionamento dell’animazione. Per questa ragione ho deciso un tempo arbitrario dopo il quale disabilitare per ogni singola tessera gli effetti della fisica e “congelarla” nella sua posizione finale. Con 2 secondi non si nota alcuna differenza in termini di animazione, e le prestazioni diventano accettabili.

Questo semplice test è un buon inizio per cominciare a tuffarsi nei problemi dell’ottimizzazione della grafica 3D.