...

Rappresentazione di modelli urbani CityGML su un globo virtuale

by user

on
Category: Documents
26

views

Report

Comments

Transcript

Rappresentazione di modelli urbani CityGML su un globo virtuale
Corso di Laurea in INFORMATICA
Tesi di Laurea
Rappresentazione di modelli urbani
CityGML su un globo virtuale
Relatore: Prof. Nicola Conci
Correlatori: Raffaele De Amicis, Daniele Magliocchetti
Laureando: Alessandro Florio – 140245
Trento, 26 settembre 2012
Prefazione
CityGML è un encoding basato sul linguaggio di markup XML che
rappresenta modelli urbani tridimensionali; fornisce un modello della città
standard ed un meccanismo per descrivere oggetti tridimensionali
considerando le loro proprietà geometriche, topologiche, semantiche ed
estetiche.
A differenza di altri formati, CityGML è basato su un modello
generalizzato molto ricco che permette di sfruttare i modelli virtuali di
città per un enorme numero di applicazioni. Inoltre si distingue da una
semplice descrizione di oggetti tridimensionali per le relazioni tra i vari
oggetti, raggruppati gerarchicamente, e le proprietà spaziali, in quanto
ogni elemento è georeferenziato.
I visualizzatori ad oggi disponibili tuttavia non sfruttano queste
potenzialità senza contestualizzarle in un ambiente, ma si limitano a
rappresentarne le geometrie. Lo scopo di questa tesi è quello di
contestualizzare i modelli urbani tridimensionali su un globo virtuale
interattivo, rispettando la loro posizione geografica e l'andamento
tridimensionale del terreno, arricchito con mappe fotorealistiche per
rendere la visualizzazione il più simile possibile alla realtà.
Tutto ciò permetterà in futuro lo sviluppo di un elevato numero di
applicazioni che richiedano di tener conto dell'ambiente in cui una città è
situata, di come una determinata zona appare, oppure della distribuzione,
forma e proprietà degli edifici.
Indice
1 Introduzione ............................................................................. 1
1.1 Contesto ............................................................................. 1
1.2 Problema ............................................................................. 1
1.3 Soluzione ............................................................................ 2
1.4 Struttura della tesi ................................................................ 2
2 Stato dell'arte ........................................................................... 3
2.1 CityGML .............................................................................. 3
2.1.1 GML ...............................................................................3
2.1.2 Struttura del CityGML ........................................................4
2.1.3 Versione utilizzata ............................................................7
2.2 NASA World Wind ................................................................. 8
2.2.1 SDK ...............................................................................8
2.2.2 GDAL ............................................................................10
2.2.3 Versioni utilizzate ............................................................10
3 Implementazione .................................................................... 11
3.1 Lettura .............................................................................. 11
3.2 Parsing .............................................................................. 13
3.2.1 Procedimento .................................................................14
3.2.2 Extra feature ..................................................................18
3.3 Ottimizzazione ................................................................... 18
3.3.1 Procedimento .................................................................19
3.3.2 Calcolo dell'inviluppo convesso ..........................................21
3.4 Rendering .......................................................................... 22
3.5 Simulatore di dinamica dei fluidi ........................................... 27
3.5.1 Clipping .........................................................................29
4 Problemi e limiti ..................................................................... 31
4.1 Coordinate Reference System ............................................... 31
4.2 Document Object Model ....................................................... 31
4.3 CityGML ............................................................................ 32
4.4 World Wind ........................................................................ 33
5 Sviluppi futuri ......................................................................... 35
5.1 Miglioramenti possibili ......................................................... 35
5.1.1 Memoria necessaria ........................................................35
5.1.2 Simulazione della dispersione di fluidi ................................35
5.1.3 Aggregazione degli edifici .................................................36
5.2 Utilizzi del programma ......................................................... 36
6 Conclusioni ............................................................................. 37
7 Ringraziamenti ....................................................................... 39
8 Appendici ................................................................................ 41
8.1 Acronimi ............................................................................ 41
8.2 Bibliografia ........................................................................ 42
8.3 Immagini ........................................................................... 42
1 Introduzione
1.1 Contesto
L'ultima generazione di UIM (Urban Information Model) tridimensionali, creata
da accurate informazioni geo-spaziali a livello urbano, può essere usata per
creare servizi basati su informazioni geometriche, semantiche, morfologiche e
strutturali. Questi servizi possono essere usati per prendere decisioni migliori
su problemi riguardanti la pianificazione urbana, la gestione di una città, la
protezione ambientale ed il consumo energetico grazie alla consapevolezza
della morfologia della città. Ad esempio, conoscendo la collocazione di una città
(latitudine, presenza di rilievi) e disposizione, forma, altezze dei suoi edifici, è
possibile studiare un posizionamento ottimale dei pannelli solari sui tetti degli
edifici, in modo da aumentarne la produzione di energia pulita.
Per poter sviluppare tali servizi è necessario avere un modello tridimensionale
della città contestualizzato in un globo anch'esso tridimensionale
sufficientemente flessibile da permettere l'integrazione con diverse
applicazioni.
1.2 Problema
La miglior rappresentazione di aree urbane per gli scopi citati nel paragrafo
precedente è data dal CityGML, un modello general-purpose e quindi ricco di
dettagli che, oltre alla descrizione – anche estetica – di edifici, può contenere
informazioni su strade, elementi architettonici e arredo urbano in generale.
Nonostante la sua ricchezza di informazioni, il modello CityGML non è ancora
sfruttabile in tutte le sue potenzialità in quanto i visualizzatori presenti ad ora
permettono soltanto di renderizzare gli oggetti come una qualunque scena
tridimensionale, senza però contestualizzare la città nel suo reale ambiente e
senza possibilità di essere ampliati per utilizzare il modello tridimensionale per
altri scopi.
1
1 Introduzione
1.3 Soluzione
1.3 Soluzione
In questa tesi verrà mostrata l'implementazione di un tool che permetterà
la visualizzazione di modelli CityGML all'interno di World Wind (WW), globo
virtuale
open-source
realizzato
dalla
NASA.
Il
linguaggio
di
programmazione utilizzato è Java, per poter sfruttare appieno le
numerosissime funzioni e strutture dati fornite dal WWJ SDK.
Il tool in questione è strutturato nelle seguenti fasi:
1. Lettura: il file contenente il modello CityGML viene letto ed i suoi nodi
vengono salvati in liste a seconda dell'elemento analizzato;
2. Parsing: i nodi salvati vengono esplorati, analizzati e le classi XML
vengono convertite in classi renderizzabili da WW;
3. Ottimizzazione: gli edifici vengono raggruppati in isolati e gli isolati in
quartieri: questo permetterà una clusterizzazione su due livelli di
gruppi di edifici quando questi sono in lontananza e quindi poco
distinguibili, andando a diminuire il numero di oggetti da
rappresentare per risparmiare calcoli in fase di rendering ed
aumentare le prestazioni;
4. Rendering: una volta letto, interpretato e convertito il modello urbano,
questo verrà renderizzato sul globo tridimensionale interattivo di WW,
con tanto di statistiche riguardanti le performance. Gli edifici
aumenteranno di livello di dettaglio col diminuire della loro distanza
dall'occhio della scena, rispettando i vari LOD del CityGML.
1.4 Struttura della tesi
Dopo un'introduzione alle tecnologie utilizzate si provvederà ad una
dettagliata descrizione delle quattro fasi sopracitate fornendo numerose
immagini a scopo illustrativo.
Sarà fornito dello pseudo-codice per spiegare i passi fondamentali e
saranno spiegate le principali tecniche di computer grafica utilizzate, come
ad esempio le BVH applicate al frustum culling.
Infine verranno mostrati alcuni possibili ulteriori sviluppi di questo tool ed
applicazioni come quelle menzionate all'inizio di questo capitolo per le
quali esso si rileverà di grande utilità.
2
2 Stato dell'arte
Per poter comprendere il funzionamento del tool (d'ora in poi chiamato
citygml4ww) presentato nel capitolo precedente, è necessaria un'introduzione
alle tecnologie utilizzate. In particolare verrà mostrato e spiegato l'encoding del
CityGML, per poi passare all'illustrazione del Nasa World Wind SDK e delle
librerie necessarie allo sviluppo di citygml4ww.
2.1 CityGML
2.1.1 GML
CityGML è un Application Schema per il GML (Geography Markup Language),
grammatica XML istituita e riconosciuta come standard internazionale dall'OGC
(Open Geospatial Consortium) per esprimere elementi geografici.
A differenza di altri GIS (Geographic Information System), GML è
object-oriented, facilitando così la modellazione semantica: sono presenti
gerarchie di aggregazione e di specializzazione (tassonomie, ovvero strutture
ad albero) nonché identificativi associati a ciascun oggetto che facilitano
associazioni o relazioni tra loro.
GML fornisce geometrie (ad esempio gml:Polygon) e coordinate (ad esempio
gml:pos) che insieme permettono di rappresentare oggetti geo-referenziati. Un
poligono (Polygon) può così essere rappresentato tramite un circuito
(LinearRing) di punti descritti da coordinate (pos) in un determinato sistema di
riferimento (srsName) nel seguente modo:
<gml:Polygon gml:id="poly1" srsName="urn:ogc:def:crs,crs:EPSG:4326">
<gml:exterior>
<gml:LinearRing>
<gml:pos> 46.0510 11.1313 211.874 </gml:pos>
<gml:pos> 46.0512 11.1309 212.637 </gml:pos>
............................................
<gml:pos> 46.0510 11.1313 211.874 </gml:pos>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
3
2 Stato dell'arte
2.1 CityGML
2.1.2 Struttura del CityGML
CityGML estende GML aggiungendo diverse aree tematiche, tra cui edifici,
strade, ponti, arredo urbano, vegetazione ecc.
Un file CityGML è caratterizzato da un modello urbano che, oltre ad alcuni
tag descrittivi, comprende all'interno del tag cityObjectMember uno o più
oggetti tra quelli sopracitati (descritti in seguito); la struttura base è la
seguente:
<?xmlversion="1.0" encoding="UTF-8"?>
<CityModel xmlns="http://www.citygml.org/citygml/1/0/0">
<gml:name>Cologne</gml:name>
<gml:boundedBy> <!-- bounding box della città -->
<gml:Envelope srsName="urn:ogc:def:crs,crs:EPSG:6.12:31466">
<gml:pos> 5659800.0 2561800.0 15.9 </gml:pos>
<gml:pos> 5662200.0 2564200.0 95.7 </gml:pos>
</gml:Envelope>
</gml:boundedBy>
<cityObjectMember> … </cityObjectMember>
........................................
<cityObjectMember> … </cityObjectMember>
</CityModel >
In questa tesi così come nell'implementazione di citygml4ww verranno
trattati soltanto gli edifici, mentre gli altri oggetti verranno tralasciati e
considerati in futuri sviluppi.
Gli edifici CityGML possono essere descritti in cinque diversi LOD (Level Of
Detail):
0) pianta dell'edificio
1) rappresentazione dell'edificio come un blocco
2) superfici tematiche (tetto, muro, pavimento), con texture
3) aggiunta di aperture (finestre, porte) ed i installazioni esterne
(balconi, …)
4) aggiunta di stanze e interni dell'edificio (arredamento, scale, …)
4
2 Stato dell'arte
2.1 CityGML
Nel seguente diagramma si possono notare le relazioni tra le varie
componenti dell'edificio e soprattutto il livello di dettaglio a partire dal
quale queste sono introdotte:
5
2 Stato dell'arte
2.1 CityGML
Un semplice edificio in LOD3, ad esempio, è descritto come segue:
<bldg:Building gml:id="building001">
<gml:boundedBy> <!-- bounding box dell'edificio -->
<gml:Envelope srsName="urn:ogc:def:crs,crs:EPSG:6.12:3068">
<gml:lowerCorner>3450014 5429996 0.0</gml:lowerCorner>
<gml:upperCorner>3450021 5430003 4.7</gml:upperCorner>
</gml:Envelope>
</gml:boundedBy>
<bldg:boundedBy>
<bldg:WallSurface gml:id="parete1">
<bldg:lod3MultiSurface>
<gml:MultiSurface>
.............................
<!-- lista di gml:Polygon -->
.............................
</gml:MultiSurface>
</bldg:lod3MultiSurface>
<bldg:opening>
<bldg:Door gml:id="wall1door">
<bldg:lod3MultiSurface>
.......................
</bldg:lod3MultiSurface>
</bldg:Door>
<bldg:Window gml:id="wall1window">
<bldg:lod3MultiSurface>
.......................
</bldg:lod3MultiSurface>
</bldg:Window>
<bldg:Window gml:id="w2"> … </bldg:Window>
<bldg:Window gml:id="w3"> … </bldg:Window>
</bldg:opening>
</bldg:WallSurface>
<bldg:WallSurface gml:id="parete2"> … </bldg:WallSurface>
<bldg:WallSurface gml:id="parete3"> … </bldg:WallSurface>
<bldg:WallSurface gml:id="parete4"> … </bldg:WallSurface>
6
2 Stato dell'arte
2.1 CityGML
<bldg:RoofSurface gml:id="tetto1"> … </bldg:RoofSurface>
<bldg:RoofSurface gml:id="tetto2"> … </bldg:RoofSurface>
<bldg:GroundSurface gml:id="pavim"> … </bldg:GroundSurface>
</bldg:boundedBy>
</bldg:Building>
Come si può notare, un edificio è definito come un insieme di pareti,
ognuna delle quali è descritta da una serie di poligoni e può contenere (a
partire dal LOD3) delle aperture (porte, finestre) anch'esse descritte da
una serie di poligoni. Dell'edificio fanno parte anche le componenti del
tetto e del pavimento. La descrizione delle superfici di tetto e pavimento è
analoga a quella delle pareti.
Un edificio descritto come sopra può apparire simile a quello nella
seguente immagine, dove viene anche mostrata la corrispondenza tra tag
e parti reali che costituiscono l'edificio:
2.1.3 Versione utilizzata
La versione di CityGML utilizzata è la 1.0.0 basata su GML3, in quanto la
2.0.0, rilasciata subito prima dell'inizio dello sviluppo di citygml4ww,
introduceva solo nuovi elementi che non sarebbero stati letti da
citygml4ww, come tunnel, ferrovie, superfici acquatiche eccetera, senza
cambiare la grammatica della versione 1.0.
7
2 Stato dell'arte
2.2 NASA World Wind
2.2 NASA World Wind
World Wind è un globo virtuale tridimensionale interattivo sviluppato dalla
Nasa che permette di esplorare la terra dallo spazio e di avvicinarsi al
terreno, ruotando ed inclinando il pianeta. La sua licenza open-source,
l'architettura API-centrica e l'utilizzo di Java come linguaggio di
programmazione fanno sì che World Wind sia uno strumento facilmente
ampliabile e multipiattaforma semplice da utilizzare.
2.2.1 SDK
Per lo sviluppo di applicazioni è disponibile l'SDK WWJ che utilizza la
libreria JOGL per implementare le chiamate di funzione a OpenGL, che
permettono di disegnare complesse scene tridimensionali a partire da
semplici primitive.
Siccome WWJ è un SDK non esiste una singola applicazione, anzi la API
propone centinaia di esempi che mostrano come sfruttare tutte le risorse
per qualsiasi scopo. Senza questi esempi verrebbe a meno la facilità d'uso
di questo potente strumento, dato che le sue più di 1000 classi si
estendono per oltre 615.000 righe di codice.
Utilizzando le librerie e le classi di WW si può ottenere il classico
programma base “Hello World” (fornito tra i file di esempio) con
pochissime istruzioni:
/* Copyright (C) 2001 United States Government as represented by the Administrator
of the National Aeronautics and Space Administration. All Rights Reserved. */
package gov.nasa.worldwindx.examples;
import gov.nasa.worldwind.*;
import gov.nasa.worldwind.awt.WorldWindowGLCanvas;
public class HelloWorldWind
{
private static class World extends javax.swing.JFrame
{
public World()
{
// il globo virtuale viene creato con proprietà standard
WorldWindowGLCanvas wwd = new WorldWindowGLCanvas();
8
2 Stato dell'arte
2.2 NASA World Wind
wwd.setPreferredSize(new java.awt.Dimension(1000, 800));
// viene impostato il livello del globo
wwd.setModel(new BasicModel());
// il globo viene inserito nel JFrame
this.getContentPane().add(wwd, java.awt.BorderLayout.CENTER);
this.pack();
}
}
public static void main(String[] args) {
// invokeLater esegue il codice in un thread AWT (convenzione di Swing)
java.awt.EventQueue.invokeLater(new Runnable() {
// viene creato un globo e reso visibile
public void run() { new Wordl().setVisible(true); }
} );
}
}
9
2 Stato dell'arte
2.2 NASA World Wind
2.2.2 GDAL
Per lo sviluppo di citygml4ww è stata utilizzata la libreria GDAL all'interno
di WWJ, nativamente inclusa nell'SDK. GDAL è una libreria rilasciata dalla
Open Source Geospatial Foundation per le trasformazioni di formati di dati
geo-spaziali. GDAL verrà utilizzata per convertire le coordinate dal sistema
di riferimento del file CityGML.
2.2.3 Versioni utilizzate
La versione di WWJ utilizzata è la 1.3.0, la più recente disponibile al
momento di inizio dello sviluppo, che include GDAL 1.7.2.
Per lo sviluppo di citygml4ww, WWJ è stato importato nel Java EE 6 IDE
(versione 1.4.2) di Eclipse (release Indigo, piattaforma 3.7), mostrato
nell'immagine seguente:
10
3 Implementazione
Nel capitolo 1.3 sono state accennate le quattro fasi in cui citygml4ww è
strutturato: lettura, parsing, ottimizzazione e rendering. In questo capitolo
ogni fase verrà spiegata nel dettaglio anche con l'ausilio di pseudo-codice e
screenshot e verranno illustrate le principali tecniche di computer grafica
utilizzate.
3.1 Lettura
La fase di lettura consiste, dato un file CityGML, nell'isolarne gli edifici che
saranno poi processati durante il parsing. Per gli scopi di citygml4ww verranno
infatti trattati soltanto gli edifici (fino al LOD3, senza quindi considerare gli
interni), mentre tutti gli altri elementi verranno ignorati; questa scelta
permette di non sprecare inutilmente CPU e memoria, aumentando così le
prestazioni del programma.
I file CityGML, basati sul linguaggio XML, sono documenti ben formati
rappresentabili tramite una struttura ad albero. In questa prima fase il dataset
in input viene convertito in albero DOM (Document Object Model, modello ad
oggetti del documento), lo standard ufficiale del W3C per la rappresentazione
di documenti strutturati. I nodi rappresentanti gli edifici, estratti dall'albero
tramite il tag ''bldg:Building'', vengono quindi salvati in una lista che verrà
poi letta nella fase di parsing.
Salvare gli edifici in una lista non è però sufficiente se si vuole rappresentarli
con le texture o i colori definiti nel CityGML: l'aspetto infatti non è salvato nel
nodo dell'edificio, ma in nodi appositi sia per le texture che per i colori. Ciò è
dovuto al fatto che una texture può essere utilizzata, con diverse coordinate,
per diversi poligoni (come ad esempio la foto di una parete di un edificio
quando la parete è divisa in tanti poligoni all'interno del CityGML); di
conseguenza invece che specificare texture e coordinate per ogni poligono
viene definita una sola volta ogni texture con le informazioni di quali poligoni la
utilizzeranno e con quali coordinate. Lo stesso vale per i colori: invece che
definire un nuovo colore per ogni poligono, si definisce ogni colore una volta
soltanto associando gli ID dei poligoni su cui il colore andrà applicato.
11
3 Implementazione
3.1 Lettura
Una texture è ad esempio descritta da
<app:ParameterizedTexture>
<app:imageURI>texture1.jpg</app:imageURI>
<app:target uri="#polygonA">
<app:TexCoordList>
<app:textureCoordinates>
0.0755862221122 0.249744519591
0.0755862221122 0.294397711754
0.0009967945516 0.294397711754
0.0755862221122 0.249744519591
</app:textureCoordinates>
</app:TexCoordList>
</app:target>
<app:target uri="#polygonB">
<app:TexCoordList>
<app:textureCoordinates>
0.0009967945516 0.294397711754
0.0009967945516 0.249744519591
0.0755862221122 0.249744519591
0.0009967945516 0.294397711754
</app:textureCoordinates>
</app:TexCoordList>
</app:target>
<app:target uri="#..."> ... </app:target>
<app:target uri="#..."> ... </app:target>
</app:ParameterizedTexture>
mentre un colore è definito da
<app:X3DMaterial>
<app:diffuseColor>0.588 0.587 0.588</app:diffuseColor>
<app:emissiveColor>0 0 0</app:emissiveColor>
<app:specularColor>1 1 1</app:specularColor>
<app:target>#polygon1</app:target>
<app:target>#polygon2</app:target>
<app:target>.........</app:target>
</app:X3DMaterial>
12
3 Implementazione
3.1 Lettura
Per poter applicare texture e colori ai poligoni in fase di parsing senza
dover ispezionare ogni volta l'albero alla ricerca dell'ID del poligono, anche
i nodi di texture e colori vengono salvati in due liste separate. Queste liste
vengono subito ispezionate ed ogni elemento processato come segue. Nel
caso delle texture, lo URI dell'immagine viene letto (e il percorso del file
viene reso assoluto aggiungendo in testa il percorso del file CityGML); per
ogni target viene estratto l'ID del poligono e le coordinate della texture;
queste informazioni vengono infine inserite in una hash table avente come
chiave l'ID del poligono target (per renderne immediato l'accesso) e come
valore un array contenente il percorso della texture e le coordinate. Un
procedimento analogo è effettuato per i colori, dove però nel campo valore
della hash table viene inserito il colore già processato con le sue varie
componenti.
Lo svantaggio di questo procedimento, che è il motivo per cui è stato
deprecato dopo la versione 0.4 di CityGML, è che si possono creare,
specialmente nel caso dei colori, moltissimi elementi uguali che si
differenziano soltanto per il target su cui vanno applicati. Sarebbe tuttavia
più costoso - in termini di operazioni da effettuare - ispezionare l'albero
DOM per ogni poligono (molto numerosi su grandi dataset) alla ricerca di
queste informazioni, che in molti casi non sono proprio presenti.
3.2 Parsing
La fase di parsing si occupa di trasformare tutti i nodi degli edifici salvati
durante la lettura in oggetti renderizzabili da WW. La classe di WW che
meglio si addice a rappresentare elementi del CityGML è la classe Polygon:
infatti ogni oggetto CityGML è definito da una serie di poligoni che lo
compongono. Per ogni nodo verranno quindi convertiti tutti i suoi poligoni;
questi poi verranno aggregati nella classe CityGMLBuilding creata
appositamente.
Ogni CityGMLBuilding contiene un edificio in cinque diversi livelli di
dettaglio che corrispondono approssimativamente a quelli del CityGML:
1. pianta (involucro convesso): corrisponde al LOD0
2. bounding box (estrusione della pianta alla massima altezza):
corrisponde al LOD1
13
3 Implementazione
3.2 Parsing
3. lista di poligoni con eventuali colori: corrisponde al LOD2 senza
texture
4. lista di poligoni con eventuali colori e texture: corrisponde al LOD2
5. lista di poligoni con eventuali colori e texture e aperture:
corrisponde al LOD3
Il diagramma di classe UML per CityGMLBuilding è il seguente:
CityGMLBuilding
centroid: Position
footprint: SurfacePolygon
bb: ExtrudedPolygon
lod1walls: ArrayList<MyPolygon>
lod2walls: ArrayList<MyPolygon>
lod3walls: ArrayList<MyPolygon>
CityGMLBuilding ( c: Position, ground: SurfacePolygon,
extr: ExtrudedPolygon, l1: ArrayList<MyPolygon>,
l2: ArrayList<MyPolygon>, l3: ArrayList<MyPolygon> )
3.2.1 Procedimento
Ogni nodo della lista prodotta in fase di lettura viene processato come
segue: in una nuova lista vengono estratti tutti i nodi discendenti da esso
aventi come tag ''gml:Polygon''; da ognuno di questi nodi vengono
estratte le coordinate, convertite dal CRS del dataset in latitudine e
longitudine, ed infine vengono creati tre Polygon con le coordinate
ottenute, uno per ciascuno degli ultimi tre livelli di dettaglio del
CityGMLBuilding.
Nelle hash table create durante la lettura viene cercato l'ID del poligono
CityGML e, se la chiave è presente, viene estratta la texture con le
coordinate e/o il colore. Al primo poligono è applicato il colore (o un colore
di default se non è specificato nessun colore), al secondo poligono viene
applicata la texture (o il colore del primo poligono se non ci sono texture),
mentre al terzo poligono oltre a texture e/o colore vengono applicati i
contorni interni nel caso il poligono abbia delle aperture (porte, finestre..).
Se due o tutti e tre i poligoni coincidono (nel caso in cui non siano
specificate texture e/o aperture) si fa sì che i poligoni coincidenti puntino
14
3 Implementazione
3.2 Parsing
alla stessa istanza, per occupare meno spazio in memoria. I tre poligoni
sono quindi inseriti in tre liste distinte.
Quando tutti i poligoni di un edificio sono stati creati anche le liste
vengono unite se due o tre interi livelli di dettaglio coincidono.
Durante la conversione delle coordinate di ogni poligono dell'edificio le
nuove coordinate vengono salvate anche in un Set; dopo aver convertito
tutti i poligoni viene calcolato a partire da tutti i punti salvati l'inviluppo
convesso dell'edificio e viene così creata la pianta. Dalle altezze dei vari
punti si ottiene l'altezza complessiva dell'edificio, usata per estrudere la
pianta e creare un pseudo bounding box. Infine viene calcolato il centroide
dell'edificio, approssimato come centro della pianta a metà altezza del
bounding box.
In conclusione viene istanziato un nuovo CityGMLBuilding con centroide,
pianta, bounding box e le tre liste contenenti i diversi LOD, e viene inserito
in un array che sarà poi letto in fase di ottimizzazione una volta che il
parsing di tutti gli edifici sarà stato completato.
Ecco come appare un edificio in WW al termine del parsing nei vari LOD:
Pianta
Bounding Box:
15
3 Implementazione
3.2 Parsing
Livello 1:
Livello 2:
16
3 Implementazione
3.2 Parsing
Livello 3:
Si può notare come il bounding box sia effettivamente l'estrusione della
pianta. Il livello 1 invece sembra “scolpito” nel bounding box; i colori delle
pareti e del tetto sono quelli assegnati di default, mentre quelli delle tende
al piano terra erano specificati e sono stati quindi estratti dalla hash map.
Nel livello 2 sono state aggiunte le texture, anch'esse prima salvate e poi
estratte dalla hash map (anche il colore apparentemente uniforme delle
pareti è in realtà una texture). Nel livello 3 sono state infine aggiunte le
finestre e la porta, anch'esse con i loro colori o le loro texture.
17
3 Implementazione
3.2 Parsing
3.2.2 Extra feature
La funzione di parsing include anche un'opzione per poter moltiplicare un
dataset un numero arbitrario di volte con un certo offset da quello
originale; le copie del dataset saranno disposte intorno all'originale, che
quindi risulterà in posizione centrale.
Questa funzione risulta molto utile nello studio delle performance perché
permette di simulare città enormi che non sono ancora disponibili ma che
potrebbe essere necessario rappresentare in futuro.
Esempio di un edificio moltiplicato 5x7 volte con un offset di 0.0002° in
latitudine e 0.0003° in longitudine (all'edificio originale non sono state
applicate texture per evidenziare il fatto che le copie sono costruite
intorno ad esso centrandolo):
3.3 Ottimizzazione
La fase di ottimizzazione si occupa di creare delle strutture dati che
contengano gli edifici e che alleggeriscano successivamente il rendering.
L'ottimizzazione sfrutta il concetto delle BVH, strutture ad albero ricavate
da insiemi di oggetti geometrici: essi vengono racchiusi da bounding
18
3 Implementazione
3.3 Ottimizzazione
volumes che formano i nodi foglia dell'albero. Questi nodi sono poi
raggruppati in piccoli insiemi che nella struttura ad albero rappresentano il
padre e così ricorsivamente fino ad arrivare alla radice dell'albero.
Le BVH sono poi utilizzate nella collision detection: partendo dalla radice,
se un nodo non è visibile nella scena da renderizzare allora neanche i suoi
figli (e procedendo ricorsivamente fino alle foglie neanche gli oggetti
geometrici in esso contenuti) saranno visibili, quindi viene effettuato
immediatamente un pruning del ramo dalla lista di oggetti da
renderizzare. Se invece il nodo è visibile si va in ricorsione sui figli, perché
alcune parti potrebbero essere fuori dalla scena; se si arriva agli oggetti
geometrici senza pruning questi vengono renderizzati.
L'overhead computazionale introdotto viene ripagato durante il rendering
nel caso in cui una parte della scena non sia visibile: la complessità può
essere logaritmica rispetto al numero di oggetti.
3.3.1 Procedimento
La città viene divisa in “quartieri” a seconda della sua ampiezza; la
dimensione approssimativa dei quartieri è fissata a un centesimo di grado
in longitudine e mezzo centesimo di grado in latitudine, in modo da
dividere il mondo nello stesso numero di parti (18000) in latitudine e
longitudine e non dover dividere ogni dataset nello stesso numero di
blocchi. La dimensione effettiva dei quartieri è approssimativa perché in
base alle dimensioni specificate viene calcolato quanti ne sono necessari in
latitudine e longitudine ed infine la città viene divisa in quartieri regolari in
19
3 Implementazione
3.3 Ottimizzazione
base alle sue dimensioni.
Ogni quartiere è diviso in due sia in latitudine che in longitudine, e
contiene perciò quattro “isolati”. L'array di CityGMLBuilding creato durante
il parsing viene quindi ispezionato e ogni edificio viene inserito nell'isolato
corretto del quartiere corretto a seconda della posizione del suo centroide
rispetto agli estremi della città.
Per ogni quartiere poi viene calcolato l'inviluppo convesso di ogni isolato a
partire dai punti delle piante degli edifici che esso contiene e l'inviluppo
dell'intero quartiere a partire da quelli dei suoi quattro isolati.
Tutti i quartieri vengono infine inseriti in un RenderabeLayer che li
renderizzerà al termine del preprocessing.
La struttura gerarchica di quartieri, isolati ed edifici si può notare
nell'immagine seguente: gli edifici sono racchiusi dagli isolati (in alcuni
punti sovrapposti) che a loro volta sono racchiusi nel quartiere.
20
3 Implementazione
3.3 Ottimizzazione
3.3.2 Calcolo dell'inviluppo convesso
In questo paragrafo viene descritto l'algoritmo della catena monotona
utilizzato per calcolare l'inviluppo complesso di un insieme di punti sia
nella fase di parsing ma soprattutto per la creazione dell'involucro di
quartieri e isolati.
I punti in input sono in 2D, poiché gli inviluppi ottenuti saranno proiettati
sul terreno; essi sono salvati in un SortedSet per evitare di calcolare
duplicati (quando differiscono solo per l'altezza) e perché l'algoritmo
necessita che i punti siano ordinati lessicograficamente a seconda
dell'ascissa (e in caso di uguaglianza a seconda dell'ordinata).
L'algoritmo si divide in due parti: si cerca la catena monotona tra i due
estremi sull'ascissa utilizzando il metodo di Graham prima nella parte
inferiore e poi in quella superiore.
Il lato inferiore dell'inviluppo si ottiene
partendo dal punto con ascissa
minore; iterando sull'insieme in input
si cercano i punti che facciano una
“svolta” in senso antiorario e si
aggiungono all'insieme di output fino
ad arrivare al punto con ascissa
massima. Il lato superiore si trova con
lo stesso procedimento ma scorrendo
l'insieme in ordine inverso.
In pseudo-codice:
INPUT: List P of 2D points sorted by x-coordinate (in case of
a tie, by y-coordinate)
U, L = new List()
// upper and lower part respectively
for i = 0, 1, ..., P.length-1
while (L contains at least two points AND the sequence of
last two points of L and the point P[i] does not
make a counter-clockwise turn)
21
3 Implementazione
3.3 Ottimizzazione
remove the last point from L
append P[i] to L
for i = P.length-1, P.length-2, ..., 0
while (U contains at least two points AND the sequence of
last two points of U and the point P[i] does not
make a counter-clockwise turn)
remove the last point from U
append P[i] to U
Remove the last point of each list (it's the same as the first
point of the other list)
return (concatenate(L,U))
Avendo l'input già ordinato la complessità dell'algoritmo è O(n).
3.4 Rendering
Dopo aver letto, trasformato e ottimizzato il dataset CityGML in input, lo si
può visualizzare sul globo virtuale. Viene quindi creata un'istanza della
classe AppFrame di WW, alla quale viene passato il RenderableLayer
creato in fase di ottimizzazione. Questo layer contiene tutte le CityTile (i
“quartieri”), sulle quali viene chiamato in automatico il metodo render ogni
volta che la scena cambia (ovvero quando avvengono zoom o
spostamenti).
Le CityTile sono renderizzate con diverso livello di dettaglio a seconda
della loro distanza dall'occhio della vista; quando il metodo render viene
chiamato, viene calcolata la distanza dal suo centro. Se questa distanza è
oltre una soglia massima, viene renderizzato solo l'inviluppo del quartiere,
altrimenti per ogni isolato viene calcolata la sua distanza dall'occhio della
scena: se questa distanza è superiore ad un'altra soglia, allora viene
renderizzato l'inviluppo dell'isolato, altrimenti vengono renderizzati tutti gli
edifici in esso contenuti. In quest'ultimo caso anche per ogni edificio viene
calcolata la distanza dal suo centroide alla camera, e in base a questa
viene renderizzato uno dei cinque livelli di dettaglio.
22
3 Implementazione
3.4 Rendering
Distanza molto grande: viene renderizzato solo l'inviluppo della CityTile.
Distanza minore: si distinguono i quattro isolati.
23
3 Implementazione
3.4 Rendering
Lieve avvicinamento: vengono renderizzate le
piante degli edifici dei due isolati più vicini.
Ulteriore avvicinamento: vengono renderizzate le piante
anche degli altri due isolati, e le BB dei primi edifici.
24
3 Implementazione
3.4 Rendering
Diminuzione della distanza: gli edifici più vicini
sono renderizzati con LOD1, gli altri con la BB.
Questa particolare implementazione del rendering sfrutta le gerarchie
create durante l'ottimizzazione per risparmiare calcoli quando non è
necessario: infatti se viene renderizzato solo l'inviluppo del quartiere è
inutile calcolare la distanza di ogni singolo edificio.
La tecnica che maggiormente utilizza le gerarchie per risparmiare ulteriori
calcoli e velocizzare quindi il rendering è però il frustum culling.
Il viewing frustum è la regione di spazio che rappresenta il campo visivo
della camera virtuale; la sua forma è quella di tronco (frustum) di
piramide a base rettangolare al cui vertice è posizionata la camera. Viene
utilizzato un tronco di piramide perché il campo visivo non inizia dal
vertice ma da un near plane fissato; la distanza massima visibile è data
invece dal far plane.
25
3 Implementazione
3.4 Rendering
Il frustum culling consiste nel calcolare se
un oggetto si trova all'interno del view
frustum per stabilire se vada renderizzato
oppure no: se è fuori dal campo visivo
della camera si possono risparmiare draw
call che non avrebbero nessun effetto
sull'immagine di output. Naturalmente il
frustum culling è più efficiente se applicato
ad una gerarchia: infatti se un bounding
volume non si trova nel frustum, non sarà
necessario eseguire il test sugli oggetti in
esso contenuti così come non sarà
necessario renderizzarli.
La fase di rendering è dunque alleggerita da frustum culling e dal
clustering degli edifici per evitare, specialmente in grandi dataset, di dover
effettuare una draw call per ogni singolo poligono letto nel dataset.
Citygml4ww è provvisto di un pannello in cui ad ogni frame vengono
aggiornate delle statistiche sul numero effettivo di poligoni renderizzati e
sul numero di edifici visibili. Su dataset molto grandi si possono ottenere
risultati come questi:
26
3 Implementazione
3.4 Rendering
In questo esempio solo il 2% dei quasi 300.000 poligoni è stato
renderizzato, riducendo di 50 volte il numero di draw call necessarie a
renderizzare la scena ed aumentando quindi considerevolmente il frame
rate.
3.5 Simulatore di dinamica dei fluidi
Come esempio delle possibili applicazioni di citygml4ww, il prototipo
realizzato include un'opzione per esportare un'area rettangolare della città
in un file javascript che poi verrà utilizzato in un simulatore della
propagazione di fluidi dove gli edifici saranno gli ostacoli che lo
devieranno.
Un bottone nella finestra permette di selezionare sulla superficie del globo
un'area rettangolare allineata agli assi; la dimensione del settore può
sempre essere modificata e il settore può essere spostato. Quando il
bottone viene premuto, per tutti gli edifici visibili viene renderizzata la
pianta indipendentemente dalla distanza, perché è necessario avere
un'anteprima di come apparirà la simulazione (viene renderizzata la pianta
perché il simulatore è in 2D).
Una volta creato il settore, il bottone cambia stato e, se cliccato
nuovamente converte le coordinate di tutti gli edifici parzialmente o
totalmente all'interno del settore (dopo aver fatto del pruning sulle BVH)
27
3 Implementazione
3.5 Simulatore di dinamica dei fluidi
in pixel coordinates e aggiorna una stringa che tiene conto della sintassi
javascript rappresentando ogni edificio come un array di coordinate intere
(x,y). Nel simulatore esterno le coordinate sono comprese nel range
[0-99] su entrambi gli assi; se il settore selezionato non è quadrato ma
rettangolare esso verrà centrato orizzontalmente se l'aspect ratio è minore
di 1 oppure allineato al lato superiore in caso contrario (ovvero le pixel
coordinates risultanti per l'asse y andranno da 0 a 99/aspectRatio).
Dopo aver salvato le coordinate il bottone cambia nuovamente stato
permettendo di uscire dalla modalità di selezione dell'area per la
simulazione e tornare alla visualizzazione normale.
Aprendo il file html del simulatore viene chiamato il file javascript
esportato da WW; le coordinate vengono quindi interpretate e gli edifici
disegnati e riconosciuti come ostacoli per la dispersione di fluidi; la
simulazione può ora avere inizio:
28
3 Implementazione
3.5 Simulatore di dinamica dei fluidi
3.5.1 Clipping
Se un edificio si trova completamente all'interno del settore le sue
coordinate vengono normalizzate nell'intervallo dato dall'aspect ratio del
settore. In caso contrario bisogna effettuare il clipping sul poligono,
ovvero determinare la porzione del poligono che si trova all'interno del
settore, affinché non vi siano poligoni con coordinate al di fuori del range
previsto; senza clipping infatti verrebbero disegnate e riconosciute come
ostacoli parti di edifici non comprese nel settore selezionato su WW.
L'algoritmo di Sutherland-Hodgman è un ottimo algoritmo per il clipping di
poligoni: considerando un lato per volta dell'area di clipping, esso estende
tale lato all'infinito, dopodiché crea un nuovo poligono iterando su ogni
lato (due punti consecutivi) del poligono precedentemente processato
agendo come segue:
• se il lato è interno all'area di clipping rispetto al lato di clipping
considerato, il secondo punto viene aggiunto al nuovo poligono;
• se il lato interseca il lato di clipping, l'intersezione viene aggiunta al
nuovo poligono e se dei due punti è il secondo ad essere interno
all'area, anch'esso viene aggiunto al nuovo poligono;
dopo aver effettuato il clipping su un lato dell'area, il poligono iniziale
viene sostituito col nuovo poligono e viene effettuato il clipping sui
rimanenti lati dell'area.
Esempio di clipping su un lato:
Input: poligono P1P2P3P4
Nuovo poligono:
– P1P2 → nessun punto
– P2P3 → S1 e P3
– P3P4 → P4
– P4P1 → S2
Il lato S1S2 chiude il poligono.
Output: poligono S1P3P4S2
29
3 Implementazione
3.5 Simulatore di dinamica dei fluidi
Il clipping di un poligono su un'intera regione è realizzato tramite il
clipping del poligono su ogni lato della regione:
In pseudo-codice:
INPUT: Polygon polygon
Polygon clipped
for each clipEdge do
clipped.clear()
for i = 0, 1, ..., polygon.length-1
Pi
= polygon.vertex[i]
Pi+1 = polygon.vertex[i+1]
if (Pi is inside clipping region)
if (Pi+1 is inside clipping region)
clipped.add(Pi+1)
else clipped.add(intersect(Pi, Pi+1, clipEdge)
else
if (Pi+1 is inside clipping region)
clipped.add(intersect(Pi, Pi+1, clipEdge)
clipped.add(Pi+1)
polygon = clipped
return clipped
30
4 Problemi e limiti
Durante lo sviluppo di citygml4ww sono stati incontrati alcuni problemi ai quali
non è stata trovata soluzione, specialmente per quanto riguarda la gestione del
CityGML. Questo capitolo ha lo scopo di descriverli, motivandone la mancata
risoluzione e spiegando come il problema sia stato aggirato o come sarebbe
possibile risolvere.
4.1 Coordinate Reference System
Nonostante il CityGML sia provvisto di un apposito tag per indicare il sistema di
riferimento usato per descrivere le coordinate, nella maggior parte dei dataset
disponibili in rete (tra cui quelli sul sito ufficiale di CityGML) esso è errato o
addirittura non presente; in altri dataset invece è specificato solo una volta, in
altri per ogni poligono. La mancanza di uno standard unico per definire il
sistema di coordinate rende impossibile determinarlo in maniera
automatizzata; perciò è stato necessario tenere memorizzati tutti i dataset a
disposizione ed il loro relativo SRS trovato in maniera empirica. A causa di ciò
è inoltre poco pratico aprire una finestra all'avvio del programma per far
caricare all'utente il dataset che desidera visualizzare, perché bisognerebbe
quantomeno confrontare il nome del file e tenere salvate nel programma le
associazioni file → EPSG, e ovviamente questo procedimento non è immune da
eventuali rinominazioni dei file.
4.2 Document Object Model
L'approccio DOM per la lettura del dataset è efficiente grazie alla sua struttura
ad albero veloce da attraversare, ma ha lo svantaggio di dover salvare tutti i
nodi in memoria: per dataset molto grandi la memoria disponibile può non
essere sufficiente; in alcuni casi la heap di 1GB allocata di default dalla JVM di
Eclipse non è stata sufficiente e si è dovuto aumentarla modificando gli
argomenti per la compilazione. Questa soluzione però, oltre ad essere limitata
dalla dimensione della RAM del computer in uso (e quindi non risolve il
problema alla radice) e a precludere molta più memoria agli altri processi, poco
31
4 Problemi e limiti
4.2 Document Object Model
si addice ad un eventuale utilizzo futuro dell'applicazione su sistemi mobili.
Analizzando un modello completo composto da cinque edifici in LOD3 con
textures si è visto che la lista contenente i nodi con gli edifici occupa circa
33MB in memoria, mentre il RenderableLayer contenente gli edifici
convertiti ne occupa soltanto 15. Leggendo e processando un nodo alla
volta invece che prima salvarli tutti consentirebbe quindi di utilizzare circa
1/3 della heap (la lista dei nodi non può essere cancellata fino alla fine del
parsing, ed essendo grande più o meno il doppio della lista di
CityGMLBuilding rappresenta i due terzi della memoria in uso); la memoria
utilizzata può scendere fino a circa il 10% nel caso in cui i tre livelli di
dettaglio coincidano, non avendo così texture e colori da salvare e potendo
“fondere” le tre liste dei vari livelli di dettaglio per ogni edificio.
Un risparmio di memoria di questo genere permetterebbe di rappresentare
dataset molto più grandi o di portare l'applicazione anche su dispositivi
mobili, di lasciare più memoria agli altri programmi in uso e di evitare che
la heap sia presto piena e necessiti di numerose e costose chiamate al
garbage collector, riducendo quindi anche i tempi di processing.
Un approccio alternativo per risolvere l'enorme utilizzo di memoria
sarebbe il parsing SAX, una API basata sugli eventi che legge il file in
maniera sequenziale e riporta gli eventi man mano che succedono, senza
salvarli in memoria. Normalmente l'accesso sequenziale è il motivo che
costringe ad utilizzare il DOM invece del SAX; in questo caso invece la
limitazione del SAX è data dal fatto che non genera nodi, ma eventi,
rendendo l'ispezione impossibile in fase di parsing.
4.3 CityGML
Il CityGML può racchiudere potenzialmente un'enorme numero di
informazioni riguardanti ogni elemento; molte volte però accade che un
dataset venga creato con le sole informazioni necessarie allo scopo per cui
è destinato. L'eterogeneità della struttura dei vari dataset disponibili ha
reso necessaria la scrittura di un parser generale che si adatti ad ogni
modello e che possa gestire la mancanza di alcuni nodi che in WW
sarebbero di grande utilità.
Un esempio è dato dalla pianta degli edifici: il CityGML prevede il nodo
''bldg:GroundSurface'' nel quale è specificata la pianta. Se questo nodo
32
4 Problemi e limiti
4.3 CityGML
fosse presente in ogni edificio di ogni dataset non bisognerebbe calcolare
l'inviluppo convesso degli edifici per avere la pianta, e si avrebbe una
forma sicuramente più accurata quando l'edificio viene rappresentato in
questo livello di dettaglio. Tuttavia questa informazione non solo in alcuni
dataset è completamente assente, ma anche all'interno dello stesso
modello può essere presente in alcuni edifici soltanto.
In altri casi invece le strutture non rispettano lo standard: ad esempio ci
sono pareti verticali definite come pianta dell'edificio, edifici che pur
essendo separati sono racchiusi all'interno dello stesso ''bldg:Building'',
oppure edifici che pur usando il tag ''bldg:opening'' per definire ad
esempio una finestra su un muro hanno quella parete già con il buco
anche nei livelli di dettaglio inferiori, dovendo così tassellare la parete con
un maggior numero di poligoni, che come conseguenza ha un maggior
numero di draw call da chiamare inutilmente per ogni frame. Queste però
sono soltanto delle eccezioni, e non sono state gestite nel programma in
quanto non riferite ad un documento CityGML ben formato.
Altri dataset sono creati invece con dei tool che rappresentano una
superficie piana come una parete con diversi poligoni o un grande numero
di triangoli: anche in questo caso le performance risultano notevolmente
ridotte, ma unire poligoni complanari oltre ad essere di per sé complicato
risulta ingestibile quando si hanno delle texture con le rispettive
coordinate per ogni poligono.
4.4 World Wind
Alcuni problemi, seppur di minor rilievo, sono stati riscontrati anche in
WW: per esempio i poligoni che contengono dei buchi devono essere
tassellati in quanto OpenGL gestisce solo poligoni convessi; il
tassellamento automatico di un poligono su cui è applicata una texture
però non ricalcola le coordinate della texture, così questa non verrà
visualizzata correttamente. Un altro problema dato dalle texture è che in
alcuni dataset le coordinate della texture sono date in un ordine diverso da
quelle del poligono, e la conseguenza è che le texture vengono ruotate di
±90° o 180°, causando l'effetto contrario che dovrebbe dare una texture,
ovvero rendere un oggetto ancora più simile alla realtà.
La classe Polygon di WW usa di default le texture fisse, e non ripetute. Per
33
4 Problemi e limiti
4.4 World Wind
poter abilitare l'utilizzo di texture ripetute si è creata una nuova classe che
estende Polygon su cui viene fato un override del metodo makeTexture in
modo che chiami una nuova classe che estende LazilyLoadedTexture in cui
nel metodo setTextureParameters vengono modificate le chiamate a
OpenGL in modo da abilitare le texture ripetute. Si è scelto di procedere in
questo modo perché modificare semplicemente il codice di WW non
avrebbe permesso di visualizzare le texture ripetute su altri dispositivi
senza prima modificare le classi di WW.
Un ultimo problema riscontrato con WW riguarda la mancanza di DEM
dettagliati per i vari luoghi dove sono presenti dei dataset: il risultato è
che in alcuni dataset gli edifici sono sospesi a mezz'aria, mentre in altri
sono sommersi nel terreno per qualche metro o addirittura
completamente. Per il modello di Trento, il più importante per gli scopi di
citygml4ww, sono state installate delle altitudini precise e questo
problema è stato completamente risolto.
34
5 Sviluppi futuri
5.1 Miglioramenti possibili
Siccome la maggior parte dei problemi elencati nel capitolo precedente
derivano dal CityGML o da World Wind, per risolverlo bisognerebbe fare una
proposta di revisione dello standard CityGML all'OGC in modo che definiscano
delle regole fisse per costruire un dataset senza avere tanti diversi modi per
definire lo stesso oggetto o dei nodi importanti definiti solo in alcuni edifici,
come ad esempio la pianta dell'edificio, ed una richiesta agli sviluppatori di WW
per un miglioramento della gestione delle texture, oppure tentare di migliorarle
autonomamente.
5.1.1 Memoria necessaria
Per quanto riguarda il problema dell'eccessivo utilizzo di memoria si può
sfruttare la divisione in tile di alcuni dataset: certi grandi modelli urbani infatti
sono salvati su più file CityGML, ognuno dei quali contiene una parte della città.
Caricando e facendo il parsing di un file alla volta si riduce l'utilizzo di memoria
per salvare i nodi del documento, in quanto al termine del parsing di ogni file i
suoi nodi possono essere cancellati. Anche se il risparmio di memoria non è
paragonabile all'approccio teorico di considerare un edificio alla volta, i risultati
sarebbero comunque apprezzabili.
5.1.2 Simulazione della dispersione di fluidi
Un possibile miglioramento riguarda anche l'esempio della dispersione di fluidi:
invece che esportare gli edifici per poi utilizzarli nella simulazione
bidimensionale, si può importare il simulatore all'interno di WW ed estenderlo
nelle tre dimensioni: si avrebbe così una simulazione più chiara e interattiva e
si potrebbero analizzare gli effetti della dispersione di fluidi da diversi punti di
vista e con diverse angolazioni. La contestualizzazione della simulazione la
renderebbe certamente molto più efficace.
35
5 Sviluppi futuri
5.1 Miglioramenti possibili
5.1.3 Aggregazione degli edifici
L'implementazione che sarà maggiormente necessaria è però una migliore
aggregazione degli edifici: al momento infatti un isolato alla latitudine di
Trento ha un'area di circa 0.6 km2, e un quartiere è perciò grande quasi
2,5 km2. Oltre alle grandezze poco fedeli alla realtà, anche la forma non
tiene conto della reale disposizione degli edifici, ma segue semplicemente
una griglia regolare. Avendo a disposizione un grafo stradale si potrebbero
aggregare edifici racchiusi da piccole strade in isolati, isolati racchiusi da
strade secondarie in zone, zone racchiuse da strade principali in quartieri e
via così, anche su un maggior numero di livelli di dettaglio. Questa
suddivisione non solo permetterebbe un passaggio più graduale dalla
visualizzazione di un'ampia zona alla visualizzazione delle piante di tutti gli
edifici contenuti nella zona stessa, ma fornirebbe anche delle gerarchie
migliori nei vari casi in cui viene effettuata la collision detection,
risparmiando un maggior numero di calcoli in molti casi.
5.2 Utilizzi del programma
Citygml4ww
verrà
utilizzato
nell'ambito
del
progetto
i-Scope
(Interoperable Smart City services through an Open Platform for urban
Ecosystems) coordinato dalla Fondazione Graphitech, presso la quale è
stata svolta questa tesi, in collaborazione con altri partner italiani ed
europei: la disposizione e l'ingombro degli edifici contestualizzati in un
ambiente tridimensionale sarà d'aiuto nello studio della mobilità di
persone anziane o disabili, nello studio della potenziale installazione di
pannelli solari e nello studio dell'inquinamento acustico o nella sua
simulazione.
La simulazione della dispersione dei fluidi è parte del progetto GEPSUS
(Geographical Information Processing for Environmental Pollution-Related
Security within Urban Scale Environments) in cui la Fondazione Graphitech
collabora con partner internazionali e che vede il Ministero della Difesa del
Montenegro come utente finale. L'esportazione di aree di modelli urbani
CityGML o l'eventuale futura importazione del simulatore all'interno di WW
certamente arricchiscono questo strumento permettendo degli studi più
precisi ed accurati.
36
6 Conclusioni
In questa tesi è stata mostrata un'applicazione che legge, analizza e converte
modelli urbani CityGML e li contestualizza nel globo virtuale fornito da World
Wind. Per le scelte implementative spiegate in precedenza sono stati
considerati solo gli edifici e non gli altri elementi rappresentabili dal CityGML e
soltanto fino al terzo livello di dettaglio.
L'enorme numero di poligoni con cui un'intera città deve essere descritta ha
spinto inoltre ad ottimizzare la visualizzazione, creando delle gerarchie di
volumi per renderizzare aggregazioni di edifici quando i singoli elementi
risultano indistinguibili e rappresentando gli edifici con diversi livelli di dettaglio
a seconda della loro distanza.
La funzione per la moltiplicazione dei dataset ha inoltre permesso di simulare
delle metropoli per testare l'utilizzo di memoria e CPU: in questi casi è emersa
la necessità di migliorare la gestione della memoria. Sono così state migliorate
le strutture dati necessarie e, oltre a referenziare la stessa lista di poligoni in
caso più livelli di dettaglio di un edificio coincidano, è stato applicato lo stesso
procedimento ai singoli poligoni, utile nel caso i livelli di dettaglio non
coincidano completamente.
In definitiva quindi citygml4ww è il primo strumento che contestualizza gli
edifici di un modello CityGML in un ambiente tridimensionale esteso a tutto il
mondo e ne ottimizza la visualizzazione per ridurre le risorse richieste ed
aumentare le performance del rendering.
37
7 Ringraziamenti
C'è un grande numero di persone che devo ringraziare per essere arrivato fin
qui, e per non fare torti a nessuno seguirò un ordine meramente cronologico.
Prima di tutto grazie ai miei amici nonché compagni di corso Loris, Alessandro,
Gustavo, Giulia, Gabriele, Lorenzo, Martino, Stefano, Matej, con i quali ho
realizzato progetti per l'università, studiato per gli esami e condiviso numerosi
momenti di allegria in questi tre anni.
Un secondo ringraziamento va all'Università degli Studi di Trento - e in
particolare all'Ufficio LLP Erasmus e all'ufficio Erasmus della Facoltà di Scienze
Matematiche Fisiche e Naturali – e al Karlsruher Institut für Technologie perché
il semestre che ho trascorso in questa università tedesca non solo mi ha
arricchito di tantissime nuove esperienze facendomi confrontare con diverse
realtà, ma soprattutto il corso di computer grafica offerto dal KIT ha illuminato
una strada importante per il mio futuro da informatico in quanto mette in
pratica i miei studi in una mia grande passione.
Infine un ringraziamento speciale va al mio relatore prof. Nicola Conci, al
correlatore Raffaele De Amicis per avermi proposto una tesi così interessante e
per il supporto fornito in seguito, e a tutto lo staff della Fondazione Graphitech
per la disponibilità e la cordialità dimostrate nei miei confronti, in particolare
grazie al mio correlatore Daniele per il supporto tecnico fornito soprattutto
nella fase iniziale e a Marco per il testing ed i suggerimenti che hanno
aumentato la qualità del programma.
39
8 Appendici
8.1 Acronimi
API
Application Programming Interface
BVH
Bounding Volume Hierarchy
CRS
Coordinate Reference System
DEM
Digital Elevation Model
DOM
Document Object Model
EPSG
European Petroleum Survey Group
GDAL
Geospatial Data Abstraction Library
GIS
Geographic Information System
GML
Geography Markup Language
IDE
Integrated Development Environment
JOGL
Java OpenGL
JVM
Java Virtual Machine
LOD
Level Of Detail
NASA
National Aeronautics and Space Administration
OGC
Open Geospatial Consortium
OpenGL
Open Graphics Library
SAX
Simple API for XML
SDK
Software Development Kit
SRS
Spatial Reference System
UIM
Urban Information Model
UML
Unified Modeling Language
URI
Uniform Resource Identifier
W3C
World Wide Web Consortium
WW
World Wind
WWJ
World Wind for Java
XML
eXtensible Markup Language
41
8 Appendici
8.2 Bibliografia
8.2 Bibliografia
●
●
●
●
●
●
●
●
●
●
●
●
http://www.citygml.org/index.php?id=1523
http://www.iscopeproject.net/iscopeNew/index.php?
option=com_content&view=article&id=55&Itemid=53
http://www.citygml.org/fileadmin/citygml/docs/CityGML_Tutorial_K
olbe_Internet.pdf
http://en.wikipedia.org/wiki/Geography_Markup_Language
http://goworldwind.org/about/
http://en.wikipedia.org/wiki/NASA_World_Wind
https://www.ohloh.net/p/wwj/analyses/latest/languages_summary
http://it.wikipedia.org/wiki/Document_Object_Model
http://en.wikipedia.org/wiki/Bounding_volume_hierarchy
http://en.wikibooks.org/wiki/Algorithm_Implementation/Geometry/
Convex_hull/Monotone_chain
http://www.sunshine2k.de/stuff/Java/SutherlandHodgman/Sutherla
ndHodgman.html
http://en.wikipedia.org/wiki/Simple_API_for_XML
8.3 Immagini
●
●
●
●
●
●
●
http://ars.els-cdn.com/content/image/1-s2.0S0924271612000779-gr3.jpg
http://www.geores.de/resourcesHomepage/lod3Build.png
http://cg.ibds.kit.edu/lehre/ws2011/cg/downloads/internal/05_Rae
umlicheDatenstrukturen.pdf
http://upload.wikimedia.org/wikipedia/commons/d/d5/UpperAndLo
werConvexHulls.png
http://techpubs.sgi.com/library/dynaweb_docs/0620/SGI_Develope
r/books/Optimizer_PG/sgi_html/figures/view.frustum.culling.gif
http://cg.ibds.kit.edu/lehre/ws2011/cg/downloads/internal/06_Rast
erisierung_Teil1.pdf
http://onlinemca.com/mca_course/kurukshetra_university/semeste
r5/computergraphics/img_computer_graphics/sutherland_hodgman
1.bmp
42
Fly UP