Tag Archives: 3d

3D shapes with Hemesh

hemesh01
HEC_Geodesic. made with Processing and Hemesh.

These incredible shapes have been created with Hemesh, a library for Processing created by Frederik Vanhoutte (W:Blut) for creating and manip­u­lat­ing 3D meshes. I just downloaded the lib and started coding, trying to render them with Christopher Warnow’s SunflowApiApi. So far, these are the results. Amazing libraries!

hemeshsunflow
hemeshsunflow02

After some figuring out, I got SunflowApiApi to work directly from Processing! Still did not get perfectly how to use the 8 available shaders and how to set up the scene global illumination, but the first results are impressive.

Typo Mishap

typomishap
Typo Mishap. Rendered with P5Sunflow.

Typo Mishap. Applet and source code: http://www.openprocessing.org/visuals/?visualID=9333

Come anticipato, inizio a studiarmi jBullet – il Java port di Bullet Physics (open source collision detection, rigid and soft body dynamics library), visto che é proprio quello che serve per aggiungere convincenti effetti di fisica agli oggetti 3D disegnati in Processing; la lib é molto complessa ed espone centinaia di classi e metodi per calcolare collisioni, primitive, inierzia, posizioni, piani, velocità, accelerazioni, punti di contatto, shapes convesse e concave, eventi, algoritmi ecc… Si é reso necessario un decompiler per leggere le classi (.java) contenute nel .jar della demo Applet originale; questo é l’unico modo per poter affrontare le API di Bullet Physics almeno per identificare chi-fa-cosa. In questa situazione iniziale é chiaro che per comprendere, devo ricostruire la demo base trovando però un punto di contatto efficiente tra le funzionalità di disegno (rendering) in Processing e quelle di calcolo di forme e comportamenti in Bullet. Comunque – e questa é la parte che mi entusiasma – non ci sono limiti a ciò che si può realizzare, perché questa libreria é scelta come framework per le simulazioni da almeno 3 su 10 tra le Top Game Companies che sfornano videogames per Wii e PS3.

r003
lettercam
Kill ‘em all! Posso creare forme e lanciarle nella direzione del lookAt point della camera partendo dalla posizione della stessa. Delle vere e proprie cannonate!

Nello sketch in cui ho tentato di usare per la prima volta Bullet, riprodotto nel video in alto, ad ogni key press la lettera o il numero corrispondente vengono creati e per effetto della gravità piombano sul piano sottostante; le forme sono dei veri e propri corpi rigidi che si fermano sui loro punti di contatto senza attraversarsi. La versione con cui si può ‘giocare’ sotto forma di Applet corredata di sorgente, è come al solito disponbile su OpenProcessing. Col mouse e tasto sx si ruota, col dx si fa zoom, e con la tastiera si creano i Characters.

Il poter simulare la matericità delle cose, ottenere reazioni in seguito ad azioni (come avviene nel mondo che ci circonda) suscita in me la stessa ‘frenesia creativa’ che potrebbe avere un pittore messo di fronte alla più grande tela bianca che potesse desiderare.

 

textrusion

two
letterExtruder http://www.openprocessing.org/visuals/?visualID=9401

Come già visto in qualche post precedente, l’oggetto PGraphics permette di disegnare offscreen; è possibile poi analizzare pixel-per-pixel l’immagine PImage generata ed utilizzare le informazioni come colore e posizione dei pixel per inventarsi qualcos’altro. Da qualche giorno ho scoperto una tecnica per scrivere in 3D partendo da ‘pixel font’ originariamente renderizzati in 2D (i pixel font sono caratteri appositamente realizzati per poter risultare leggibili a dimensioni ridottissime, molto usati nei siti Flash, senza antialias) su di un PGraphics. Ho realizzato queste due Applet dalle quali potrete capire il funzionamento ma avrete la pazienza di studiarvele senza ulteriori indicazioni. Intanto sto indagando ulteriormente per applicare della fisica con jBullet, al fine di poter simulare la collisione tra le forme. Posterò gli sviluppi.

Axiom

genarch02

Viste le considerazioni degli ultimi mesi in materia di grafica generativa con Processing, e sperimentazione sulla possibile ramificazione degli alberi 3D, non potevo non affrontare lo studio degli L-Systems che poi, sono niente di più che un sistema ricorsivo di riscrittura di stringhe. Ah bene, chissà che mi credevo. Si, ma richiedono moltissima sperimentazione anche se a prima vista appaiono semplici.

In questo breve primo post sugli L-Systems voglio solo annotare alcuni concetti di base nel solito monologo – non necessariamente chiaro e comprensbile – atto a tener traccia dei miei progressi, se di progressi posso parlare; tutti gli L-System, come già visto per gli automi, funzionano richiamando sempre una stessa funzione – sono ricorsivi – che implementa determinate regole e possono essere realizzati con questi elementi:

  • Una grammatica generativa (assioma, regole, processo di sostituzione)
  • Un parser (di stringhe)

La grammatica generativa.
Per grammatica di un sistema semplice si intende un set di 3 simboli come F+-
I simboli si differenziano in terminali e non-terminali; i simboli terminali (+-) servono, per esempio, a ‘girare’ entro un certo angolo un oggetto disegnato; i simboli non-terminali (F) servono a disegnare un nuovo oggetto. Questi simboli sono convenzioni, si posso usare tutti i simboli che si vuole, ma é sempre meglio attenersi alle convenzioni, per praticità.
All’inizio del processo viene letto un assioma e cioé un simbolo (o più simboli) del linguaggio predefinito (F ma anche F+F o più lunga) a partire dal quale inizia il processo di sostituzione ricorsiva; potremmo definirlo il ’seme’ del processo. A seguire viene applicata la regola, scritta con un qualsiasi elemento del linguaggio predefinito, come per esempio: F+-F–F+F. Ogni volta che il parser incontra un carattere F (non-terminale), genera una nuova forma e rigenera per intero la regola, una volta per ogni simbolo non-terminale; ogni volta che il parser incontra un simbolo terminale (+-) ruota il sistema di coordinate prima di generarla. Voilà, ecco il branching? Non proprio, le piante crescono in un contesto tridimensionale e quindi non basta girare su un asse soltanto. Vanno perciò introdotti altri simboli per effettuare il push ed il pop del matrix stack; per convenzione sono []<>^&
In un contesto bidimensionale però sono sufficienti i set di caratteri di base F+- per creare il Koch snowflake e lo Sierpinski triangle, che sono ritenuti un tipo di frattale.

Il parser.
Questo é il cuore di un L-System, é la funzione ricorsiva che applica la regola iniziale (assioma) e da il via alla generazione della nuova stringa. Ad ogni loop – o generazione – la stringa viene analizzata carattere-per-carattere e genera una nuova stringa, più grande, fino all’infinito. Il solo limite é la potenza del computer sul quale gira il sistema.

lsys01
lsys02
L-System test
Axiom: F
Rule: F-<[F>-^-<F]>+F

Insomma, c’è molto da sperimentare perchè le cose si fanno davvero complicate quando si cerca di controllare la complessità/caoticità proprie degli L-Systems; l’appeal estetico di questi sistemi (queste due immagini non sono appealing, ma rendolo l’idea della rapidità di crescita e caoticità di forma ottenibili in sole 6-7 generazioni) risiede nella imprevedibilità delle forme che si possono creare. La tentazione di creare ‘arte’ generativa con questi sistemi é forte, ma c’è un ma: essi sono ricorsivi e deterministici, cioè si ottiene – a fronte di una certa regola – sempre la stessa forma, per quanto inaspetattamente stravagante; per questo esiste la possibilità di complicare ulteriormente la faccenda con sistemi randomici, parametrici, dipendenti dal contesto e/o da altri fattori. Di queste amenità continuerò l’esplorazione, chissà che non mi esca qualcosa di interessante.

Computer Vision

cvision
Self-Portrait, March 2010. Fun with Processing and OpenCV.

Finalmente sono riuscito a far funzionare OpenCV (Processing implementation) sul mio PC. Questa immagine è il risultato della elaborazione con Processing e OpenCV del video feed proveniente dalla mia webcam: analizzando la luminosità brightness() dei singoli pixel di ogni frame, e sapendo che il risultato è per forza compreso nel range 0-255, è possibile usare tale valore per spostare sull’asse Z dei vertici che una volta uniti, formeranno delle linee. Maggior brighness maggior Z cioè più vicino.

Automata

conesnail
Image credits: Conus Textile (da Wikipedia). Il pattern del guscio é generato con meccanismi che ricordano quelli degli automi cellulari, cioé ogni cellula secerne pigmento a seconda dello stato di attività delle cellule adiacenti.

Ho indagato sull’ offscreen buffer di Processing, ed in particolare su come lo si può usare per ottenere e manipolare immagini generate a runtime. Con l’oggetto PGraphics e i metodi beginDraw() ed endDraw(), è possibile disegnare (anche in 3D) fuori dallo schermo, e poi usare l’immagine ottenuta per eseguire ulteriori calcoli e/o applicare effetti e usarla come fosse una qualsiasi immagine da visualizzare a schermo; in realtà pGraphics si usa molto spesso per l’output ad alta risoluzione da Processing (per es. immagini TIFF da 3000 px di larghezza), ma in questo caso, ho utilizzato questi buffer (nel mio caso sono 6, 251 px di lato) per disegnare una serie di patterns per mezzo di un automa unidimensionale. Gli automi sono molto interessanti perchè a dispetto della loro apparente semplicità producono risultati inaspettati e sorprendenti; frattali, automi, L-systems e in genere tutte le funzioni ricorsive governate da ‘regole’ servono a comprendere e spiegare i modelli morfologici di una grande varietà di organismi del mondo che ci circonda; in computer graphics quindi, questa serie di algoritmi e regole rappresentano l’unica via per poter simulare efficacemente organismi complessi, come le piante.

cautomata
Elementary Cellular Automaton http://www.openprocessing.org/visuals/?visualID=8207 – GC Mingati

Un Cellular Automata (CA) di tipo unidimensionale é un sistema composto da griglie di celle e regole che definiscono le modalità di comportamento di ogni cella, per ogni nuova generazione, a seconda dello stato (colore) dei suoi vicini. In altre parole, supponendo di avere una riga di 3 pixel posti orizzontalmente ed il pixel di mezzo bianco con gli altre due vicini neri, possiamo stabilire, di generazione in generazione quale sarà il colore risultante da questa condizione di vicinato. Avremo quindi una nuova condizione, a cui applicare una nuova regola. E così via. Ci sono 8 possibili configurazioni di vicinato da cui scaturiscono 256 possibili regole.

Nella Applet ho usato l’oggetto PGraphics per disegnare un automa su ogni faccia. Una volta completato il render delle facce, potete premere ‘r’ da tastiera per disegnare nuovi pattern.