2 parole sul modulo Toon di Maya (versione 7.0)
(nonché 4 nozioni di teoria della percezione buttate là, tra il lusco e il brusco)


Probabilmente leggendo la prima parte di questa piccola guida all'NPRR (Non-Photo Realistic Rendering) in Maya, molti di voi avranno pensato: "Vabbè, ma a me chemmefrega? Gli sviluppatori di Maya si sono sperticati per creare il modulo toon, perché non usarlo?".
Avete ragione. Usatelo. Il fatto è che gli sviluppatori non è che si siano sperticati poi così tanto, perché tutti i materiali aggiuntivi del Toon di Maya non lo sono affatto. Se infatti create  (fatelo proprio ora), ad esempio, il material pomposamente nomato "threeToneBrightnessShader"  non otterrete altro che un RampShader (quello del 1° tutorial per intenderci) già settato su tre toni di una tinta che di default è il rosso. Allo stesso modo, il materiale "solidShader" è un surfaceShader bello e buono. Per averne la riprova aprite l' AE (Attribute Editor) del materiale e leggete che c'è scritto alla voce "Type". Con questo non voglio dire che non dovete utilizzarli, ma che ora siete consapevoli di quello che andate a fare.
L'effetto certamente più ganzo di tutto il modulo Toon è la possibilità di aggiungere un' outline ad un oggetto (Rendering>Toon>Assign Outline>Add New Toon Outline). Per Outlines, in sintesi, s'intendono tutte quelle linee che uno disegnando a mano crea senza aggiungere effetti di chiaroscuro. Allego al solito disegnino scannerizzato a mo' d'esempio.
outline
Si tratta di quello che impropriamente è chiamato schizzo. Mancano cioé molte informazioni riguardo alla 3a dimensione.

[Una nota: il termine "rendering" deriva dal francese "rendre" e ancora prima dal latino "reddere", una cosa come: "portare ad evidenza, a contrasto, rendere (evidente)". Si usa correntemente al posto di "Chiaroscuro". Nel nostro contesto significa più o meno: "fornire tutte le informazioni tridimensionali del caso".Tuttavia parte di queste informazioni 3d assenti de facto, ce le mettiamo noi nel momento che osserviamo la serie di linee disposte sul foglio. La nostra mente è fatta per riconoscere forme, ed è talmente abituata a farlo che gli viene spontaneo anche quando mancano. In senso più ampio, riconosciamo strutture ed è proprio questo che sfruttiamo nell'NPR].

Un outlining ben fatto - cosa non trascurabile - varia lo spessore del tratto a seconda di:
1) prossimità dell'osservatore (linee vicine più spesse)
2) fonti di luce (linee in ombra più spesse)
Generalmente, quando disegnamo possiamo usare le informazioni del chiaroscuro (o del rendering) in aggiunta a quelle dell' outline per conferire una certa dose di ridondanza alle informazioni complessive sulla tridimensionalità di un oggetto. Se possiamo farlo su un pezzo di carta, possiamo farlo anche con Maya e le Outlines del modulo Toon.
Tecnicamente le outlines del Toon sono dei Paint Effects (e qui ritorno sul fatto che non si sono inventati niente di nuovo): il vantaggio è che offrono un' ampia gamma di possibilità di configurazione (estensione delle linee, angolo entro cui sono disegnate, spessore, possibilità di conversione in mesh); lo svantaggio (almeno per me) grosso è che sono view-dependent. Fate una prova. Assegnate le outlines ad una mesh è provate ad effettuare un semplice tumble di camera. Nun se move. L'interattività è ridotta a quasi zero perché il grosso delle informazioni usate per generare in modo acconcio le outlines dipendono dal punto di vista attuale, cosicché maya - ogni volta  che cambiate il minimo parametro - deve ricalcolarsi tutta la scena, fatto, questo, che me le fa scartare per la stragrande maggioranza delle volte. Il fenomeno della view-dependence occorreva anche nel tutorial di Cherubini (Ricordate?), perché anche il fur soffre della stessa pellagra. Comunque ritorneremo sull'argomento in una delle lezioni successive.

Outlining, Edge-Detection, Segmentazione, Silhouette, Razzi e Mazzi.
Più o meno sono tutti parenti.
razzo01
L'immagine che vedete è stata ottenuta portando l'environment color (AE della camera alla voce environment) a bianco ed assegnando all'oggetto un surface shader senza modificare nessuno dei suoi attributi. Questa è una silhouette e si capisce anche abbastanza bene che appartiene ad un razzo. Il surface shader è un materiale che  le informazioni di profondità le ammazza se renderizzato. Tuttavia l'oggetto è a tutti gli effetti tridimensionale.
razzo01Depth
La seconda immagine è stata ottenuta forzando maya a trattenere una Dmap [che è la mappa di profondità che viene generata per stabilire le relazioni tra gli oggetti, tra l'altro l'inquadratura è differente perché è calcolata nello spazio della luce e non della camera). Da qui si evince che il razzo ha anche una cabina è un altro timone, cosa che non si poteva vedere da una sola silhouette. Precisamente l' edge è il bordo della silhouette. Duplicando il razzo ed assegnandogli un Surface shader rosso, otteniamo quest'altra immagine.
razzo02
Distinguiamo due razzi perché c'è discontinuità tra le due Silhouette. Più o meno quella discontinuità è l'edge detection. Per Outlining s'intende qualcosa di più [come il rilevamento di una T-junction, per esempio]. Sempre più o meno, la segmentazione è l'equivalente 2d dell' outlining, ottenibile applicando alla bellemeglio il filtro find edges di photoshop.
razzo02segment
Per ottenere un buon Outlining un programma 3d sfrutta tutte queste informazioni assieme  ad altre [depth sorting, algoritmo del pittore, etc.]. Il punto è che esse sono nascoste al  livello d'interazione base col software; quindi è il caso di passare in rassegna le varie possibilità di outlining disponibili in Maya nonché alternative a quella offerta dal modulo Toon :

Outlining Vettoriale di base
outvect0001
- assegnare un lambert bianco a tutti gli oggetti sulla scena ed impostare l'environment color a bianco;
- aprire la finestra del render settings e scegliere come motore di rendering Maya Vector;
- potete o meno lasciare il segno di spunta su Fill Objects, è indifferente;
- alla voce Edge Options, marcate Include Edges:
- la voce Edge Weight ci dà lo spessore del tratto: sono disponibili dei preset, o possiamo darne uno customizzato;
outvect9
- alla voce Edge Style possiamo scegliere se vogliamo le Outlines vere e proprie o l'intera mesh;
outvectmesh
- Hidden Edges ci dà anche le linee nascoste;
- il segno di spunta su Edge Detail ci dà accesso alla voce Min Edge Angle che ci permette di controllare l'angolo di vista minimo entro cui Maya Vector considera una linea degna di essere tracciata;
outvectminangle10
- la voce curve tolerance va da 0 a 15: 0 = 1 segmento per ogni edge poligonale (fitta esattamente il contorno)outvectTol0;
15 = unica linea curva per tutto il contorno (si discosta abbastanza dal contorno =>leggi: superfici deformate)
outvectTol15

Vantaggi:
Il rendering è piuttosto rapido;
Se ci si limita all'outline, il file è leggero;
Svantaggi:
Non c'è controllo sul grado di spessore dell'outline (non si possono modificare gli spessori lungo la linea);
Può deformare l'aspetto degli oggetti;
Non supporta bump né displacement (a meno di non convertire in mesh), né fur, né fluids, né paintfx, né image plane;
Renderizza solo Point Lights;
Si deve passare per il compositing

Faked Outlining:

FO
- si salva una versione della scena e se ne fa una copia che acchitteremo opportunamente;
- si cancellano tutte le luci dalla scena;
- si esclude la visibilità di tutti gli oggetti che non stanno di fronte all'oggetto d'interesse;
- si crea una nuova camera e la si rinomina per distinguerla dalla Persp;
- si apre il suo AE e si setta l'environment color a bianco;
- si crea una spot light coi seguenti valori:
- intensity = 3
- cone angle = 170
- si fanno assumere alla spot gli stessi valori di trasformazione (traslazione e rotazione, la scala non è importante) della camera appena creata, dopodiché la si parenta a quest' ultima (seleziono spot, Shift + seleziono Camera, tasto p);
- si creano due lambert, uno per l'oggetto primario, l'altro per gli oggetti di occlusione (quelli che si trovano tra il primario e l'inquadratura);
- entrambi gli oggetti hanno il colore a bianco puro;
- al lambert degli oggetti di occlusione si porta l'attributo ambient a 2 (bianco con valore 2 in coordinate HSV);

Vantaggi:
Serve solo per applicazioni specifiche (Texture disegnate a mano);
È regolabile
Dà outlines sfumate che seguono le superfici
Svantaggi:
Va regolato.
È laborioso.
Bisogna fare 2 rendering e poi compositing.
La spot altera la distribuzione "realistica" delle ombre sulla scena.

Outlining in Mental Ray

Senza alcun dubbio, si tratta della soluzione più completa e flessibile. Gli shader contour di MR permettono di far variare colore e spessore dell'outline in base ad informazioni di natura geometrica e/o posizionale ovvero in base al tipo d'illuminazione, al materiale sottostante e persino al frame attuale dell'animazione. L'output può essere l'outline semplice oppure l'outline già composita con l'immagine raster, oppure ancora un file postscript. Ovviamente il settaggio di una shading network che tenga conto di tutte queste informazioni non è proprio elementare. Per generare un' outline MR ha bisogno contemporaneamente  di quattro tipologie di nodi distinte: nodi output; nodi store; nodi contrast; nodi shader propriamente detti. La chiamata ai nodi shader (che specificano colore e spessore dell'outline) viene effettuata durante la rasterizzazione ordinaria della scena; questi a loro volta effettuano una chiamata ai nodi store ogni qual volta un raggio (MR è un raytrace renderer) intercetta lo shader. Il nodo Contrast infine, decide dove piazzare l'outline confrontando le informazioni date dai due nodi precedenti. I nodi output infine decidono il tipo di output.

Outline semplice

OutlineMR1
Dà come risultato una linea a spessore costante ed è la più rapida a calcolarsi. I contours da usare sono quelli che sono specificati come "simple":
- contour_shader_simple va connesso allo shading group del materiale sotto al menù mental ray alla voce "Contour Shader" (potete specificare colore e spessore)
- i nodi contrast e store (function_simple) vanno connessi alla finestra dei render settings, alla voce Custom shaders sotto le opzioni contours;
- il nodo di output va connesso alla camera in uso (output shader sotto la voce output passes della camera): scegliere composite se si vogliono outline sopra i materiali, contour only se si vogliono solo le outlines, ps per generare un postScript.
OutlineMR2
Notate come le outlines vadano anche sulle riflessioni.

Outline complesse

Un tutorial esaustivo sul contour in MR è stato già scritto, da uno molto più bravo di me, per cui a lui vi rimando jhavna comunque la logica del settaggio nodi è la stessa dell' outline semplice, semplicemente vanno usati i nodi omologhi.

Outlining col Nodo Sampler Info

È quello utilizzato nel primo tutorial. Si può combinare l'informazione facing ratio con una ramp che agisca direttamente sull'attributo color oppure sull'attributo Incandescence. L' incandescenza è l'informazione di luce e colore che sembrano essere emesse direttamente dalla superficie. Se, come abbiamo fatto nella prima parte della nostra piccola guida, vi mappiamo una ramp con due valori di cui il primo ha coordinate HSV -1, -1, -1 "sottraiamo tinta, saturazione, luminosità al bordo, ottenendo un outline privo di colore (nero).

Tratteggi (hatching):

Distinguiamo due tipologie di tratteggi fondamentali:
- tratteggi procedurali;
- tratteggi scannerizzati;
I pro ed i contro delle due tipologie sono le solite: texture procedurali sono indipendenti dalla risoluzione e da quanto ci si avvicina al modello, ma hanno qualcosa di palesemente cg, viceversa per le texture da file.
Nozioni di base per la costruzione di hatching networks:
La cosa che rende maya un programma speciale è la sua completa customizzabilità, nell'immediato proseguo illustrerò alcuni principi base per sfruttarla che applicheremo nel tutorial conclusivo.

Rampe di Intensità (Controller):

La maggior parte delle shading network npr fa uso intensivo di un controllo basato su una funzione monotòna lineare - una rampa normalizzata (da 0 a 1) che in maya viene implementata semplicemente con un nodo Ramp da bianco a nero.

Somma e moltiplicazione di Textures:

Nella sezione color balance di molti nodi sono presenti gli attributi (rimappabili) Color Gain, Color Offset. Potete leggerli come Moltiplica e Somma rispettivamente. Per esempio, se avete mappato una texture con delle aree nere, queste resteranno comunque nere se mapperete sul gain una mappa bianca (moltiblicazione: 0,0,0 * 1, 1, 1=0,0,0), viceversa mappando un offset diventeranno bianche (somma: 0,0,0+1,1,1=1,1,1).
Risultati analoghi otterrete utilizzando i nodi utility: Plus/minus/Average e Multiply/divide. In generale usando gli offset le texture schiariranno, col gain andranno scurendosi.

Pattern di Moirè

Un set di linee dritte e parallele dovrebbe restare tale anche in prospettiva, soprattutto se la prospettiva in questione è generata al computer, tuttavia questo non accade. In generale, quando ci sono texture ad alto contrasto (e i tratteggi ricadono in questa tipologia) si generano degli artefatti dovuti ad aliasing, nella fattispecie quando il dettaglio contenuto nella texture è più piccolo del pixel corrispondente sullo schermo. Maya utilizza un sistema di filtraggio antialiasing chiamato mipmapping consistente nel salvare in memoria versioni della texture linearmente decrescenti (512X512, 256X256,128X128,...,1X1) e richiamare la corrispondente texture scalata a seconda della vicinanza del dettaglio alla camera.Questo processo funziona meglio con texture bitmap, tanto che texture procedurali non seguono il mipmapping standard. Possiamo comunque agire sugli attributi filter e filter offset per correggere certi artefatti. Infatti per via del filtraggio, il singolo texel viene leggermente offsettato nell'immagine raster finale, non seguendo più perfettamente l'ideale linea di fuga. Si genera così un fenomeno di interferenza luminosa noto come pattern di Moirè, per il quale vi rimando al link seguente: Effetto Moiré

Alte e Basse Frequenze:
Anche la mano più ferma, persino se si avvale di riga e squadra, non è capace di disegnare una linea perfettamente costante come spessore, direzione intensità (dithering). Questo "difetto" intrinseco della mano umana è ciò che conferisce, per così dire, calore ad un disegno realizzato a mano, fosse anche un disegno tecnico. Mentre la sua assenza produce quella fastidiosa "freddezza" del disegno cg, ad esempio di una tavola di AutoCad. Il problema si presenta in maniera piuttosto accentuata nel caso delle hatching network procedurali, anche se in parte si osserva un minimo compenso dovuto a pattern di moiré che ne complicano la regolarità (i pattern di moirè, sono disturbi regolari e ripetitivi, non pseudocasuali). Possiamo ovviare a questo problema introducendo (con l'uso degli attributi color gain ed offset) dei disturbi pseudocasuali (pseudo, in quanto comunque generati dal computer). Per farlo, in maya esistono delle texture apposite che brevemente vi elenco: water, perlin (billow, wave, wispy, space time) noise, mountain, brownian, cloud, crater, stucco, granite, leather, marble, rock, solid fractal, volume (perlin, billow, wave, wispy, space time) noise. Non mi dilungo sul concetto di frequenza spaziale, che do per assunto. In questa sede vorrei solo farvi notare che esistono dei disturbi tipici a bassa frequenza, o "lento-variabili", che sono quelli tipici di una linea tracciata a mano e non perfettamente rettilinea, e disturbi ad alta frequenza, o "rapido-variabili", come quelli dovuti al fatto che state disegnando su carta ruvida (ad esempio). Capite da voi che in un tratteggio "non-cg" sono presenti entrambi e che dunque dobbiamo includerli nella nostra hatching network se vogliamo che il risultato sia verosimile.
Ad esempio:
Potete osservare una texture water a una frequenza che per noi sarà "bassa"
water3419
e la stessa texture ad una frequenza "alta"
water15
Cercate - dall'osservazione delle immagini che seguono cosa è successo mappando la text ad alta freq. sul color offset di quella a bassa freq.
wateroffset;
notate il diverso effetto ottenuto mappando la texture ad alta freq sul color gain di quella a bassa freq.
watergain

Nodi catcher e nodi fader:

In tante network di questo tipo alcuni nodi si occupano di captare le informazioni di distribuzione delle intensità luminose secondo uno dei modelli standard (blinn, lambert, phong): questi nodi vengono usualmente chiamati "nodi catcher"; queste informazioni vengono poi modulate sulla base di un controller a rampa in un nodo detto "fader" che non è altro che una semplice shading map: un nodo che è stato progettato proprio a questo scopo.

La prossima volta ci occuperemo di tecniche di hatching da file. Concludo ora, invece, con un tutorial riepilogativo di quanto detto in questa terza parte della nostra guida.

Tutorial: "Hatching network"

Sia ben chiaro che il metodo che vado ad illustrarvi non è il solo utile a creare una hatching network, ma credo abbia una sua validità, per così dire generale, se uno vuole farsi le proprie shading network in maya (anche fotorealistiche). Di nuovo, abbiamo bisogno di un surface shader per avere un effetto "schiacciato" (Interessanti varianti potetete ottenerle sostituendo al Surface un materiale con della riflessione, ad esempio un blinn). Createne uno, rinominatelo "materialeTratteggio" ed assegnatelo alla geometria che volete "tratteggiare". Il nodo texture che più si avvicina ad un tratteggio è il grid: createne uno e rinominatelo "trattoBase", quindi mappatene l'attributo color sul nodo materiale Tratteggio. Per ora avrete ottenuto una griglia bianca su sfondo nero mappata sulla vostra geometria. Per aumentare la frequenza spaziale di questa griglia, come molti di voi sapranno, è sufficiente aumentare il valore di repeatUV nel nodo 2dtexturePlacement. Tenete presente che all'aumentare della frequenza spaziale, per fenomeni dovuti in parte all' acuità visiva umana, in parte a fenomeni d'interferenza luminosa, il contrasto diminuisce producendo un grigio indistinto. Impostate Vwidth del grid a zero per ottenere tante linee parallele. Adesso dobbiamo creare  un blinn ed un nodo shading map che rinomineremo rispettivamente catcher e fader. Collegate il catcher al fader con collegamento di default (MMB + ctrl trascinando dal catcher al fader). Collegate il fader al tratto base così: fader.outColorR->trattoBase.uWidth. Create ora una Ramp texture e rinominatela controller. Eliminate il blu dalla ramp, ponete il rosso a nero ed il verde a bianco, mappate: controller.outColor->fader.shadingMapColor. Se provate a fare un test render a questo punto otterrete tante linee parallele bianche e nere; se sono sufficientemente fitte noterete anche la formazione di pattern di Moirè. Lo spessore delle linee bianche è pilotato dal colore del fader, a sua volta controllato dalla rampa (di qui il nome...). Il Catcher dice alla network su quale modello deve comportarsi: in questo caso, il blinn. Se modificate gli attributi di specularità otterrete effetti differenti. Ora dovrete aggiungere i disturbi. Per prima cosa dobbiamo rendere meno regolare la disposizione delle linee. Per cui impostate rotateUV del nodo 2dtexturePlacement del tratto Base a 45; ora  settate noise UV a 0.002 e a 0.001. Ora ci serve un disturbo a bassa frequenza (mappate un solid fractal sul gain del controller) ed uno ad alta frequenza (ad esempio un fractal sullo specular del catcher).

networkintermedia
A questo punto dovremmo aver ottenuto un tratteggio "semplice". È piuttosto evidente la matrice procedurale.
trattsempl01
Per "sporcare" lo shader un po' di più, realizzeremo un tratteggio minimamente incrociato utilizzando la network appena creata come componente base. Duplicatela (dalla finestra hypershade: Edit->Duplicate->ShadingNetwork): la nuova rete si chiamerà "materialeTratteggio1". Del nodo di piazzamento texture 2d di trattoBase1, modificate il rotateUV a 0. A questo punto create un Layered Shader che chiamerete materialeTrattIncroc. trascinate i materiali sopra il Layered shader appena creato. È sufficiente aumentare la trasparenza del materiale più a sinistra per creare il nostro shader finale
networkfinale
che per come ho settato io i parametri assomiglia a un lavoro ad inchiostro.
trattfinale
Modificando gli attributi del catcher, del controller, del layered shader e della texture 2d del grid otterrete effetti molto differenti. Una hatching Network molto famosa è quella che riproduce un tratto alla Escher, è liberamente scaricabile.


(continua...)

---
Questo articolo è stato importato automaticamente dal forum il 31/lug/2014
Per vedere il post originale e/o i commenti sul forum prima di quella data clicca qui