E1. Materia dal caos
Obiettivo
Far generare un’immagine e la sua animazione attraverso la definizione dei calcoli necessari per ottenere le componenti di rosso, verde e blu di tutti i pixel, lasciando che il caso o il rumore ne determinino l’aspetto.
Modalità
L’esercitazione si svolge con l’assistenza di OpenCode: il lavoro principale è decidere come calcolare il rosso, il verde e il blu di ogni pixel a partire dai quattro parametri e dai valori casuali, da cui dipendono le richieste all’agente. I valori numerici conviene invece modificarli direttamente nel codice.
Per iniziare, creare la cartella con il comando /crea es1 e sostituire il codice di “sketch.js”, lasciando il commento iniziale, con il codice di base riportato più avanti.
I calcoli potranno usare i quattro parametri definiti nel progetto tixy di Martin Kleppe. Per adattarsi all’immagine di riferimento e rendere la risoluzione indipendente da quella del canvas (come succede nel linguaggio GLSL usato dagli shader) le caratteristiche dei parametri saranno:
t: scorrere del tempo in secondi (e frazioni di secondo);i: indice del pixel da 0 (in alto a sinistra) a, riga dopo riga, 39'999 (in basso a destra);x: coordinate del pixel da 0.0 (sinistra) a 1.0 (destra);y: coordinate del pixel da 0.0 (alto) a 1.0 (basso).
Risoluzione del canvas
La risoluzione dell’immagine elaborata, ritenuta un buon compromesso fra qualità e velocità di rendering, sarà di 200x200 pixel. Le dimensioni del canvas, su cui l’immagine verrà mostrata, saranno invece di 600x600 pixel.
Codice di base
Il codice dello sketch dovrà essere strutturato in questo modo:
Le uniche parti da modificare saranno quelle evidenziate in bianco, relative ai calcoli delle variabili r, g e b. Almeno una volta dovrà essere usata la variabile t per poter ottenere un’animazione attraverso cambiamenti progressivi di un parametro e quindi dell’immagine, e almeno una volta una delle funzioni random(), randomGaussian() e noise(), per introdurre una componente casuale. Potranno ovviamente essere utilizzate anche ulteriori variabili che semplifichino la comprensione e i calcoli di r, g e b.
Tutto il resto dovrà essere lasciato così com’è.
Vincoli
- tela di 600x600 pixel e immagine elaborata di 200x200 pixel, come nel codice di base;
- codice di base invariato, tranne i calcoli di
r,gebnella funzionetixy(), dove si possono aggiungere altre variabili; - variabile
tusata almeno una volta nei calcoli, per animare l’immagine; - almeno una delle funzioni
random(),randomGaussian()enoise(), con il risultato usato nel calcolo dir,gob; - anteprima “preview.png” con un fotogramma rappresentativo del risultato.
Consigli
Un parametro alla volta
Mappatura dei valori
Animazione
Per introdurre variazioni progressive dei valori di rosso, verde o blu, i calcoli devono utilizzare il valore di t che, a differenza di frameCount, contiene sempre i secondi effettivamente trascorsi, anche quando le difficoltà di rendering fanno perdere qualche fotogramma.
Con noise() il tempo può essere passato direttamente come terzo parametro, ad esempio noise(x*5, y*5, t/3), senza bisogno di sin() o cos(): i valori restano comunque fra 0 e 1.
Caso, rumore e caos
Seguendo il percorso della lezione 1, l’immagine può evocare una materia ancora senza forma, come nebbie, fumi, magmi o superfici in movimento, più che figure riconoscibili.
Le funzioni random() e randomGaussian() restituiscono un valore diverso per ogni pixel e a ogni fotogramma: da sole producono la neve dei vecchi televisori, ma sommate a un valore calcolato diventano una grana (Rumore e grana sui pixel) e, confrontate con un valore calcolato, una retinatura (Retinatura stocastica), come nell’esempio più avanti.
La funzione noise() varia invece con continuità, nello spazio e nel tempo: con t come terzo parametro l’immagine si anima, e un valore di noise() usato per spostare le coordinate di un altro deforma le macchie in venature (Rumore che deforma il rumore).
Ogni chiamata a noise() pesa però circa dieci volte più di sin() o di random(), e la funzione tixy() viene chiamata 40'000 volte a ogni fotogramma: con più di due o tre chiamate per pixel l’animazione comincia a rallentare.
Esempi di codici di base
Lo schema per il calcolo dei valori RGB e il sistema tixy si trovano nella lezione 1, nel capitolo Colori e pixel casuali, insieme agli esempi di rumore, grana e retinatura.
Solo per avere qualche punto di partenza, o calcoli da integrare nei propri codici, seguono un po’ di esempi mantenuti prevalentemente statici per semplificarne la comprensione: