mercoledì 20 ottobre 2010

Novità sui nodi

Nuovi Nodi
In occasione dell'implementazione delle nuove mappe AmbientMap e ReflectMap ho voluto aggiungere i seguenti nuovi nodi:

SingleToSingleUnit
Trasforma la connessione di input di tipo Single in una di output di tipo SingleUnit. Utile per bloccare un valore Single tra 0 e 1.

RayNormal
Restituisce un il vettore normale all'intersezione del raggio.

RayDirection
Restituisce un il vettore direzione del raggio.

ReflectRay
Questo nodo ha come input due connessioni di tipo punto 3d: il vettore normale e la direzione. Il risultato è il vettore riflesso utile come input del nodo XYZ2UV per la mappa riflesso (ReflectMap).

P3DtoTextureSpace
Questo nodo serve a trasformare le coordinate di un oggetto in quelle a una unità per le mappature che si applicano interamente all'estensione dell'oggetto come quella Cylinder o Planar.

Modifica Nodo XYZ2UV
Aggiunto l'attributo "mapping" utile alla scelta dei tipi mappatura:

Avvolgimento su superficie
Cylinder Mapping Planar Mapping Sphere Mapping

Environment
 
Esempio di texture di tipo Probe
Picture courtesy of Paul Debevec.
Esempio di texture di tipo Sphere (anche chiamata Spherical)  

Nuovi Shader di tipo Bitmap
Implementati alcuni nuovi nodi shader utili alla semplificazione dell'applicazione di una immagine a una mappa di un materiale o a un ambiente.

SurfaceBitmap
Nodo utile all'applicazione di una immagine alla superficie di un oggetto.

ReflectionBitmap
Grazie a questo nodo si può applicare facilmente una immagine alla mappa riflesso di un materiale.

EnvironmentBitmap
Questo nodo è utile ad applicare una immagine all'ambiente attorno alla Scena (si usa con la mappa Environment della Scena).

BumpBitmap (ex Bump2D)
Standardizzato nel nome e negli attributi.

domenica 19 settembre 2010

Migliorie sull'Interfaccia

Rivisitazione dell'Interfaccia
Ho voluto rivedere l'interfaccia per renderla più user-friendly e per donarle un aspetto più definitivo in vista di una prossima demo...e non dico altro! ;)

Nuova Interfaccia

Una Camera più Viewport
Gestita la possibilità di assegnare velocemente una camera a più di una Viewport. Tramite una nuova finestra a comparsa all'interno di ogni vista (accessibile passando sopra col mouse su una barra posta sopra ogni viewport) è possibile scegliere la Camera assegnata.

Menu a comparsa di una Viewport

Nuove ToolBar
Aggiunte le barre degli strumenti (toolbar) classiche, utili per accedere velocemente ai comandi principali. Queste, possono essere spostate su qualunque lato della finestra di Now3D.
La prima gestisce le operazioni classiche di un file di progetto (nel nostro caso la scena) con inizializzazione, apertura e salvataggio della scena.
Sempre la prima toolbar contiene anche i pulsanti di gestione dell'Undo e del Redo, con finestra a tendina che visualizza la lista delle azioni da annullare o ripetere.
La seconda toolbar gestisce gli strumenti utili per l'editor, scelta tra le azioni possibili sugli oggetti (spostamento, rotazione, dimensionamento, rotazione tramite quaternion) e scelta tra visualizzazione a una camera o a 4 camere.
L'ultima toolbar gestirà i bottoni di configurazione e avvio del rendering RayTracing.

La nuova toolbar
I bottoni di gestione Undo-Redo incorporati nella toolbar

Gestione delle Gerarchie da interfaccia
Adesso tramite semplici comandi di "Add child to" accessibili all'interno delle finestre di pop-up associate alle istanza, è possibile aggiungere oggetti figli, e quindi creare delle gerarchie.
Per accedere a queste pop-up basta cliccare su una istanze col pulsante destro del mouse, sia sull'icona rappresentante l'istanza dell'albero della scena, che sull'istanza stessa su di una viewport.

Nuove Mappe

Molte novità in arrivo!
Eccomi qua dopo tanto tempo, a parlarvi dei lavori in corso per il nuovo Now3D. Cominciamo dalle nuove mappe.

Nuove mappe: AmbientMap, ReflectMap
Implementate le mappe mappe utili alla gestione delle luce ambientale e dei riflessi.

AmbientMap
Utile per applicare velocemente un coefficiente ambientale al materiale oppure per l'applicazione di environment precalcolato di una mappa HDR, in futuro potrebbe essere utile anche per la gestione delle occlusion map.

Esempio d'uso dell'AmbientMap Mappa Ambientale

ReflectMap
La mappa riflesso può essere utile per velocizzare il rendering nei casi in cui vogliamo sovrascrivere la mappa environment della scena per singolo oggetto.

Esempio d'uso della ReflectMap Mappa riflesso.
Picture courtesy of Paul Debevec.
Attivazione automatica dei Riflessi RT
Basterà settare un valore di intensità della ReflectMap maggiore di 0 per attivare o meno i riflessi RT (si consiglia comunque di mettere 1)

Uniamo le due mappe
La seguente immagine di esempio combina le mappe ambientmap e reflectmap attraverso un falloff sulla specularmap e il parametro "energy preserve" a Dielectric.
Materiale di tipo Ceramica

domenica 18 aprile 2010

Altre News

Anteprima del Materiale
Implementata la preview (o anteprima) del Materiale, per ora è semplicemente una conversione della versione utilizzata su N3D vecchia versione. Comunque, ne immagino una futura implementazione per una veloce anteprima dei file elencati nelle varie Dialog di scelta.


Interfaccia per l'anteprima del Materiale


Mappa Light
Un altra mappa molto utile nella costruzione di buoni Shader è quella Light (o Luce), utile per esempio per un buon Shader X-Ray oppure per simulare la texture di palazzi visti di notte, come nell'esempio seguente.


Esempio di utilizzo della Mappa Light


Energy Preserve
Una regola ferma per rendere delle superfici realistiche e che la quantità di luce riflessa non sia maggiore di quella entrante altrimenti il risultato diventa irreale. Se per esempio rendessimo una superficie troppo riflessiva (mappa specular) e contemporaneamente troppo diffusiva (mappa diffuse) avremmo un risultato poco realistico.


Energy Preserve disattivo


Se invece bloccassimo i valori di diffusione e riflessione in maniera tale che la somma dei coefficienti non superasse mai il valore di 1 allora avremmo un risultato più realistico.


Energy Preserve attivo


Standard Shader a valori da 0 a 1 e l'Invert
Create delle tipologie di Nodi che gestiscono in maniera standard dei valori di uscita a virgola mobile con range da 0 a 1. Grazie a questa implementazione ho potuto aggiungere l'attributo Invert a questa tipologia di nodi (es: shader bump, falloff, noise).

Nuovo Standard XML

Nuove fondamenta per un nuovo Now3D
Creare un programma può essere paragonato a creare una casa, se le fondamenta sono solide la casa viene su bene e dura nel tempo, tornando a Now3D le fondamenta di cui parlo riguardano l'inserimento dello standard XML nel codice di Now3D e, avendo trovato delle limitazioni nella flessibilità di programmazione nella struttura che stavo sviluppando, quindi, per risolverle, ho preferito dedicarci la maggior parte del tempo.

Sono tutti dei Nodi
L'esigenza di rivedere ulteriormente lo standard XML è scaturito dal fatto che applicando lo standard di salvataggio (e caricamento) alle istanze, ho avuto la necessità di gestire le associazioni Shape/Istanza, Materiale/Istanza e Istanza/Istanza e, immaginando l'implementazione di una semplice associazione simile a quella BRDF/Materiale e Mappa/Materiale (e cioè dei sottotag a quello principale es: shapes o materials), ne ho notato una scarsa flessibilità.
Così ho deciso che la struttura migliore per gestire le associazioni tra gli elementi di N3D fosse quella dei Nodi, in questo modo, per la connessione Shape/Istanza, si potrà, per esempio, associare una connessione di entrata "Shape" di una istanza alla corrispettiva connessione di uscita di uno Shape (per l'appunto la connessione di uscita "Shape").


Schema del nuovo Standard XML


Massima flessibilità!
Naturalmente, anche il codice è stato completamente rivisto per poter gestire questo standard. Così le classi per i Materiali, le Mappe, i BRDF, le Istanze e gli Shape ereditano dalla BaseNode e, quindi, a tutti gli effetti dei Nodi aventi connessioni, con la possibilità di connettersi tra di loro.
La flessibilità di questa struttura è assoluta; ad esempio, si può associare un materiale a più oggetti, un nodo Shader a più mappe, uno Shape a più Istanze, una istanza a un altra istanza (creando quindi gerarchie di oggetti), o perfino un Nodo a più Shader (cosa utile in caso di nodi Bitmap associati a immagini di elevata pesantezza).