Matteo 'Ndwr' Russo

...because there are no days without revolutions.
* Notizie* Lavori* Progetti   * Construct   * Tess   * Opengroups      * CCP      * SCP   * VES      * SS      * ES   * AS   * DMS      * TS   * TPL   * RVD   * CL      * libCGL      * libCSL      * libMixer      * libCTL      * libCIL      * libCVL   * RCGV   * RU1* Pensieri e Articoli* Macchine* Contatti

 

Radioattività ambientale
Zona: Venezia, Italia
Tipo: Radiazioni ionizzanti β/γ

 0.00%

Corrente: 0 μSv/h
Media annuale: 0.00 μSv/h
Accumulo annuale: 0.000 mSv

* Spazio   * Sistemi di lancio      * I razzi sonda      * Delta II      * Soyuz-U      * Soyuz      * Soyuz-FG      * Soyuz-2   * ACE      * Strumentazione         * MAG         * SWEPAM         * SIS         * EPAM      * Locazione   * SOHO      * Antenne HGA/LGA      * Strumentazione         * EIT            * CCD         * LASCO         * MDI   * STEREO      * Strumentazione   * AMS-01   * AMS-02      * Strumentazione      * Materia oscura   * EOS AM-1      * Strumentazione         * MODIS
 
http://ndwr.net --> Progetti --> Construct
 

Construct, 3D Graphics Engine

2002 ~ Oggi
Dipendenze: CL, CGL, CSL, CTL, CIL


Sezione da aggiornare...

Introduzione

Construct è un motore grafico tridimensionale modulare capace di sfruttare al meglio le capacità della macchina in cui viene eseguito, e dotato di numerose funzionalità capaci di sfruttare al massimo le risorse di una scheda video.

Il progetto è partito come programma dimostrativo, nell'anno 2003, capace di visualizzare semplici solidi con i quali l'utente poteva interagire grazie a semplici tasti. Questo programma dimostrativo utilizzava la conosciuta libreria GLUT, la quale forniva una semplice interfaccia per il controllo del contesto grafico e le periferiche di input. Il programma venne gradualmente esteso, iniziando dai controlli utili a muovere anche la posizione di visione, passando per tecniche quali alpha blending, multitexturing, luci, ombre, fisica, per arrivare a una completa gestione degli shader.

Da qui iniziò il tragitto atto a rendere completamente dinamici e configurabili tutti gli elementi a disposizione. Prima di ciò fu creato un sistema fisico capace di gestire le collisioni di una singola entità con la geometria presente nel contesto grafico; il sistema era molto semplice e si basava sul controllo di distanza tra i punti rappresentanti ogni piano e l'entità in questione. Il primo passo verso la dinamicità venne fatto da una funzione capace di suddividere i poligoni di un piano in macro poligoni, i quali servivano a determinare aree entro le quali poteva essere modificata la texture, in tempo reale; premendo un pulsante era possibile selezionare il macro poligono e premendone un altro era possibile cambiare la texture tra quelle disponibili, caricate in fase di avvio del programma.
Il sistema dei macro poligoni fu esteso tridimensionalmente, e iniziò a basarsi prima su quadrati, poi su cubi. Il problema, in questo caso, consisteva solo in una mancata praticità, poiché erano necessari 3 tasti; il primo serviva a selezionare il cubo, il secondo a selezionare la faccia dello stesso, e il terzo era utile a cambiare la texture; una grande quantità di cubi portava il sistema a essere poco pratico, quindi cercai di creare qualcosa capace di sfruttare il cursore del mouse per selezionare determinate facce. Prima di questo il sistema di macro poligoni (ora macro cubi) fu esteso e si trasformò in matrice. La matrice non è altro che una griglia tridimensionale, dove i singoli elementi, a forma di cubo, possono essere selezionati tramite le coordinate della matrice stessa.

A questo punto vennero introdotti i materiali, utili a specificare diverse caratteristiche per le faccie di ogni cubo, in modo che le stesse iniziassero ad apparire in modo differente e avessero differenti caratteristiche fisiche e visive.

Seguì lo sviluppo di un sistema utile a salvare e caricare la geometria creata, un avanzato motore fisico, un piccolo motore di scripting utile ad applicare configurazioni ad insiemi geometrici differenti, un sistema completo di luci e ombre, e tante altre caratteristiche uniche nel suo genere.

Durante lo sviluppo dei principali elementi rappresentanti il motore grafico, fu iniziata la creazione di una interfaccia tra il programma e il sistema operativo che consentisse di modificarne totalmente gli aspetti e avere pieno controllo. Iniziò, cosi, l'allontanamento da GLUT, per redirezionare lo sviluppo verso qualcosa di proprietario e altamente performante. Nacque cosi la libreria CGL (Construct Graphic Library), la quale viene tuttora utilizzata dalla corrente versione di Construct e consente di manovrare al meglio la creazione e manipolazione del contesto grafico, oltre ad estendere la portabilità a GNU/Linux, Windows e Mac OS X. Riguardo a Windows la piena compatibilità è garantita dalla vecchia versione Windows 95 fino a Windows 8.1. Il motore grafico ha la capacità di adattarsi totalmente al supporto software e hardware che gli viene fornito, passando da un rendering software privo di ogni effetto ad un totale utilizzo degli shader.

Con CGL, oltre alle funzioni primarie utili a gestire in modo completo un contesto grafico, furono implementate le funzioni di gestione per la modalita FSAA (Full Screen Anti Aliasing) e il totale controllo della sincronia verticale e filtro anisotropico.


I materiali

Un materiale viene applicato al piano che si viene a formare sulla faccia di un cubo, e può essere di tipo trasparente o solido, quest'ultimo tale grazie a una o più texture applicate sullo stesso.

I materiali sono abbastanza estesi; caratterizzati in:

Vuoto:
Un piano trasparente che non possiede texture e il sistema di collisioni non processa.

Immagine:
Un piano che possiede una texture applicata sullo stesso e viene processato dal sistema di collisioni.

Vuoto + Immagine:
Un piano che possiede una texture e non viene processato dal sistema di collisioni.

Solido:
Un piano trasparente che possiede una texture e viene processato dal sistema di collisioni.

Vetro:
Un piano semitrasparente che viene processato dal sistema di collisioni e consente di riflettere l'ambiente circostante grazie a mappe ambientali statiche.

I materiali risultano molto utili per massimizzare la resa delle zone geometriche create.


La matrice

Una matrice determina la geometria visualizzabile e modificabile all'interno del contesto grafico di construct. La struttura creata da una matrice consente di svolgere operazioni semplici ma produrre risultati complessi.

Ogni cubo è rappresentato nello spazio tridimensionale da 8 coordinate; ogni coordinata è rappresentata da 3 valori (x, y, z). Se abbiamo una matrice di 100*100*100 punti, dove ogni cubo possiede un lato di 10 punti, avremmo 10^3=1000 cubi; ogni cubo è rappresentato da 8 coordinate, quindi la nostra matrice sarà composta complessivamente da (11*11=121)*11=1331 coordinate poiché dobbiamo tenere conto che la maggior parte di queste sono condivise con altri cubi, a causa dello stesso ragionamento per cui un cubo ha 8 coordinate piuttosto che 4*6=24.

Se, a questo punto, ragioniamo in maniera più dinamica e iniziamo a considerare tutto il sistema un insieme di matrici tridimensionali, dove ogni matrice può essere scomposta in più matrici (padre -> figlio), ci accorgiamo riguardo a come il sistema possa diventare estremamente dinamico e complicato.

Questo metodo consente di avere una totale gestione della geometria, la quale può essere modificata con grande semplicità da parte dell'utente.


Luci e Ombre

Il sistema delle luci e delle ombre può essere statico e dinamico, in relazione alla configurazione scelta.
Le ombre sono pre-calcolate in relazione alle luci esistenti nella scena. Durante il calcolo vengono prese in considerazione tutte le fonti luminose, comprese eventuali intersezioni parziali o totali di esse. La determinazione delle ombre è realisticamente calcolata tenendo conto della distanza e degli ostacoli che intercorrono tra ogni punto geometrico della scena e la retta che porta lo stesso alla sorgente luminosa.

Le luci dinamiche possono essere utilizzate assieme o al posto di quelle statiche. Le stesse non consentono di ottenere lo stesso realismo rispetto al sistema statico poiché la precisione dei calcoli, in questo caso, è nettamente inferiore e non potrebbe essere altrimenti. Il sistema dinamico, tuttavia, rende ottimi risultati se utilizzato con oggetti geometrici in movimento.


Texture

Le texture sono gestite dinamicamente su ogni geometria. Questo significa che possono essere mosse, spostate o ridimensionate a proprio piacimento. L'applicazione è determinata dalla posizione di matrice che si sceglie in fase di assegnazione.

Le dimensioni di una texture devono sempre avere una larghezza e una altezza che soddisfa x=y=2^z, ovvero devono essere entrambe una potenza di due.
In caso la texture specificata non soddisfi i requisiti, la stessa viene automaticamente ridimensionata grazie ad un algoritmo proprietario ad alta efficenza.
Inoltre, è possibile specificare numerosi effetti da applicare assieme, in modo da rendere maggiormente realistico il risultato finale di ogni texture.

- Diffuse map
Una semplice immagine che specifica la texture principale. Ogni pixel, in questa mappa, è composto generalmente da 3 valori (16/24 bpp), i quali indicano il grado di rosso, verde e blu presenti. Talvolta è presente un quarto valore, il quale indica il grado di trasparenza assunto (32 bpp). In caso il quarto valore sia presente, il motore grafico lo gestisce automaticamente in modo da rendere trasparenti eventuali zone della texture.

- Shine map
Una immagine in scala di grigi. Indica le zone della texture che brillano di luce propria.
Le parti più chiare corrispondono a punti che emanano luce, mentre le parti più scure a punti che non emanano luce. Grazie alle sfumature è possibile regolare l'intensità di luce emanata dalla superficie e rappresentare il comportamento di diversi e differenti materiali in modo piuttosto preciso.
I punti di colore nero non vengono presi in considerazione dal filtro.

- Normal map
Una immagine che rappresenta le informazioni di luminosità per ogni pixel e consente di calcolare un effetto finale realistico per ogni materiale sul quale viene applicata.
Questa mappa viene utilizzata per determinare il livello di luce assunto da ogni pixel e quindi per separare, sulla texture in cui viene applicata, le zone che ricevono più o meno luce sulla base dell'angolazione assunta dalla fonte luminosa.

- Specular map
Una immagine che permette di aggiungere dei riflessi speculari, in relazione alle sorgenti di luce presenti. Questi riflessi consentono di dare alla superficie un aspetto lucente, grazie ad un metodo di fusione additivo. Le aree chiare soggette a questa modalità produrranno in fase finale dei drastici riflessi speculari, mentre le aree scure non ne avranno.
All'interno del contesto grafico, in mancanza di sorgenti luminose i riflessi vengono calculati in relazione alla luce ambientale, mentre in presenza di sorgenti luminose i riflessi vengono calcolati in relazione ad ogni sorgente luminosa.

- Environmental map
La capacità, per un piano, di riflettere l'ambiente circostante, grazie a mappe ambientali statiche precalcolate (cube mapping).

Formati supportati per il caricamento di immagini esterne:
- BMP
- TGA
- PCX
- PPM

Il sistema di caricamento texture consente, inoltre, di effettuare operazioni di rotazione, ridimensionamento o applicare determinati effetti all'immagine finale.
La procedura di sfocamento dell'immagine relativa all'angolo di visione (MIP) viene effettuata con algoritmi proprietari.
In caso si voglia occupare una minor quantità di memoria risulta possibile comprimere l'immagine potendo scegliere, oltre al fattore di compressione, un algoritmo veloce ma di qualità bassa (point sample), oppure lento ma di qualità maggiore (weighted average).


I modelli

Il sistema di modelli consente il caricamento esterno e la gestione di forme geometriche indipendenti, sulle quali possono essere opzionalmente applicati i calcoli fisici e di collisione.
L'interazione con l'ambiente circostante, quindi con la matrice geometrica principale oppure con altri modelli, avviene in modo totalmente dinamico nonostante ogni modello sia caricato e venga gestito in maniera autonoma rispetto ai vertici principali.

I modelli utilizzano lo stesso sistema e le stesse combinazioni di texture applicabili alla matrice.

Formati supportati per il caricamento di modelli esterni:
- OBJ
- 3DS
- MD2
- MD5

Il sistema di gestione dei modelli supporta insiemi statici e dinamici. Gli insiemi statici sono formati da poligoni che mantengono immobile la loro posizione durante la procedura di visualizzazione, mentre gli insiemi dinamici sono caratterizzati dal movimento dei poligoni in relazione a determinate regole.
Gli insiemi dinamici possono essere rappresentati secondo una successione di poligoni, ognuno in una differente posizione rispetto alla precedente, oppure secondo un movimento poligonale che viene determinato di volta in volta in base al cambio di posizione della struttura interna al modello o all'insieme. Nel primo caso abbiamo una successione di insiemi statici che ad alta velocità generano un movimento, mentre nel secondo caso esiste sempre una successione di insiemi statici, ma questa viene determinata di volta in volta, dinamicamente, essendo la struttura interna a muoversi, e i poligoni di conseguenza, non i poligoni stessi. In fase di creazione del modello risulta più semplice creare una animazione che rispecchia il secondo esempio, poiché in tal modo dovremmo soltanto cambiare la posizione dei punti che governano la struttura del soggetto, a differenza del primo caso dove è necessario muovere man mano tutti i poligoni della figura, per avere una animazione.


Fisica

Il motore fisico di Construct è stato studiato in modo da permettere una interazione tra tutti gli elementi presenti all'interno della scena. Esso non è limitato da regole realistiche, ma può essere configurato per soddisfare una vasta serie di esigenze.
Oltre al sistema principale, esistono estensioni utili a svolgere determinati e importanti scopi:

PDC
Un sistema di gestione per entità dinamiche, utilizzate per simulare comportamenti fisici tra diversi oggetti e l'ambiente geometrico in cui si trovano. Ogni oggetto può essere configurato secondo specifici parametri, può essere associato ad un modello geometrico e può interagire con altre entità sfruttanti la stessa estensione.

PDS
Un semplice sistema che si occupa di gestire il movimento di entità su una linea retta, seguendo un percorso che inizia in un dato punto e finisce alla prima collisione con una entità geometrica.

Il sistema di base prevede una gestione trasparente tra la struttura geometrica principale e i modelli presenti all'interno dell'ambiente.
I calcoli fisici vengono effettuati secondo una velocità globale variabile. In tal modo è possibile gestire animazioni con velocità costante non dipendenti dalla velocità di aggiornamento della visualizzazione (FPS).



Particelle

Il motore grafico possiede un sistema particellare dinamico che consente di poter generare una infinita quantità di effetti grafici differenti.
Il sistema stesso consente di creare e gestire un indeterminato numero di particelle, associate a determinate texture, le quali possono essere influenzate dalla gravità e rispettare il modello di collisioni presente nell'ambiente in cui vengono create.


Finestre

Un sistema di finestre consente di poter creare e gestire tutti gli elementi che compongono una finestra. Ogni finestra può essere configurata per visualizzare i contenuti ad essa associati, ed ha un comportamento dinamico in concomitanza con altre finestre, in termini di trasparenza e ordine di visualizzazione.


Decal

Il sistema di Decal consente di avere un totale controllo per quanto riguarda eventuali immagini sovrapposte a quelle presenti nella geometria al momento visibile. Questo comprende la possibilità di aggiungere scritte, sporcizia, fori di proiettile, e quante più informazioni visive possono essere utili in una determinata locazione.


Script

Construct è capace di interpretare un semplice linguaggio di scripting, tramite il quale è possibile configurare ogni minimo particolare del sistema. La semplicità del linguaggio consente a persone senza qualifiche in ambito programmativo di creare nuovi elementi e modificare l'intero ambiente in modo semplice e intuitivo.
Attraverso il linguaggio di scripting è possibile:
- Gestire finestre
- Gestire i parametri di rendering del motore grafico
- Gestire le impostazioni interne
- Configurare i moduli

Il linguaggio è composto da un insieme di funzioni imperative, if, else, while, for, set, echo, e un insieme di oltre 200 funzioni utili a modificare in tempo reale le variabili d'ambiente.


I moduli

Il motore grafico mette a disposizione numerose funzioni, le quali sono utilizzate da moduli esterni che consentono di definire tutti i metodi di funzionamento ed esecuzione.
Un modulo prende il comando di tutto ciò che il motore grafico mette a disposizione e consente di definire differenti e indipendenti utilizzi.
Il metodo di inserimento, per un modulo, avviene in fase di compilazione e non vede limitazioni per quanto riguarda il numero di differenti moduli applicabili, in modo da poter avere tutte le applicazioni che si necessitano senza dover cambiare programma o utilizzare soluzioni alternative; attraverso il sistema di moduli è possibile creare una sezione di visualizzazione tridimensionale e una dedicata agli aggiornamenti, in modo da utilizzare un unico eseguibile con le stesse librerie e opzioni, con tutte le conseguenze positive del caso.

In caso di più moduli è sufficiente definire quali utilizzare, in fase di avvio del sistema. In tal caso il motore grafico provvederà automaticamente a richiamare le funzioni dei moduli caricati qualora queste debbano essere richiamate. Normalmente le funzioni dei moduli vengono eseguite durante l'inizializzazione del sistema, la procedura di rendering 2d, la procedura di rendering 3d, ad ogni inizio e fine del ciclo principale, e cosi via, in relazione alla configurazione del modulo stesso e alle funzioni principali che esso deve svolgere verso l'utente finale.

Oltre alle funzioni richiamate in modo autonomo il modulo può richiamare a sua volta funzioni utili alle più svariate operazioni, dal caricamento di una immagine alla gestione dei parametri LOD, in modo da avere pieno accesso ai parametri operativi utili al modulo per gestire la visualizzazione a video, l'audio, le operazioni sulla fisica geometrica o di struttura, e molti altri aspetti di esecuzione.

L'utilizzo del sistema di moduli è semplice e altamente adattabile; il metodo di interfacciamento tra il modulo e il motore grafico comprende una grande varietà di funzioni, attraverso le quali il modulo potrà conoscere e modificare ogni aspetto di esecuzione in tempo reale.

Grazie ai moduli è possibile definire svariate modalità di utilizzo del motore grafico, in base ai propri scopi, per esempio al fine di creare una interfaccia 2d utile alla visualizzazione di elementi grafici, quali immagini o documenti, un videogioco 3d, oppure un programma di modellazione grafica 3d, in modo relativamente semplice e con il minimo utilizzo di risorse possibile.


Estensioni

Moduli finora creati o in fase di creazione.

VES
Un modulo che trasforma Construct in un client per gli ambienti virtuali gestiti da VES.

RCGV
Il pannello di controllo principale del sistema remoto RCGV (vedi immagine superiore).

DMS
Un client di chat che utilizza il sistema di messaggistica DMS per gestire liste di utenti ed effettuare lo scambio di messaggi testuali e file.