Progetto OpenGL
by Bruno Fanini

 Home | Intro | Requisiti Tecnici | Moduli C | Screenshot | Development | To-Do |[ DOWNLOAD ]| Tutorial | Links

GeoWorld current build : 2.0

INTRO

Il seguente programma OpenGL era stato sviluppato da me in più di 2 mesi (Aprile - Giugno 2004) come progetto di Grafica (CdL in Informatica). Successivamente ho esteso il progetto, usandolo come "laboratorio" di sperimentazioni OpenGL, ed è tuttora in fase di sviluppo.

Si tratta di un generatore casuale di terreni Real-Time con Triangolazione Brute-Force, limitato ad una porzione dello spazio 3D. La scena è quindi sempre diversa, grazie ad un  motore random (congruente moltiplicativo) combinato ad alcune funzioni trigonometriche e noise interpolation per rendere al meglio la naturalezza e la geologia del terreno.

Il programma prevede alcuni files di ingresso che inizializzano vari stati OpenGL prima dell'esecuzione dello stesso e alcune variabili globali. Una volta lanciato GeoWorld, la window corrente grazie ad alcune funzioni GLUT, catturerà eventi da tastiera e un click destro del mouse su un punto qualunque della finestra mostrerà un menu con diverse opzioni nidificate.

Con la tastiera è possibile generare alterazioni ("perturbations") random al terreno corrente, per poi effettuare solitamente  un "rebuild" dell'intero terreno aggiornando le normali, la colorazione dei vertici, Shadow Casting, Deposition Maps, ecc... sia singolarmente sia in maniera completa (tasto 'F1').

 

SCREENSHOTS GEOWORLD

NOTA : Tutte le immagini qui presenti non sono renderizzate ma sono state prese in TEMPO REALE da GeoWorld mentre è in esecuzione (con la camera in movimento) e non hanno subito alcuna miglioria o ritocchi di alcun tipo.

 
LAST SCREENSHOTS!!
Immagine che esprime molto del potenziale di GeoWorld-Gold (400x400 : 320.000 triangles). Qui è stato applicato un filtro "Canyon" in fase sperimentale. GeoWorld 2.0: Un terreno modificato nella nuova modalità di Editing. Si nota lo Sky-Environment. Un altro piccolo esempio di come può essere utilizzato il tool di Editing diretto in gw2.0. Immagine che mostra in pieno vari effetti di fog e sky environment. Applicato nuovo filtro sperimentale di adattamento poligoni.
 
Test di Auto-Adattamento Textures su un ambiente nevoso. Testing del Magnetic Poly-Adaption: i vertici dei poligoni si "spostano" per cercare di aumentare il dettaglio... Vari mix di parametri con aggiunta di alcune Deposition Map  
ALTRI SCREENSHOTS (versioni 1.8 / 1.85 / 1.9)
Esempio di mix di vari parametri di ambiente con vari script tramite caricamenti sequenziali. Applicata l'ambientazione "Sunset" alla già presente "Snowy". Ambientazione Grass con Deposition Map dopo aver applicato al terreno un filtro generale EdRidged e poi un Perlin Noise... Ambientazione Mars con varie Deposition Map, notare le rocce della montagna centrale. Environment Grass: notare la trasparenza dell'acqua con texture.
Environment "MoonLight". Si nota un nuovo filtro sperimentale di "Auto-Adattamento Texture" del terreno (ver 1.9). Dovrebbe aumentare il realismo delle textures. Un terreno generato con Perlin Noise e poi ripetute applicazioni del Peak-Erosion filter. Immagine molto bella, vari Peak-Erosion, Perlin e altro... Ancora Mars, con nuova tecnica di adattamento delle textures alla luce (GeoWorld 1.9)
     
Applicato Filtro "EdRidged" di mia invenzione e Filtro ripetuto di "Water Evolution"      
XCMODEL NURBS EXPORT (NEW)
   

Una tra le prime immagini generate da XCrayt (Sistema XCmodel) che mostra il nuovo modulo di GeoWorld per esportare il terreno in superficie NURBS, in formato *.db (tasto F9). Per renderizzare questa scena qui sopra la superficie generata da GeoWorld è terrain.db :

  • Degree(u,v) = (3,3)

  • Num.CP(u,v) = (40,40)

  • TerrainScale = 0.7

  • LOD = 5

Un altro terreno generato da GeoWorld visualizzato con il tool XCsurf di XCmodel.

  • Degree(u,v) = (3,3)

  • Num.CP(u,v) = (50,50)

  • TerrainScale = 0.7

  • LOD = 4

   
Immagine che mostra i riflessi del ghiaccio dopo aver applicato il Sunset Environment. L'interpolazione delle normali al terreno e vari effetti speculari applicati al materiale rendono alcune parti di superficie simili a NURBS, nonostante il basso numero di poligoni. Textures disattivate.
Vista aerea del terreno in tutto il suo "splendore": notare l'azione erosiva dell'acqua (zone color sabbia) e le Deposition Maps.

Perlin Noise + Filtri multipli di erosione acqua + Peak Erosion. Terrain Size = 400x400 (GeoWorld v1.8).

GeoWorld 2.0: La generazione di un terreno con  Perlin Noise + vari filtri. Abilitato il terrain box (in verde).
Lo stesso terreno sopra. A destra la classica Height-Map in scala di grigi, a sinistra la Critical-Map che rappresenta una scala di importanza per ogni vertice (ROSSO = max, VERDE = minima).

REQUISITI TECNICI

Il progetto è stato sviluppato inizialmente in ambiente Windows e compilato con Dev C++ ( Project File : "GeoWorld.dev" ) da cui l'eseguibile "geoworld.exe". Grazie alla adattabilità delle GLUT con vari OS e il sistema windowing ospite, il progetto è stato poi compilato sotto il sistema Linux da cui l'eseguibile "geoworld". In entrambi i casi gli eseguibili devono essere lanciati nella stessa cartella in cui sono presenti i files "gw_*.txt", altrimenti il programma potrebbe non funzionare correttamente.

 

LINUX

Scaricare tutti i files contenuti nel .tar.gz nella stessa cartella e lanciare sotto X-Window "geoworld" da console.

 

WINDOWS XP

Scaricare tutti i files contenuti nel .zip nella stessa cartella e lanciare "geoworld.exe".

 

MODULI C

GeoWorld allo stato attuale è composto da 19 moduli in linguaggio C (sono soggetti a continue modifiche e ottimizzazioni) per un totale di 6000 righe di codice, tutte rigorosamente "farina del mio sacco" (tranne "geotex.c" per gestire i files *.tga). Qui segue la lista :
  • geodefs.c
  • georng.c
  • geoin.c
  • geoexport.c
  • geoveg.c
  • geomenu.c
  • geovect.c
  • geocam.c
  • geoperipherals.c
  • geoloop.c
  • geointerpol.c
  • geotfil.c
  • geoshadw.c
  • geoshow.c
  • geotex.c
  • geodistrib.c
  • geophysics.c
  • geolib.c
  • main.c
  • Definizioni di strutture e variabili globali
  • Motore Random congruente moltiplicativo e varie funzioni per la casualità
  • Gestione input da files e Parsing
  • Esportazione terreno in NURBS per XCmodel, *.obj, height-map e altro
  • Gestione Vegetazione
  • Gestione dei menu GLUT
  • Varie operazioni vettoriali
  • Gestione camera
  • Gestione input da mouse & tastiera
  • Modulo per update & redraw della window
  • Funzioni di Interpolazione
  • Filtri terreno e Deposition Maps
  • Shadow Casting (ombre)
  • Funzioni di Show (visualizzazione normali, bounding box, ecc...)
  • Funzioni per caricamento textures *.tga  (By Nate Miller)
  • Gestione calcolo distribuito dei Terrain Layers
  • Modulo per la simulazione leggi della Fisica
  • Libreria principale: gestione acqua, ombre, terreno, sincronizzazione layers e molto altro.
  • Varie inizializzazioni di GeoWorld e delle GLUT
 

DEVELOPMENT - Last Changes

In questo periodo GeoWorld ha subito diverse modifiche, nelle ultime versioni lo sviluppo della gestione vegetazione è rimasto fermo per sviluppare altri meccanismi più interessanti legati al terreno e altro. Ora è disponibile in 3 versioni:

Riorganizzo il tutto volta per volta. Questa è la storia di sviluppo in ordine crescente :

VER 0.5 : Prima versione di GeoWorld, nata come progetto del Corso di Grafica (CDL Informatica)
VER 1.0 : Griglia del terreno aumentata a 200u x 200v. BackFace Culling. Aggiunta Perturbation Magnitudo: un fattore moltiplicativo per gestire la "forza" di una perturbation. Possibilità di aggiungere <n> Height Layers per la colorazione dei vertici. Nuove opzioni al MENU principale (RMB). ImportScriptMenu (LMB) totalmente personalizzato dall'utente ("importree.txt") per l'esecuzione di script definiti dall'utente (lista di comandi sequenziali in un file testuale parsato da GeoWorld). Personalizzazione di diffuse, ambient e specular di terreno, acqua e vegetazione. Aggiunta perturbation di test "NormalHill" (tasto 'y'): simile a HILL
ma l'alterazione anzichè lungo l'asse Z, avviene lungo la normale del vertice (u,v) medio della regione di perturbation. Personalizzazione delle aree di crescita vegetazione. Aggiunta al menu "Show" l'opzione "show shadow-rays" che mostra i raggi delle ombre.
VER 1.2 : Calcolo FPS, Ottimizzazione poligoni (ora TRIANGLE_STRIP), Shadow Casting ora preciso e ottimizzato, Perturbation ottimizzate (non più squadrate ai bordi), Deposition Maps, Funzioni di Noise Interpolation (l'utente può selezionare una WaveLength e interpolare il terreno) e Perlin Noise.
VER 1.3 : Shadow Casting Buffer con Antialiasing (inoltre è possibile modificare il livello di Blur durante l'esecuzione), nuovi comandi di generation script, Height Filters (tra cui Ridged e altri), Filtri globali al terreno in fase di sviluppo (per il momento è presente il filtro BEACH), varie e piccole ottimizzazioni.
VER 1.5 :
  • Triangolazione terreno a zig-zag per evitare un effetto di scalettatura (Smooth Shading).
  • Aggiunta PassiveMouseMotion (la camera è controllata direttamente dal mouse), l'utente può affidarsi al percorso prestabilito o controllare la rotazione della camera con il mouse e direzione con tasti (Forward, Back & Strafe).
  • Aggiunto parametro sperimentale che decrementa i poligoni (LOD) a seconda della velocità di rotazione camera.
  • Accelerazione camera Time-Based.
  • Terrain Filters : Shore Erosion (il vecchio BEACH), Underwater Erosion, Underwater Deposition, Peak Erosion.
  • Collision Detection della camera con il terreno a una fissata altezza (in futuro verrà implementata la forza di gravità).
  • Nuovi comandi di Generation Script.
  • Shadow Casting : anche la vegetazione ora genera ombre.
  • Visualizzazione Height Map (tasto F11).
VER 1.6 :
  • Varie ottimizzazioni.
  • Ottimizzata e debuggata l'accelerazione della camera Time-Based.
  • Aggiunto Piano di orizzonte (Horizon Plane)
  • Aggiunti vari script e ottimizzati quelli presenti (tra cui "grass"). Nuovi environments, tra cui "unreal world" e "mars".
  • Aggiornate varie entry del menu principale.
VER 1.7 :
  • Lo shadow casting ora prende in considerazione anche la distanza.
  • Aggiunti altri script al menu, nuovi filtri.
VER 1.8 :
  • Textures (Acqua e Terreno)
  • Ottimizzata Accuratezza del Terreno: ora si adatta al tempo di inattività dell'utente. Questo meccanismo unito al LOD Movement-Based aumenta notevolmente le prestazioni anche su piattaforme di bassa scheda grafica.
  • Aggiunto Modulo per la sincronizzazione distribuita dei Layers: l'utente ora può muoversi liberamente durante i tempi di calcolo grazie all'interleaving. Necessita di ulteriori test.
  • Nuovi command script.
VER 1.8.5 :
  • Rivoluzionato Input e Parsing dei files: ora un file singolo può contenere diversi Script, in questo modo si evita il gran numero di files che erano presenti prima accorpando gli script in (pochi) moduli semantici (files). Es: "gw_filters.txt" contiene tutti gli script di terrain filters.
  • Aggiunto intero modulo per la gestione della Fisica. Simulazione forza di gravità e scivolamento su superficie: si può intervenire oltre che sull'accelerazione G, sull'angolo di aderenza alla superficie e sul fattore di scivolamento.
  • Textures allineate dinamicamete a seconda della luce per aumentare il realismo.
  • Nuova Height-Map (F11): Si possono visualizzare ombre e acqua. Animazione "Warp" tra visione 3D e visione Height Map. Fissati alcuni bugs.
  • Nuovo Layer (Critical-Layer) visibile dalla Height Map, che contiene una scala di importanza per ogni vertice (ROSSO: Massima importanza, VERDE: Minima). Utile per usi futuri.
VER 1.9 :
  • Aggiunto il famigerato modulo per esportare i terreni in formato .db di XCmodel (tasto F9), questo comporta l'uso di un algoritmo per convertire la superficie da poligonale in NURBS. Per il momento questo è non-adattivo e fa uso del Critical-Layer, in futuro verrà ottimizzato a favore della qualità, diminuendo i Control-Points. In ogni caso è sempre comunque una (buona) approssimazione del terreno poligonale. Qui si può scaricare una superficie di esempio generata da GeoWorld. Necessita di ulteriori Test.
  • Adattamento Textures al terreno, tasto F6 (tasto F7 per Reset degli (u,v)).
  • Ottimizzata gestione del moto da mouse, ora presente un parametro per gestire il raggio della "dead-zone" del moto relativo del puntatore. Aggiunto anche un Motion-Lock (tasto 'l') per bloccare gli input del mouse (può tornare utile per bloccare la scena in una determinata posizione).
  • Fissati alcuni bugs.
VER 2.0 :
  • Modellazione diretta: L'utente in modalita' EDIT (tasto 'INS') ora puo' modificare o applicare perturbation ad ogni singolo vertice o area (u,v) del terreno.
  • Tumble Tool (tasto 'x'): Modalita' camera nella quale il target rimane fisso e muovendo il mouse si gira intorno, molto comodo e utile soprattutto in EDIT mode.
  • Fissati bugs di segmentation fault di alcuni terrain filters.
  • Distribuzione Noises ora corretta.
  • XCmodel Export: Aggiunta opzione usare algoritmo adattivo (in beta-testing). Nella Critical-Map e' possibile visualizzare la divisione adattiva con il tasto '0'. Ottimizzata esportazione non-adattiva del terreno.
  • Sky-Environment con nuvole in movimento.
  • Double-Buffer Swap Locking (tasto 'L') : per disattivare il redraw della finestra, se necessario (computer lenti).
  • Altri ritocchi minori.

BUGS

Notificate alla mia mail bugs e comportamenti strani del programma ovviamente...

TO-DO

Ovvero cosa si dovrebbe sviluppare di GeoWorld:

- Necessita ASSOLUTAMENTE di una interfaccia grafica multi-finestra, menu a tendina, bottoni e via dicendo, senza perdere portabilità sui diversi sistemi e possibilmente usando sempre linguaggio C.
- Esportazione/Importazione del terreno in formati *.obj e Height-Map (Es. formato *.tga).

 

DOWNLOAD

(bin) GeoWorld v2.0  (WindowsXP OS)
(bin) GeoWorld v2.0  (Linux OS)
   

ADD-ONs

TGA Textures (complete package) : Contiene textures *.tga da estrarre nella stessa cartella di GeoWorld. Senza queste GeoWorld funziona comunque, ma senza textures...

LINKS