sabato 31 ottobre 2009

Altre News

Shader Falloff
Continuando il lavoro di traduzione del vecchio codice di N3D (versione VB6) nel nuovo N3D (versione dot.net 2.0) ho implementato il filtro FallOff che nella nuova reincarnazione diventa un Nodo perfettamente integrabile in uno Shader.


Applicazione dello Shader Falloff


Interfaccia
Migliorato lo standard di alcune interfacce che faranno parte dell'editor definitivo del nuovo N3D: treescene, lista dei materiali.


Interfaccia di gestione delle proprietà delle istanze della ScenaInterfaccia di gestione delle proprietà dei materiali della Scena


Finestra di scelta generica
Continuando l'implementazione delle finestre di scelta anche per le ultime tipologie di istanze finora implementate (luci, camere, oggetti, constraint), ho voluto standardizzarne il codice in modo da poterlo applicare facilmente a future nuove tipologie di istanze e un giorno per poter applicare delle immagini di anteprima.


Finestra di scelta di una CameraFinestra di scelta di una Luce


Caricamento File PLY
Implementata una nuova primitiva utile al caricamento dei file PLY. Grazie a questo oggetto potrò caricare degli oggetti particolarmente pesanti (>1M Poligoni) così da poter testare al meglio e ottimizzare molti aspetti del motore 3D.


Rendering di un oggetto in formato PLY contenente più di 7 milioni di poligoni

venerdì 30 ottobre 2009

Miglioramenti del Codice

Shader
Per un miglioramento sostanziale dello standard di costruzione degli Shader ho deciso di eliminare l'oggetto N3DShader e di utilizzare la sola N3DNode per la gestione completamente di uno shader.

Le Primitive
Nella versione VB6 di N3D lo standard di costruzioni degli oggetti primitivi era basato semplicemente sull'utilizzo di alcune funzioni di una classe (N3DPrimitive), una per ogni primitiva, le quali poi tornavano la rispettiva istanza.
Adesso invece grazie alle potenzialità della programmazione OOP ho potuto associare una classe ad ogni primitiva, incorporando le proprietà fondamentali di costruzione (es: il raggio interno del Torus), facilmente modificabili da interfaccia come una qualsiasi proprietà.


Interfaccia di inserimento di una Primitiva nella Scena e rispettive proprietà

Finalmente l'Undo!

Anche in questi mesi con piccoli ma importanti passi lo sviluppo del nuovo N3D è andato avanti, e tra le ultime novità la più sostansaziale è il completamento dell'implementazione dello standard di gestione dell'Undo/Redo.
Questo standard è esclusivamente il frutto di un mio lavoro, dato che sul web non ho trovato del materiale utile a questo scopo.

Lo Standard
Tramite due semplici classi (N3DUndo e N3DUndoManager) si può gestire l'undo/redo di qualsiasi metodo o proprietà o gruppi di essi. Le classi che vogliono utilizzare questo standard devono ereditare dalla N3DUndo e implementare alcuni metodi utili a raccogliere le informazioni principali per poter annullare o ripristinare una azione.
Tramite poi l'istanza globale della N3DUndoManager (g_UndoManager) è possibile ottenere la lista delle azioni salvate, e anche annullare o ripristinare una o più azioni.


Standard Undo/Redo


Prime applicazioni
Applicato lo standard Undo/Redo ad alcune proprietà dell'istanza (selezione, rotazione, posizione, scala e colore) e alla gestione dei materiali (aggiunta, caricamento, eliminazione).


Interfaccia di Undo/Redo

sabato 11 luglio 2009

Finestre di Scelta

Un altro passo nella costruzione dell'interfaccia del nuovo Now3D è l'implementazione delle finestre di scelta, utili all'aggiunta di varie tipologie di entità (es: oggetti, materiali, luci, ecc...).

Shader e Materiali
Le prime finestre di scelta implementate sono quelle per gli Shader e per i Materiali.
La logica di utilizzo di queste due finestre è molto simile. L'area superiore serve a scegliere tra le librerie di materiali (o shader) caricati in memoria, l'area inferiore serve invece a selezionare e caricare un file di tipo materiale (o shader) precedentemente salvato.
Mentre la finestra di scelta dei Materiali mostra tutti i materiali disponibili, la finestra di scelta degli shader mostra solamente gli shader compatibili con la tipologia di connessione richiesta. Quindi se provassimo ad aggiungere uno shader ad una connessione di input di tipo "colore", avremmo la scelta esclusiva tra shader che hanno tra le connessioni di output una connessione di tipo "colore".


Scelta MaterialiScelta Shader

giovedì 9 luglio 2009

File Materiali

Nuovo formato File
Eccomi di nuovo a parlare di XML. Sono passati quasi tre mesi dal mio ultimo post, ma non sono stato certamente rimasto con le mani in mano...anzi!
Volevo portare il formato xml anche nel salvataggio dei materiali, ma la difficoltà nell'applicare lo standard xml (ho sinceramente odiato l'xmlreader!), ha fatto allungare i tempi.
Però, come dico di solito in questi casi: "Ho vinto io!".
Ho dovuto rivedere leggermente il formato dei file introducendo nuovi namespace, una struttura "classes" per dichiarare i namespace utilizzati all'interno del file e una struttura standard "element" al cui interno incapsulare il vero e proprio xml da salvare.


Struttura Standard N3DXML


File Materiali
Così, una volta sciolti gli ultimi "nodi", ho potuto implementare il formato per il salvataggio dei materiali, compreso delle strutture utili a definire i BRDF e le Mappe.
E come per gli shader, grazie agli schemi associati ad ognuna di queste strutture ho potuto definire in automatico tutte le regole di caricamento del file.

martedì 26 maggio 2009

Altre News

Le Rifrazioni RayTracing
Un altro passo del porting di Now3D vb6 alla piattaforma dot.net, è il calcolo delle rifrazioni tramite l'algoritmo di RayTracing.
Esempio di rifrazioneAltro esempio di rifrazione

AA SuperHigh
Ora grazie alla maggiore velocità di rendering ho voluto inserire un nuovo livello di AntiAliasing: il SuperHigh. Grazie all'utilizzo di un numero maggiore di campioni rispetto alla modalità High, si possono ottenere dei risultati ancora più precisi, sempre però a scapito del tempo di rendering.
Interfaccia utile allo studio dell'Antialiasing
Esempio di rendering in modalità AA SuperHigh

Migliorie varie
Migliorato il calcolo del raytracing tramite l'algoritmo Octree per poligoni piccoli, che nella precedente versione rallentava sensibilmente. Nell'esempio qui a fianco un rendering di prova di una mesh contenente 1.6 milioni di poligoni generato in modalità AA High in soli 166 secondi!

Migliorata la resa del rendering scanline di un oggetto trasparente.

  • Implementata una struttura standard per la gestione di uno shader da applicare come mappa ambientale (per ora funzionante solo in modalità RayTracing).
  • Migliorato lo standard delle istanze riguardo le gerarchie.
  • Migliorato lo standard Shape di tipo Path.
  • domenica 24 maggio 2009

    Le Constraint

    Ho deciso di iniziare a implementare il codice utile a definire lo standard per le Constraint.
    Nella mia realizzazione, ho creato un struttura standard di classi che possono aggaccianciarsi a delle connessioni (per esempio quelle delle istanze: posizione, rotazione, dimensione, ecc..), con la possibilità di modificarne o bloccarne i valori seguendo le regole scritte nelle Constraint stesse.

    Prima applicazione: Il Blocker
    La prima Constraint che ho implementato è una funzionalità già presente nel vecchio Now3D versione VB6, e cioè la possibilità di bloccare i seguenti attributi: Posizione, Rotazione, Scala, e Dimensione.
    Proprietà di una Constraint di tipo Blocker


    Prossima applicazione: IK (Inverse Kinematics)
    Ho provato a cimentarmi nell'affascinante mondo delle animazioni implementando una Constraint speciale che funzionasse da catenza di nodi IK. IK o Inverse Kinematics è un metodo tramite il quale poter ad esempio spostare una catena di articolazioni come quella tra la spalla e il braccio e tra il braccio e l'avanbraccio, spostando semplicemente il polso dove si preferisce, sarà l'algoritmo stesso a generare le giuste rotazioni delle due articolazioni in modo da far raggiungere al polso la posizione scelta.
    La mia implementazione funziona solamente su uno dei tre assi di rotazione (lo Z) , ma spero prossimamente di farla funzionare su tutti e tre gli assi.
    Prima versione di una catena IK