Simulazione e Rendering di materiali deformabili in Realtà
Transcript
Simulazione e Rendering di materiali deformabili in Realtà
POLITECNICO DI BARI DIPARTIMENTO DI INGEGNERIA MECCANICA E GESTIONALE Tesi per il conseguimento della Laurea di Primo Livello in Ingegneria Meccanica Simulazione e Rendering di materiali deformabili in Realtà Virtuale Laureando: Relatore: Stefano Cristiano Chiar.mo Prof. Antonio Uva CoRelatore: Chiar.mo Prof. Giuseppe Monno A Babbo e Mamma Sommario Il Virtual Sculpturing è ancora un campo di ricerca aperto, che si compone simulazioni basate su modelli fisici ad approcci semplificati. Le tecniche di modellazione volumetrica sono più intuitive di quelle basate sulle superfici, ma sono limitate dal consumo di memoria e dalla complessità del calcolo, che risulta generalmente molto elevata. In questa tesi è stato sviluppato un approccio innovativo di simulazione basato su particelle che supporta la manipolazione interattiva di materiale deformabile internamente rappresentato mediante sfere rigide. Inoltre è supportata l’addizione o la rimozione di materiale in tempo reale, poiché essa avviene senza alcun processo di ricalcolo della topologia. Questa caratteristica rende possibili manipolazioni arbitrarie dei volumi di materiali simulati con fori, rotture e cambiamenti di topologia. Il rendering è fatto visualizzando la isosuperficie generata dalle particelle. L’estrazione di questa isosuperficie è stata fatta in un primo momento con una versione ottimizzata del classico algoritmo dei Marching Cubes. Sono in corso esperimenti di rendering sfruttando le ultimissime potenzialità degli acceleratori grafici presenti sul mercato (GPU) con risultati molto incoraggianti, tanto da dedicare un ampio capitolo per descriverle. Il modello ipotizzato in questa tesi è stato realizzato praticamente in linguaggio C++ sotto piattaforma Windows, utilizzando le librerie grafiche DirectX. Il programma è in fase di continua evoluzione e può essere utilizzato anche da utenti inesperti per deformare interattivamente materiale virtuale su un normale PC. I risultati sia in termini di performance sia in termini di feedback dell’utente sono stati molto interessanti. Ringraziamenti Ringrazio prima di tutti la mia famiglia, mio Padre Antonio, mia Madre Adriana e mio Fratello Domenico perché è grazie ai loro sacrifici e alla loro unità che sono potuto giungere a questo importante traguardo. Un caloroso abbraccio va a Federica, per il suo inestimabile supporto nei momenti più difficili e per la sua cucina deliziosa, senza la quale sarebbe stato molto più pesante scrivere questa tesi. Un ringraziamento speciale va a Dario “Pellicu$” Pelella, per la sincera amicizia e straordinaria intelligenza che lo contraddistingue. Ringrazio anche tutti i miei amici e le mie amiche: Erica, Tommaso, Faebio, Sauè, Giuseppe,Marco,Andrea,Alessandra,Luigi,Danao,Tano,Mimmo,Ruggiero,Daniela,Auro ra, i componenti del gruppo, Alessandro Special, Tonino Special, Walter Special e Marco Special. Un ringraziamento d’oltre Manica a Maurizio “Cthulhu” Sciglio per la sua amicizia e per le continue e stimolanti discussioni tecniche che facciamo in continazione. La mia speciale gratitudine va al Prof. Antonio Uva per l’idea di base di questo lavoro e per le continue discussioni teoriche e tecniche che hanno portato alla sua realizzazione. Un rigraziamento è dovuto al Prof. Giuseppe Monno per la sua attenta supervisione ed il suo incoraggiamento. Ringrazio infine il dott. Michele Fiorentino, che ha visionato questa tesi. Indice Generale Capitolo 1: Introduzione ...................................................................................................................... 1 1.1 REAL-TIME VIRTUAL SCULPTURING .............................................................................................. 1 1.1.1 Classificazione ..................................................................................................................... 2 Modelli superficiali..................................................................................................................................2 Modelli volumetrici..................................................................................................................................2 Modelli Basati sulla fisica ...................................................................................................................3 Modelli Semplificati............................................................................................................................3 Sistemi Particellari ..............................................................................................................................3 1.2 SISTEMI PARTICELLARI.................................................................................................................. 4 1.2.1 Sistemi indipendenti e sistemi collegati ................................................................................. 5 1.2.2 Sistemi particellari nel campo della fisica ............................................................................. 5 1.2.3 Sistemi particellari in Computer Graphics ............................................................................ 6 1.3 CONSIDERAZIONI .......................................................................................................................... 7 Capitolo 2: Simulazione ....................................................................................................................... 8 2.1 PRIMITIVE .................................................................................................................................... 8 2.1.1 Ellissoidi e sfere ................................................................................................................ 10 2.1.2 Ellissoidi ............................................................................................................................ 10 2.1.3 Sfere................................................................................................................................... 11 2.2 REGOLE DEL SISTEMA ................................................................................................................. 11 2.2.1 Dinamica Molecolare ......................................................................................................... 11 2.2.2 Potenziale di Lennard-Jones (LJ)........................................................................................ 12 2.2.3 Tensione superficiale .......................................................................................................... 13 2.2.4 Dalle forze agli spostamenti................................................................................................ 14 2.2.5 Funzione di risposta ........................................................................................................... 16 2.3 RISOLUZIONE ITERATIVA DEI VINCOLI. RELAXATION .................................................................... 19 2.3.1 Campi di utilizzo del “relaxation” ...................................................................................... 19 2.3.2 Metodi verlet ...................................................................................................................... 20 2.4 IMPACCHETTAMENTO.................................................................................................................. 21 2.4.1 Densità............................................................................................................................... 21 2.4.2 Impacchettamenti CFC e Esagonale.................................................................................... 22 2.5 STRUTTURE DI PARTIZIONAMENTO SPAZIALE ............................................................................... 23 2.5.1 Introduzione alle strutture di partizionamento..................................................................... 24 2.5.2 Bounding Volume Hierarchies ............................................................................................ 25 2.5.3 Sphere Tree ........................................................................................................................ 27 2.5.4 Octree ................................................................................................................................ 29 2.5.5 Loose Octree ...................................................................................................................... 31 2.6 POLITICA DEGLI AGGIORNAMENTI................................................................................................ 32 2.7 STRUMENTI DI MODELLAZIONE .................................................................................................... 34 2.7.1 Strumenti composti di sfere ................................................................................................. 34 2.7.2 Strumenti poligonali ........................................................................................................... 36 2.7.3 Performance....................................................................................................................... 36 Capitolo 3: Rendering in CPU ........................................................................................................... 38 3.1 INTRODUZIONE ........................................................................................................................... 39 3.1.1 Superfici Implicite .............................................................................................................. 40 3.1.2 Funzione D1....................................................................................................................... 40 3.1.3 Funzione D2....................................................................................................................... 43 3.1.4 Funzione D3....................................................................................................................... 43 3.1.5 Funzione D4....................................................................................................................... 43 3.1.6 Funzioni a paragone........................................................................................................... 44 3.2 MARCHING CUBES ...................................................................................................................... 45 3.2.1 Marching Squares .............................................................................................................. 45 3.2.2 L’algoritmo ........................................................................................................................ 47 3.2.3 Ottimizzazioni..................................................................................................................... 50 Ricalcolo zone modificate ......................................................................................................................50 Marcia Guidata ......................................................................................................................................50 Utilizzo della struttura di partizionamento...............................................................................................51 3.2.4 Modalità di calcolo della normale....................................................................................... 51 3.2.5 Rendering adattativo .......................................................................................................... 53 3.2.6 Requisiti di memoria........................................................................................................... 54 3.2.7 Considerazioni Finali ......................................................................................................... 54 Capitolo 4: Rendering in GPU ........................................................................................................... 55 4.1 CLASSIFICAZIONE DELLE MODERNE TECNICHE DI VISUALIZZAZIONE.............................................. 57 4.1.1 Campi vettoriali.................................................................................................................. 58 4.1.2 Simboli matematici ............................................................................................................. 59 4.1.3 Campi scalari 2D ............................................................................................................... 59 4.1.4 Campi scalari 3D ............................................................................................................... 60 4.2 TEORIA DEL RENDERING VOLUMETRICO ...................................................................................... 61 4.3 TECNICHE DI RENDERING VOLUMETRICO ..................................................................................... 63 4.3.1 Texture 3D ......................................................................................................................... 63 Definizione............................................................................................................................................63 Filtering.................................................................................................................................................64 Memoria................................................................................................................................................65 Applicazioni ..........................................................................................................................................65 4.3.2 Texture slices...................................................................................................................... 66 Texture Slices 2D...................................................................................................................................66 Texture Slices 3D...................................................................................................................................67 4.3.3 Pre integrated volume rendering......................................................................................... 69 4.3.4 GPU Raytraced volumetric Rendering ................................................................................ 71 Introduzione al raytracing.......................................................................................................................71 L’algoritmo............................................................................................................................................72 Problemi dello Step Vector.....................................................................................................................73 Raytracing con Transfer Function...........................................................................................................73 Raytracing ‘First Hit’ .............................................................................................................................74 Calcolo della normale.............................................................................................................................75 Migliorie ...............................................................................................................................................76 Z-Buffering............................................................................................................................................78 Capitolo 5: L’applicativo.................................................................. Errore. Il segnalibro non è definito. Capitolo 6: Appendice A .................................................................................................................... 91 6.1 TEST DI INTERSEZIONE SFERA-CUBO ........................................................................................... 91 6.2 FUNZIONE DI RISPOSTA................................................................................................................ 93 6.3 CALCOLO RAGGIO FUNZIONE DI INFLUENZA DEL MC.................................................................... 93 6.4 RICERCA DELL’OTTANTE GIUSTO DEL LOOSEOCTREE .................................................................... 94 6.5 CODICE DI CRAZIONE TEXTURE PRE-INTEGRATA ........................................................................... 95 6.6 DETTAGLI TECNICI SUL GPU RENDERING ATTUALE ...................................................................... 96 6.6.1 La pipeline ......................................................................................................................... 96 6.6.2 Vertex Program .................................................................................................................. 97 6.6.3 Pixel (o fragment) program................................................................................................. 99 6.6.4 Novità dei modelli VS e PS 3.0.......................................................................................... 101 Dichiarazioni Input/Output...................................................................................................................101 Predicazione ........................................................................................................................................102 Controllo di flusso statico e dinamico ...................................................................................................103 Altre novità..........................................................................................................................................105 Conclusioni ....................................................................................................................................... 106 Indice Figure Figura 1. Sistemi di riferimento .................................................................................................... 4 Figura 2. Il programma Paricle Juice ........................................................................................... 7 Figura 3. Un modello superficiale a particelle orientate [18]........................................................ 9 Figura 4. Rottura a trazione e a taglio simulati in MD [21]........................................................ 12 Figura 5. Potenziale LJ (rosso) and forza (blu) funzione della distanza (r). .............................. 13 Figura 6. Forze repulsive tra particelle....................................................................................... 15 Figura 7. Forze repulsive tra particelle....................................................................................... 18 Figura 8. Effetti del potenziale LJ sulle particelle ...................................................................... 18 Figura 9. Varie tipologie di impacchettamento [27] ................................................................... 22 Figura 10. Costruzione geometrica dell’impacchettamento ......................................................... 22 Figura 11. Impacchettamento esagonale centrato ...................................................................... 262 Figura 12. Una Bounding Volume Hierarchy e la sua rappresentazione ad albero..................... 26 Figura 13. Una Bounding Sphere ‘obesa’ su un oggetto lungo e stretto....................................... 27 Figura 14. La costruzione di uno Sphere Tree e ........................................................................... 30 Figura 15. La costruzione di un Octree ........................................................................................ 30 Figura 16. Comparazione tra un Octree standard ed un Loose Octree ....................................... 31 Figura 17. Fasi successive dello schema di propagazione della deformazione ............................. 32 Figura 18. Generazione di sample points (Monte Carlo) [31] ...................................................... 33 Figura 19. Un tool bidimensionale composto da sfere .................................................................. 34 Figura 20. Flood-Fill per riempire di particelle una forma chiusa............................................... 35 Figura 21. Grafico delle perfomance del sistema.......................................................................... 37 Figura 22. Flood-Fill per riempire di particelle una forma chiusa............................................... 39 Figura 23. Una metaball................................................................................................................ 41 Figura 24. Due Metaball ............................................................................................................... 41 Figura 25. Allontanamento delle metaball.................................................................................... 42 Figura 26. Variazione del fattore di iso-livello.............................................................................. 42 Figura 27. Metaball usando linee come primitive......................................................................... 42 Figura 28. Grafici sovrapposti delle funzioni D1,D2,D3,D4 ......................................................... 44 Figura 29. Ingrandimento di una cella di confine con Marching Square..................................... 45 Figura 30. L’approssimazione fatta dal Marching Square........................................................... 46 Figura 31. Tutti i possibili casi del marching square.................................................................... 47 Figura 32. Caso ambiguo di Marching Square............................................................................. 47 Figura 33. Casi ‘base’ dei Marching Cubes.................................................................................. 48 Figura 34. Metaball usando linee come primitive......................................................................... 49 Figura 35. Risoluzione casi ambigui Marching Cubes ................................................................. 49 Figura 36. Si cammina esaminando le celle di superficie contigue. .............................................. 50 Figura 37. Normale calcolata come risultante normali ai poligoni vicini..................................... 52 Figura 38. Rendering adattativo a diversi livelli di LOD ............................................................. 53 Figura 39. Rappresentazione di pezzi di una forma ai diversi livelli LOD .................................. 53 Figura 40. Curva del numero di transistor installati sulle GPU recenti....................................... 55 Figura 41. Confronto qualitativo tra performance GPU/CPU..................................................... 56 Figura 42. Il tipo di dati implica un determinato algoritmo [34].................................................. 57 Figura 43. Classificazione delle varie tipologie di rendering [34]................................................. 57 Figura 44. Visualizzazione di Campi vettoriali fluidodinamici e streaklines [34]........................ 58 Figura 45. Visualizzazione di un simbolo matematico [34] .......................................................... 59 Figura 46. Visualizzazione di un HeightField [34]........................................................................ 59 Figura 47. Campo scalare 3D ‘Voxel’ [38].................................................................................... 60 Figura 48. Filtri comunemente usati nella ricostruzione [38]...................................................... 61 Figura 49. Applicazione di una TF per evidenziare l’interno di una scansione[37]..................... 61 Figura 50. Integrale di Volume Rendering (parzialmente preso da [38]) .................................... 62 Figura 51. Comparazione tra una Texture 2D e una Texture 3D [42] ......................................... 63 Figura 52. Comparazione Filtering Anisotropico su Texture 2D e Texture 3D [42].................... 64 Figura 53. Composizione di ‘fette’ 2D (slice) per il rendering 3D [38]......................................... 66 Figura 54. Composizione di slice allineate all’oggetto [38]........................................................... 66 Figura 55. Problema del ‘cambio’ del set di slices [38]................................................................. 67 Figura 56. Blending di una slice intermedia interpolata tra due diverse slices [38]..................... 67 Figura 57. Slices Orientate alla camera [39]................................................................................. 68 Figura 58. A destra una singola slice. A sinistra una composizione di slice ................................. 68 Figura 59. Due Transfer Function diverse sulo stesso oggetto ..................................................... 69 Figura 60. Un raggio che passa attraverso due slice..................................................................... 70 Figura 61. Funzionamento basilare di un raytracer classico........................................................ 71 Figura 62. Cubo con vertici mappati sulla texture 3D.................................................................. 72 Figura 63. Lo step vector interpolato dal PS si ‘accorcia’ nei pixel centrali ................................ 73 Figura 64. Step successivi nel pixel shader per trovare la superficie ........................................... 74 Figura 65. Algoritmo approssimato per il calcolo della normale nel PS ...................................... 76 Figura 66. Caso ‘difficile’ da trattare nel calcolo della normale .................................................. 77 Figura 67. Un oggetto esterno dovrebbe ‘bloccare’ i raggi........................................................... 78 Figura 68. L’applicazione realizzata per questa tesi .................................................................... 79 Figura 69. La rappresentazione interna del blocco di materiale.................................................. 80 Figura 70. Un teschio proveniente da una scansione MRI ........................................................... 80 Figura 71. Modalità di deformazione 2D...................................................................................... 81 Figura 72. Stacchiamo un pezzo di materiale per usarlo come tool ......... Errore. Il segnalibro non è definito. Figura 73. Risultati della deformazione........................................................................................ 82 Figura 74. Seleziono particelle del tool ......................................................................................... 82 Figura 75. Le particelle vicine al tool rimangono ‘attaccate ........................................................ 83 Figura 76. Il blocco di materiale e la punta pronta per ‘incidere’ qualcosa ................................ 83 Figura 77. Trasciniamo la punta e incidiamo il materiale............................................................ 84 Figura 78. Continuiamo il percorso .............................................................................................. 84 Figura 79. Chiudiamo il percorso ................................................................................................. 85 Figura 80. Un blocco composto da poche particelle...................................................................... 85 Figura 81. Iniziamo a premere sul materiale. La superficie non si rompe................................... 86 Figura 82. La superficie si è rotta. ................................................................................................ 86 Figura 83. Il buco .......................................................................................................................... 87 Figura 84. Il buco visto da lontano................................................................................................ 87 Figura 85. Ecco la ‘vittima’ da rompere ....................................................................................... 88 Figura 86. La pallina tocca la superficie ....................................................................................... 88 Figura 87. La pallina entra nella superficie.................................................................................. 89 Figura 88. Oramai il danno è fatto................................................................................................ 89 Figura 89. Alcune immagini random ............................................................................................ 90 Figura 90. Trasformazioni geometriche nel Test AABB-Sfera .................................................... 92 Figura 91. Numerazione dei nodi figli dell’octree......................................................................... 94 Figura 92. Diagramma schematico di una Pipeline di GPU moderna.......................................... 96 Figura 93. Il Vertex Program all’internod della pipeline ............................................................. 97 Figura 94. Comunicazione unidirezionale da CPU a GPU........................................................... 99 Figura 95. Posizionamento del Pixel Program nella Pipeline ....................................................... 99 Figura 96. Rasterizing di un triangolo........................................................................................ 100 Figura 97. Il Pixel Program viene applicato ad ogni pixel disegnato ......................................... 100 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ Capitolo 1: Introduzione Nel campo della Computer Graphics (CG), la modellazione della forma di oggetti con proprietà tipiche dei solidi deformabili è un campo di ricerca molto attivo ed aperto. Lo scopo finale di tale ricerca è quello di creare delle tecniche di modellazione di forme che potrebbero essere utilizzate nei campi più disparati. Le applicazioni nei campi dell’istruzione, arte, entertainment, realtà virtuale sono immediate, ma anche il campo del disegno industriale potrebbe beneficiare di tali strumenti. Molti designer e artisti preferiscono provare le loro idee in forma “reale”, con carta e penna oppure utilizzando materiale deformabile tipo argilla, invece di farlo direttamente su un computer. Allo stato attuale non esistono tecniche di modellazione volumetrica real-time del tutto generali e convincenti. Questo lavoro di tesi si propone di descrivere un nuovo modello basato sulla modellazione di particelle, che permetta di deformare interattivamente dei materiali, usando come primitive delle sferette di raggio unitario. Tale sistema è stato implementato praticamente e può essere facilmente utilizzato da utenti non esperti per deformare blocchi di materiale virtuali con un certo grado di realismo, su un normale PC. Il rendering viene effettuato al momento utilizzando una versione ottimizzata del famoso algoritmo di Marching Cubes (MC), che sfrutta le informazioni di partizionamento spaziale del simulatore. I risultati sono molto incoraggianti: le performance sono ampiamente sopra la soglia minima del real-time e la sensazione di manipolare materiale deformabile è fortemente presente. 1.1 Real-Time Virtual Sculpturing Il termine “virtual sculpturing” (VS) indica quel settore della modellazione volumetrica CAD che simula il processo di interazione tra un utente ed un blocco di materiale “virtuale”. Il termine “real-time” (in tempo reale) invece vuole sottolineare la scelta di base che è stata fatta. La scelta è stata quella di ipotizzare un sistema che fosse realizzabile praticamente sfruttando le tecnologie odierne, sfruttando l’odierna potenzialità di computazione dei normali PC. ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 1 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ 1.1.1 Classificazione Il campo della modellazione volumetrica in tempo reale è in una fase di costante crescita, in svariate direzioni. I diversi “filoni” di ricerca che sono nati vengono portati avanti parallelamente, e molto spesso è possibile assistere a degli scambi proficui tra di essi. Le varie tecniche di VS possono essere classificate in base a quattro attributi principali: modelli basati sulla fisica, modelli semplificati, volumetrici e di superfici. Ognuno di questi può essere simulato in modi diversi, ma la gran parte di essi utilizza sistemi particellari (approccio Lagrangiano) o griglie di densità di una qualche sostanza (approccio Euleriano). Esistono modelli fisici superficiali, modelli fisici volumetrici, ma anche modelli semplificati volumetrici o superficiali. Esistono addirittura modelli che sono contemporaneamente volumetrici e superficiali ma basati sulla fisica reale, come ad esempio [18]. Se si concentra l’attenzione sul real-time, le tecniche di modellazione volumetrica sono più intuitive di quelle superficiali, ma fortemente limitate dalle potenzialità dei moderni calcolatori, sia in termini di memoria che di tempo computazionale. La complessità degli algoritmi associati a tali tecniche spesso esplode in modo incontrollabile. Di seguito verranno brevemente esposti i principali ‘filoni’ di ricerca che sono presenti in letteratura, indicando in quale di essi intende collocarsi questo lavoro. Modelli superficiali I modelli basati su superfici poligonali ([10][11][12][13]) sono facili da implementare e molto veloci, ma richiedono trucchi complessi per assicurare la possibilità di eseguire grandi deformazioni. La gran parte di questi modelli non assicura la conservazione del materiale., anche se esistono alcuni modelli [19] che sfruttano leggi fisiche, ad esempio l’equazione dei gas perfetti per ovviare a questo inconveniente. I modelli superficiali vengono spesso accoppiati anche con lo splatting [20] quando si utilizzano particelle orientate [18] Modelli volumetrici Le tecniche di modellazione volumetrica sono sicuramente le più intuitive, giacché l’utente può attualmente deformare il materiale come farebbe nel mondo reale, con vera ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 2 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ ‘creta’ o argilla e veri strumenti, per effettuare operazioni fisiche come premere, curvare e stirare il materiale.Esistono soluzioni che modellano materiali deformabili, materiali elastici ed anche modelli ibridi,attraverso dei ‘trucchi’ opinabili. Modelli Basati sulla fisica La ricerca corrente sui modelli phisically-based [7] si è evoluta nella creazione di grandi sistemi del tipo molla-smorzatore, da risolvere ad ogni frame. Questi sistemi sono molto costosi a livello computazionale, e spesso non è realistico poterli applicare in tempo reale. Questo problema aumenta ancor di più quando bisogna effettuare deformazioni che richiedono grandi cambiamenti topologici dell’oggetto in tempo reale. Tali deformazioni infatti richiederebbero il ricalcolo completo dei ‘collegamenti’ tra le ‘particelle’ che compongono il sistema. Modelli Semplificati Alcuni ricercatori [1][2][6] hanno deciso di abbandonare la correttezza fisica del modello, concentrando i loro sforzi nello sviluppo di approcci semplificati che possono effettivamente essere simulati in tempo reale. La maggior parte dei modelli volumetrici semplificati vengono definiti utilizzando campi scalari, che vengono salvati in una griglia o controllati attraverso primitive. La superficie di un oggetto è nella maggior parte dei casi una isosuperficie di questo campo, che gioca un ruolo simile alla densità di materiale. Questa rappresentazione è molto utile per operazioni di deformazione locale, come quelle descritte precedentemente,ma anche l’addizione di materiale risulta semplificata. Quest’ultima infatti viene effettuata semplicemente attraverso una modifica locale dei valori del campo. Queste rappresentazioni volumetriche quindi possono gestire qualunque tipo di deformazione che implichi cambiamenti di topologia senza il bisogno di codificare meccanismi specifici. Una soluzione utilizzando i cellular automata è stata proposta per calcolare le deformazioni locali su materiale di argilla virtuale. [3][4] Sistemi Particellari Gran parte dei modelli qui esposti utilizzano sistemi particellari. Essi sono trattati in maggior dettaglio nel prossimo paragrafo poiché sono la base del sistema simulativo realizzato. ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 3 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ 1.2 Sistemi particellari I sistemi particellari [18] sono formati da un insieme di masse puntiformi con delle forze ad essere associate che si muovono seguendo determinate leggi della fisica. La letteratura sull’argomento è vastissima e facilmente reperibile (Tonnesen 1991; Szeliski and Tonnesen 1992; Szeliski, Tonnesen and Terzopoulos, 1993; SZeliski, Tonnesen and Terzopoulos,1993) Figura 1. Ad ogni particella vengono Sistemi di riferimento assegnati un insieme di attributi, come massa,posizione,velocità e accelerazione, che ne descrivono lo stato. I potenziali sono generalmente utilizzati per generare forze che agiscano sulle particelle stesse, e successivamente il movimento viene imposto dalle leggi della fisica Newtoniana e cioè: (1) f i (t ) d v i (t ) = ; mi dt (2) v i (t ) = dx i (t ) ; dt Dove le fi sono le forze, le vi sono le velocità, le xi sono le posizioni e le mi sono le masse dell’i-esima particella. Partendo da determinate condizioni iniziali, questi sistemi possono essere simulati nel tempo integrando le equazioni del moto. A seconda delle forze applicate, questi sistemi possono modellare una verità di sistemi complessi, che si evolvono nel tempo. Questo è un approccio che potremmo definire “Lagrangiano” a differenza di quello euleriano dove lo stato del sistema è definito in punti fissi di una griglia. ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 4 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ Il sistema presentato in questa tesi è fondamentalmente Lagrangiano, ma la politica degli aggiornamenti considera, come vedremo più avanti, una serie di “celle” nello spazio in cui sono contenute delle particelle da aggiornare tutte contemporaneamente, nel quale si può leggere, forse con un po’ di forzatura, uno schema Euleriano. 1.2.1 Sistemi indipendenti e sistemi collegati Un’altra distinzione che si fa all’interno dei sistemi particellari è quella che li categorizza in base all’interazione tra le particelle. Un primo sistema è quello chiamato delle particelle indipendenti, dove le forze su ogni particella sono indipendenti dalle restanti particelle del sistema. Le particelle indipendenti hanno il vantaggio di poter essere trattate separatamente l’una dall’altra ma allo stesso tempo, mancando di informazioni topologiche si necessita di grandi numeri di essere per “riempire” tutto lo spazio rinchiuso da una determinata forma. Il secondo sistema è detto delle particelle collegate, dove ogni particella è collegata ad altre particelle attraverso dei connettori. Un sistema rigido di punti materiali cade ad esempio in questa categoria; i vincoli di rigidità assolvono alla funzione di “connettori” delle particelle. Ovviamente cambiando il tipo di connettore si possono simulare sistemi anche molto diversi dai corpi rigidi. Inserendo delle molle ad esempio come connettori, si possono simulare tessuti oppure solidi con proprietà elastiche. Questo sistema ha il vantaggio di avere una rappresentazione più compatta nello spazio, poiché per rinchiudere un volume è necessario definire e collegare solo le particelle “di superficie” o, più matematicamente, definite sulla frontiera del nostro oggetto stesso. 1.2.2 Sistemi particellari nel campo della fisica Nel campo della fisica i sistemi particellari sono stati usati per modellare una varietà di fenomeni, tra cui l’evoluzione delle galassie, il plasma, le proprietà dei campi magnetici, dei gas comprimibili, dei cambiamenti di fase della materia etc. In tutti questi sistemi ogni particella rappresenta un elemento primitivo del fenomeno che si sta studiando, ad esempio una stella o una molecola di gas o un elettrone. Il problema fondamentale di questi approcci è che le simulazioni richiedono delle interazioni complesse tra le particelle con alto grado di precisione numerica. Se poi si considera il fatto che per ottenere risultati degni di una certa validità scientifica, bisogna utilizzare numeri di particelle dell’ordine dei miliardi, si capisce come allo stesso ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 5 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ tempo questo potente approccio sia limitato dalle possibilità di calcolo e dalla memoria dei moderni elaboratori. E’ per questo motivo che in tutti i campi la ricerca si spinge nel cercare delle opportune ipotesi semplificative per evitare di risolvere tutte le possibili interazioni tra particelle e resto del sistema e tra le particelle stesse. Ad esempio nel campo dell’astrofisica (Hockey e Eastwoord, 1988, Hegie, 1987) per modellare l’evoluzione delle stelle ci si basò sulla densità dei corpi e sui campi gravitazionali. Ebbene, per modellare piccoli numeri di stelle, nell’ordine delle migliaia, il sistema poteva semplicemente considerare ogni particella una stella e calcolare le forze direttamente. Tale sistema è ovviamente di complessità O ( N 2 ) per N particelle. Per sistemi più grandi si tende ad organizzare tutto in “clusters”, in regioni di influenza, considerando ad esempio che le forze di attrazione tra corpi vanno quasi a zero dopo un determinato range, rendendo inutile l’interazione tra corpi lontani. La dinamica molecolare allo stesso modo distingue delle interazioni a piccola distanza, proporzionali ad r − n , modellando invece le forze a larga distanza come r − m . Allo stesso modo si simulano fenomeni di temperatura. Il concetto fondamentale alla base di tutti questi esempi è quello di eliminare le interazioni non necessarie oltre una certa distanza, ed è questo il ragionamento alla base del nostro schema di risoluzione delle equazioni, a livello della singola particella, con l’ambiente esterno. 1.2.3 Sistemi particellari in Computer Graphics Nella grafica al calcolatore, i sistemi particellari sono la norma per quanto riguarda la simulazione di fenomeni naturali visivamente complessi, quali ad esempio fumi, nuvole, fluidi ma anche nell’emulazione di solidi deformabili,elastici o rigidi. E’ da sottolineare che in questo campo ciò che conta è l’effetto visivo finale, e non l’accuratezza della simulazione come in campo scientifico. Questi sistemi sono in genere sistemi di particelle indipendenti, così come sono state definite precedentemente. Per creare effetti complessi, queste tecniche usano un gran numero di particelle che sono soggette a forze, come ad esempio la gravità, a collisioni col mondo esterno e a campi di forze esterne, quali ad esempio un vento e la turbolenza. Le particelle vengono create e distrutte nel tempo in base alle regole stabilite dal particolare fenomeno che si sta modellando. ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 6 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ Il Laureando ha avuto diverse esperienze riguardo i sistemi particellari in computer grafica, tanto da mettere a punto un programma che permette di controllare e cambiare in tempo reale una moltitudine di parametri che governano il sistema. La potenza del sistema deriva anche dal fatto che tali parametri possono anche essere funzioni del tempo, cioè è possibile “disegnarne” l’andamento con il mouse. Questo programma è stato già utilizzato per la realizzazione di effetti grafici in un prodotto multimediale commerciale attualmente in fase di sviluppo da parte di un azienda di Bari. Figura 2. Il programma Paricle Juice 1.3 Considerazioni E’ stato ideato in questa tesi un modello volumetrico particellare, non basato sulla fisica. Sono queste le condizioni necessarie che ne permettono una implementazione in real-time che sia rispondente alle finalità del lavoro stesso. L’utilizzo di un modello volumetrico, come sarà spiegato nel capitolo della simulazione, non impedirà di simulare effetti come quelli di tensione superficiali che in genere si ritiene simulabili solamente con modelli prettamente superficiali. ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 7 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ Capitolo 2: Simulazione La simulazione del sistema è effettuata attraverso un sistema particellare volumetrico. Di conseguenza è necessario definire quali primitive si intende utilizzare e quali siano le regole che governano il sistema stesso. Successivamente si vedrà come possano essere soddisfatte queste regole e quali sono gli schemi algoritmici che si possono implementare per accelerare i calcoli. Infine si descriverà il modello ideato per la gestione dei tool. 2.1 Primitive La scelta fondamentale che bisogna fare nel progettare un sistema particellare è quello di definire la o le primitive associate alle nostre particelle. Questa scelta è fondamentale perché molte delle proprietà del sistema,nonché la sua complessità, dipendono dalle proprietà delle singole particelle. Una prima distinzione può essere quella di scegliere particelle orientate oppure particelle normali. La configurazione geometrica di una particella normale nello spazio è definita semplicemente da una terna di valori che ne individua la posizione rispetto ad un fissato sistema di assi cartesiano. Questo genere di particelle può anche avere un volume, ma si ignora l’orientamento della superficie che lo racchiude. Tale superficie si muoverà nel tempo rimanendo sempre parallela a se stessa, ed è per questo che in genere le primitive utilizzate in questo caso hanno delle forti simmetrie si più assi. Le particelle orientate invece hanno bisogno anche di una terna di coseni direttori rispetto ad un sistema di riferimento, tale da fissarne l’orientamento nello spazio. Questo genere di particelle è in generale più costoso da utilizzare, in quanto bisogna tirare in gioco anche le equazioni di equilibrio a momento, considerando spesso le singole particelle come veri e propri corpi rigidi. Questo genere di particelle si può trovare in [18]. ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 8 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ Figura 3. Un modello superficiale a particelle orientate [18] Come si può vedere nella figura, nel paper citato si usano, nell’ambito del free-form modelling, dei dischi circolari orientati come primitive. Queste primitive devono essere tangenti ad altri dischi orientati (con un vincolo di attrazione che funge da connettore) e insieme quindi definiscono un volume racchiuso che rappresenta l’oggetto in questione. Nell’esempio possiamo vedere una sfera che viene trasformata in un toroide da due sfere rigide che fungono da “scalpello”. ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 9 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ Questo lavoro si propone di creare un sistema che funzioni in modo analogo a quello presentato, ma che sia molto più performante. Consultando la letteratura sull’argomento, in molti casi si può vedere come vengano usate le particelle orientate per definire delle superfici, ma in tutti questi lavori è presente il problema irrisolto della performance. Nessuno di essi riesce a gestire un numero elevato di particelle in tempo reale sfruttando la potenza attuale dei calcolatori. 2.1.1 Ellissoidi e sfere Tra le varie possibilità che sono state esplorate c’è stata quella di utilizzare delle primitive orientate, primi tra tutti gli ellissoidi. L’idea alla base era quella di poter orientare questi ellissoidi in modo da farli allineare lungo piani preferenziali che potessero definire una superficie, anziché riempire un volume. In questo frangente si è valutato cosa avrebbe comportato il fatto di utilizzare ellissoidi di raggi variabili al posto di utilizzare un raggio fisso. 2.1.2 Ellissoidi Il primo problema che si è posto, e che è risultato insormontabile visti i presupposti di funzionamento in real-time di questo lavoro, è stato quello dei test di intersezione ellissoide/ellissoide. Se entrambi gli ellissoidi fossero stati di raggi identici, sarebbe basta una semplice trasformazione di scala per portarli in uno spazio nel quale essi assumano la forma di circonferenze, delle quali è banale trovare l’intersezione. Il secondo problema, ancora più insormontabile del primo, consiste nel fatto che per lo schema del sistema particellare che si vuole progettare c’è bisogno di una informazione aggiuntiva nei test di intersezione, la distanza di penetrazione. Come in molti metodi Impulse-Based, nell’ambito della fisica dei rigidi al calcolatore, la conoscenza della distanza di penetrazione tra un timestep ed un altro permette una semplice risoluzione della funzione di risposta all’urto, se così lo vogliamo chiamare. Un test di distanza di penetrazione tra ellissoidi orientati a raggio variabile è troppo costoso per poter essere implementato su un gran numero di particelle in tempo reale, per tale motivo questa opzione è stata scartata. Una volta scartata l’idea di poter avere raggio variabile e di poter orientare gli ellissoidi, si è deciso di abbandonare questa strada perché non portava nessun vantaggio sostanziale in nessun ambito. ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 10 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ 2.1.3 Sfere La sfera è stata la seconda forma geometrica della quale sono state studiate le potenzialità. Il problema ancora una volta però, è quello di capire se ci siano dei reali vantaggi nell’utilizzo di un raggio variabile. Ancora una volta però si è dovuta constatare l’inutilità di tale caratteristica per il sistema ideato, che preferisce approssimare le forme con un grande numero di piccole particelle, nelle quali non sarebbe possibile notare le differenze di raggio tra una particella ed un’altra. Il test di distanza di penetrazione tra sfere di raggi unitari è oltremodo leggero sotto il profilo computazionale. 2.2 Regole del sistema Come è stato spiegato nella breve introduzione ai sistemi particellari, c’è bisogno di stabilire delle regole che governino il sistema ideato. Le regole consistono sostanzialmente in un insieme di equazioni da soddisfare. Queste equazioni, assieme ad i metodi di integrazione, devono però essere ben studiate, poiché è molto semplice portare il sistema in condizioni di “esplosione”, dove in sostanza il sistema perde di significato fisico a causa delle pesanti discrepanze della precisione limitata dei calcolatori. Analizziamo in dettaglio questi argomenti, partendo dalla dinamica molecolare, che ha studiato in dettaglio questi argomenti e le problematiche connesse. 2.2.1 Dinamica Molecolare La Dinamica Molecolare (MD) è la scienza che usa i computer per calcolare il moto delle singole molecole di un solido, liquido o gas nel tempo. Il moto dei singoli atomi dipende da certe forze che ogni atomo esercita sugli altri. Tali forze dipendono dall’energia potenziale, la quale a sua volta è funzione della distanza tra due atomi. Esistono diversi modelli che definiscono queste funzioni potenziali, ognuna con i suoi limiti,ma probabilmente la più diffusa è quella del potenziale di Lennard Jones LJ, detto anche potenziale “6-12”. Ad esempio in [21] si utilizza la formula di LJ per simulare le proprietà dei materiali elastici. In questa simulazione, che si avvicina concettualmente molto a quella proposta in questa tesi, è possibile vedere come questo genere di potenziale, nonostante le sue ipotesi semplificative, conserva a livello macroscopico delle proprietà tipiche dei materiali reali. Negli esperimenti effettuati infatti è possibile ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 11 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ applicare degli sforzi di trazione o taglio su una “provetta” fatta di queste molecole virtuali, e riscontrare successivamente il fenomeno della strizione con rottura per carico eccessivo e anche la rottura per sforzo di taglio. Figura 4. Rottura a trazione e a taglio simulati in MD [21] 2.2.2 Potenziale di Lennard-Jones (LJ) Il potenziale LJ [16] descrive l’interazione tra due molecole prive di carica o tra atomi. Questo potenziale è poco attrattivo quando le due molecole prive di carica o gli atomi si avvicinano da distanza, ma è fortemente repulsivo quando la loro distanza diventa minima. Il potenziale risultante è mostrato in figura. All’equilibrio il paio di atomi o molecole tende ad andare in separazione lungo il minimo del potenziale di LJ [17]. Il potenziale risultante da queste interazioni di attrazione e repulsione è descritto dalla seguente equazione: σ V ( r ) = 4 ε (3) ij r 12 6 σ − r Dove σ e ε sono I parametric specifici di LJ, caratterisciti del materiale. Il termine ~ 1 r 12 è dominante alle brevi distanze, e modella la repulsione tra atomi quando essi ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 12 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ vengono a trovarsi molto vicini. Il termine ~ 1 r 6 invece è il più forte alle grandi distanze, e costituisce la parte attrattiva dell’espressione. La forza di LJ tra le due molecole è quindi data dall’equazione: σ 12 σ 6 (4) Fij (r ) = −24ε 2 13 − 7 r r Figura 5. Potenziale LJ (rosso) and forza (blu) funzione della distanza (r). 2.2.3 Tensione superficiale Molti dei sistemi analizzati dalla letteratura fanno una distinzione tra forze di volume e forze di superficie. Questo viene fatto per definire matematicamente il concetto fisico di tensione superficiale. In letteratura sono presenti diversi modi per capire quali siano le particelle di confine, ma buona parte dei lavori converge quando si arriva al punto di come esse debbano essere trattate. Una volta individuate tali particelle infatti nella maggior parte dei casi si impongono dei connettori governati da equazioni di vario tipo, per lo più di tipo molla-smorzatore. Nel processo di risoluzione delle intersezioni dei tool con il materiale, si controlla che le deformazioni prodotte dagli spostamenti delle particelle non siano superiori ad una certa soglia, oltre la quale il connettore viene “rotto” e la particella inserita in una lista che raccoglie tutte quelle “da aggiornare”. Lo smorzatore assolve alla funzione di stabilizzare il sistema, soprattutto perché gli errori numerici del calcolatore nella risoluzione dell’equazione del connettore diventano molto grandi all’aumentare del numero di particelle se si vuole mantenere costante il ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 13 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ frame rate. Questo modo di considerare le particelle superficiali quindi presenta non pochi problemi per quanto riguarda le performance in un ambito real-time. In una prima formulazione di questo lavoro si è pensato di sfruttare le informazioni derivanti da una struttura dati particolari per capire velocemente quali fossero le particelle “superficiali”. Se si immagina di inserire tutto il sistema in una struttura dati, dove ogni particella è dotata di una “valenza” che rappresenta nel nostro caso il numero massimo di particelle tangenti a quella data (in analogia con la chimica), si può dire che una particella è di confine quando la sua valenza non è piena. Una volta individuate le particelle superficiali si sarebbero potute formulare delle equazioni da applicare solo in quel caso, per rendere più difficile l’operazione di “rottura” della superficie, simulando di fatto una tensione superficiale. L’analisi dei costi computazionale di questa operazione, associata al gravoso vincolo del real-time è risultata negativa, e quindi si è pensato che il potenziale LJ potesse assurgere anche alla funzione di creatore delle forze superficiali con opportune considerazioni. 2.2.4 Dalle forze agli spostamenti Gran parte della letteratura sul Virtual Sculpturing fa largo uso di equazioni differenziali del moto per la risoluzione del sistema ad ogni frame, aggiungendo problematiche enormi di complessità e stabilità numerica. Se si riflette un poco sulle modalità di modellazione plastica di blocchi di materiale virtuale argilloso, ci si rende conto di come questa sia in buona parte un insieme di azioni di tipo statico. In altre parole le azioni dinamiche che si instaurano tra gli elementi del sistema particellare hanno ben poco di dinamico, ma vengono tutte modellate per il raggiungimento di un quanto più celere possibile, stato di equilibrio. Ci si è chiesto a questo punto se fosse possibile tagliare in qualche modo parte delle equazioni del moto delle particelle, cercando esclusivamente di arrivare direttamente allo stato di equilibrio che soddisfi dei vincoli fondamentali di un sistema di modellazione di Virtual Sculpturing. I vincoli considerati sono stati: la conservazione del volume di materiale su cui si sta operando e la non compenetrazione del materiale con l’ambiente esterno in generale, e con i tool di modellazione in particolare. Entrambi questi vincoli non necessitano di nessuna informazione o risoluzione “dinamica” del sistema. ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 14 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ Si è pensato dunque di abbandonare la dinamica e provare a calcolare solo degli spostamenti funzione della distanza tra due particelle. Questi spostamenti però non vengono calcolati a caso, ma con una funzione di repulsione e attrazione modellata esattamente come quella di LJ. Figura 6. Forze repulsive tra particelle Nella figura possiamo vedere le particelle 1 e 2 che si intersecano,quindi bisogna imporre uno spostamento che le faccia allontanare, contemporaneamente però le particelle 1,2,3 e 4 devono attrarsi tra di loro vicine in un punto che è sostanzialmente il baricentro del sistema da esse formato. Un esempio così semplice probabilmente non rende evidente la complessità del problema. Sono molte le domande alle quali bisogna trovare risposta per poter praticamente implementare un sistema del genere. Ad esempio: § Come possiamo riuscire a soddisfare tutti i vincoli di non compenetrazione tra particelle e contemporaneamente “compattare” il blocco di materiale? § Come possiamo garantire la costanza del volume di materiale simulato? § Come possiamo soprattutto garantire questi vincoli con prestazioni real-time processando solo 2 particelle per volta? La risposta a questi quesiti è l’oggetto delle prossime due sezioni, che descrivono la ‘funzione di risposta’ ed il fondamentale approccio iterativo, con relativa metodologia di aggiornamento. . ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 15 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ 2.2.5 Funzione di risposta La funzione di risposta è definita come una funzione da R3 ad R3. (5) f (x) : ℜ 3 → ℜ 3 (6) x = C1-C2 La variabile in utilizzata è il vettore differenza tra i centri delle due particelle in considerazione. La funzione associa a questo vettore libero, un vettore applicato in C2. Questa funzione deve anche assicurarsi che la sua applicazione trasformi uno stato invalido di configurazione tra due particelle in uno stato valido, cioè uno stato di equilibrio. Questo stato di equilibrio però deve anche avere la proprietà di essere stabile, inteso non tanto nell’accezione classica di ritornare alla sua configurazione iniziale dopo un’azione di disturbo quanto nel senso di non innescare autonomamente fenomeni vibratori incontrollati che portino all’esplosione del sistema. L’equazione deve essere sostanzialmente stabilizzare il sistema, indipendentemente dalla configurazione alla quale viene applicata. Come vedremo avanti è possibile predisporre le particelle in uno stato di equilibrio stabile prima di iniziare la simulazione, stando attenti al cosiddetto “impacchettamento” iniziale, che sia costruito in modo da costituire stato di energia globale già minimo. La funzione di risposta è definita formalmente come: f (x) : ℜ 3 → ℜ 3 (7 ) f (x) = − k( x ) x x La funzione k(y) è la caratteristica del materiale. Come è ovvio dalla notazione, essa è una funzione scalare, che associa ad x un numero reale. In poche parole questa funzione indica quanto si debbano attrarre o respingere le due particelle. Precedentemente abbiamo analizzato la funzione di Lennard-Jones come una buona funzione con delle proprietà interessanti quindi ricordando che: (8) σ 12 σ 6 − FLJ (r ) = −24ε 2 r 13 r 7 Si definisce la k(y) come: ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 16 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ LJ ( y ) 2 σ 12 σ 6 a1 a 2 − = LJ ( y ) = 24ε 2 − 13 7 y y y13 y 7 k ( y) = (9) I primi test eseguiti in due dimensioni ci hanno subito mostrato come questa funzione faccia raggiungere rapidamente l’equilibrio ad un sistema di particelle sparse. La variabilità della risposta che si riesce ad avere variando a1 ed a2 è troppo poco controllabile, minime variazioni di uno dei due parametri causano esplosioni o implosioni anomale del materiale. Si è così deciso di discretizzare questa funzione e di approssimarla collegando i punti con delle rette. Successivamente è stato reso possibile modificare questi punti graficamente, alterando di fatto la funzione di risposta. Nei test fatti si è visto che variando di poco opportunamente questi punti si riusciva a simulare materiali con proprietà leggermente differenti tra loro. Ad esempio permettendo una piccola compenetrazione tra particelle, spostando il lato sinistro della funzione di LJ poco più a sinistra si notava che il materiale assorbiva le deformazioni imposte “comprimendosi” seppur di poco. Bisogna ora chiarire perché k(x) è stata definita come LJ(x)/2. Si è visto che per portare il sistema in equilibrio stabile entrambe le particelle che definiscono il vettore spostamento devono essere allontanate o avvicinate di una quantità uguale alla metà della funzione LJ per fare in modo che la distanza alla fine dell’applicazione della LJ sia esattamente quella prevista. Si sarebbe potuto anche suddividere lo spostamento in percentuali diverse tra le due particelle, per esempio spostando una del 20% della LJ e l’altra dell’80% della LJ, ma si è notato che questo è motivo di forte instabilità negli step successivi, poiché non garantisce l’equilibrio del tipo di “relaxation” spiegato nel prossimo paragrafo. ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 17 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ Figura 7. Forze repulsive tra particelle Da notare che la funzione di risposta ha il suo zero in 2r, che ovviamente è il caso nel quale le due palline sono tangenti. Come vedremo nei dettagli implementativi 6.2 per evitare che errori di precisione numerica portino due particelle a vibrare continuamente al di sopra e al disotto di questo zero, saranno imposte delle tolleranze al di sotto delle quali la funzione non verrà applicata. Praticamente l’effetto di questa funzione è quello di portare ad equilibrio dopo un certo numero di iterazioni, il sistema formato da due particelle. La figura di seguito esemplifica tale comportamento. Figura 8. Effetti del potenziale LJ sulle particelle La stabilità del sistema non dipende esclusivamente dalla funzione di risposta. Vedremo più avanti che un ruolo molto importante è tenuto dagli impacchettamenti iniziali, che minimizzano l’energia globale del materiale. ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 18 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ 2.3 Risoluzione iterativa dei vincoli. Relaxation Data la natura della simulazione, nella quale due particelle vengono prese e la loro interazione risolta per poi passare ad altre particelle, si capisce come non sia sufficiente all’equilibrio eseguire tale procedura per tutte le possibili coppie di particelle. Quando si risolve un vincolo tra due sferette, molto probabilmente le loro nuove posizioni avranno invalidato il rapporto con altre particelle, con le quali magari sono state già risolte. L’idea è quindi quella di ripetere iterativamente questa procedura “sperando” di convergere ad una soluzione di equilibrio globale generato a partire dall’equilibrio locale di ogni coppia di due particelle. Sebbene questa procedura possa sembrare alquanto empirica, la letteratura ci mostra che essa ha basi matematiche molto forti e giustificate. In [23] è presentato un metodo chiamato di “relaxation” (o di Jacobi o delle iterazioni di Gauss-Seidele in base a come lo si fa esattamente). In questo metodo si prova a risolvere un sistema con molte incognite, cercando di soddisfare consecutivamente i vari vincoli locali e iterando. Se le condizioni sono giuste, questa procedura convergerà ad una configurazione globale che soddisfa tutti i vincoli contemporaneamente. 2.3.1 Campi di utilizzo del “relaxation” L’approccio relaxation è utile in tutte quelle situazioni nelle quali diversi vincoli tra di loro inter-dipendenti devono essere soddisfati simultaneamente. Il numero di iterazioni necessarie dipende dalla natura del sistema fisico simulato. Questo sistema può anche essere reso adattivo, misurando lo scarto dall’ultima iterazione. Se si ferma l’iterazione prematuramente, il risultato potrebbe non essere propriamente valido, ma poiché la nostra risoluzione di vincoli partirà da uno stato che è “maggiormente equilibrato” rispetto al precedente, nelle iterazioni dei frame successivi della simulazione, continuerà a convergere partendo da tale stato. I metodi di relaxation sono in genere la norma per buona parte delle simulazioni nell’ambito della dinamica molecolare, in quanto non è possibile pretendere di risolvere simultaneamente con esattezza tutte le equazioni che legano migliaia o milioni di molecole nella simulazione di un gas, un liquido o un solido. Questi metodi sono inoltre utilizzati in computer grafica per la simulazione di tessuti, a volte in accoppiata con i metodi di integrazione Verlet che si sposano perfettamente con i sistemi particellari a vincoli fissi tra particelle. ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 19 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ 2.3.2 Metodi verlet I metodi Verlet danno una formulazione delle equazioni del moto dove la velocità è espressa implicitamente dallo scarto di posizione tra una iterazione e la precedente. In sostanza per capire l’idea alla base del metodo Verlet, si può considerare il semplice schema di integrazione di Eulero: x' = x + v ⋅ ∆ t (10) v ' = v + a ⋅ ∆t , dove ∆t è il time step, e a è l’accelerazione calcolata usando la legge di Newton f=ma (dove f è la risultante di tutte le forze esterne e interne al sistema applicate alla particella). Invece di “ricordare” la velocità e la posizione di ogni particella all’istante considerato, si può utilizzare la posizione corrente x e la precedente posizione x*. Se si tiene fisso il passo di integrazione, si ha allora: x' = 2x − x * + a ⋅ ∆t 2 (11) x * = x. Questo è quello che viene chiamato “Metodo di integrazione Verlet”, presente in molti lavori sperimentali sulle proprietà molecolari dei fluidi usando i potenziali di LennardJones (vedere ad esempio il documento originale di Verlet [25] per ulteriori informazioni). Questo metodo è decisamente stabile, poiché la velocità viene data implicitamente, e di conseguenza è più difficile per la posizione e la velocità perdere di sincronizzazione. Questo sistema si basa sul fatto che 2x-x*=x+(x-x*) e x-x* è un’approssimazione della velocità corrente (in realtà sarebbe la distanza percorsa dall’ultimo passo di integrazione). I risultati non sono sempre molto accurati, poiché è presente una intrinseca dissipazione di energia, ma lo schema di integrazione è veloce e stabile. Se si diminuisce il coefficiente 2, ad esempio ponendolo ad esempio a 2-ε con ε>0 e ε<0,1 si può introdurre un leggero smorzamento sul sistema. Questo metodo è stato anche usato nel campo dell’entertainment per simulare corpi rigidi vincolati utilizzati come bambole di pezza (rag-doll) per i personaggi di un noto videogioco [24]. Questo lavoro non ha utilizzato i metodi Verlet per la scelta iniziale di trascurare l’aspetto dinamico della situazione, ma sono in corso esperimenti per valutare se sia possibile abilitarlo o disabilitarlo a quando se ne ha necessità. ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 20 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ 2.4 Impacchettamento Se si considera il potenziale di Lennard-Jones, definito in termini di distanza euclidea da una partice, è una funzione di energia potenziale simmetrica nello spazio. Questo vuol dire che prese due particelle i e j, l’insieme degli stati a minima energia (che nel nostro sistema sono posizioni) per una particella j relativa a i p il luogo dei punto che forma una sfera centrata sul centro della particella i. Quando le forze esterne sono trascurabili, le particelle si organizzano in strutture fortemente impacchettate, per minimizzare la loro energia totale. E’ stata proprio questa l’intuizione che ha permesso al simulatore di particelle realizzato di partire già da una condizione di equilibrio stabile, senza aspettare lunghi periodi prima di potervi pervenire. Per funzioni energetiche potenziali che presentano simmetria circolare in 2D, come il potenziale LJ, le particelle si dispongono in gruppi esagonali. In 3D invece si dispongono lungo livelli successivi di piani 2D, ognuno dei quali presenta un ordinamento esagonale, rendendo di fatto il potenziale LJ ottima per la modellazione di volumi di materiale. 2.4.1 Densità Il denso impacchettamento delle particelle pone immediatamente una questione, e cioè quante particelle saranno necessarie per riempire un dato volume La risposta a questo quesito è di grande aiuto per capire l’efficienza di una tecnica di ricerca delle particelle “vicine” ad una data. Possiamo riformulare la domanda chiedendoci quante sfere di eguale dimensione saranno necessarie per riempire un dato volume. Il fattore di impacchettamento volumetrico è definito come il rapporto del numero di atomi presenti in un volume unitario. Per un dato impacchettamento questo è equivalente al rapporto del volume di una sfera alla regione associata del diagramma di Voronoi tridimensionale, dove però il diagramma di Voronoi è calcolato sui centri delle sfere.Consultando [27] e alcuni libri di tecnologia dei materiali si è potuto calcolare la densità degli impacchettamento scelti ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 21 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ 2.4.2 Impacchettamenti CFC e Esagonale Figura 9. Varie tipologie di impacchettamento [27] Per capire come funziona questo particolare tipo di impacchettamento, si immagini di disporre 6 sfere come in figura per formare un triangolo equilatero, e successivamente si piazzi un’altra sfera sopra questo livello per creare una primaide triangolare. Ora se immaginiamo di creare un altro gruppo di sette sfere, e piazziamo le due piramidi in modo tale da farle affacciare in direzioni opposte, ci rendiamo conto di aver costruito un cubo. Collegando i centri di queste 14 sfere si ottiene quella che viene chiamata stella octangula. Figura 10. Costruzione geometrica dell’impacchettamento Considerando il cubo definito dai centri delle 14 sfere, questa cella “unitaria” contiene otto ottavi di sfere (uno per ogni verice del cubo) e sei emisferi. Il volume totale di sfere nella cella unitaria è quindi: (12) 1 4π 3 4π 3 16 3 1 Vsfere / cella = 8 ⋅ + 6 ⋅ r = 4⋅ r = πr 2 3 3 3 8 La diagonale della faccia è 4r cosi ogni lato è 2 2r . Il volume di tale cella è quindi: ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 22 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ (13) Vcella = (2 2r ) 3 = 16 2r 3 E quindi la densità di impacchettamento è: (14) 16 2 πr π 3 =0,74048 η cfc = = 3 3 2 16 2r La densità del CFC è uguale a quella dell’impacchettamento esagonale. Figura 11. Impacchettamento esagonale centrato Si dimostra che questi impacchettamenti sono quelli con la massima densità teoricamente possibile. 2.5 Strutture di partizionamento spaziale Come abbiamo precedentemente visto, la funzione di LJ che guida l’interazione tra le particelle va quasi a zero oltre un certo range. Per questo motivo si è pensato fosse completamente inutile formulare un approccio brute force, che eseguisse ad ogni iterazione l’intero step di relaxation su tutte le possibili coppie di particelle. A questo proposito si è pensato di inserire il sistema in una struttura di partizionamento spaziale che fosse la più efficiente possibile, considerando il tipo di primitive che stiamo utilizzando, e cioè delle sfere di raggio unitario. L’aspetto qui presentato è quello che ha subito le maggiori evoluzioni nella fase di progettazione del sistema stesso. Sono state provate diverse soluzioni che sembravano avere vantaggi teorici di performance ma che una volta implementate hanno mostrato subito grandi problemi. In generale però tutte le strutture esaminate appartengono alla categoria di strutture di partizionamento gerarchiche dove lo spazio è ricorsivamente partizionato in zone più piccole che sono contenute all’interno delle zone “generatrici”, le quali a loro volta sono contenute in altre zone ancora. Tali “zone” vengono chiamate con terminologia più tecnica Bounding Volumes (BV) [28] e sono i nodi della struttura ad albero. Questo genere di strutture ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 23 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ permette di scartare con pochi test geometrici, grosse porzioni di spazio dove non interessa eseguire l’aggiornamento. Tutte queste strutture sono inoltre conservative. Questo termine significa che alla domanda “quali sono le particelle che si trovano in questa determinato volume di test?” verranno sicuramente indicate tutte quelle che lo sono realmente, ma potranno essere indicate alcune particelle che sono esterne al volume di test. I parametri di performance fondamentali che sono stati presi in considerazione sono quindi la complessità computazionale, il numero di sfere riportate rapportato al numero di sfere che dovrebbero essere riportate e la memoria occupata dalla struttura, molto importante nel nostro caso di simulazione di milioni di particelle. Tutte questi vincoli devono essere rispettati tenendo bene a mente che non si sta trattando di oggetti statici, ma di migliaia di elementi dinamici che si muovono ad ogni iterazione. 2.5.1 Introduzione alle strutture di partizionamento In generale, una struttura dati di partizionamento organizza della geometria in uno spazio n-dimesionale. In generale ci si limita a casi bi- e tri-dimensionali, ma i concetti possono facilmente essere generalizzati per dimensioni arbitrarie. Queste strutture dati possono essere usate per accelerare dei test che vogliono sapere se determinate geometrie si sovrappongono. Questi test, chiamati in genere “query”, possono essere usati in una gran varietà di operazioni, come ad esempio algoritmi di culling oppure nei test di intersezione e raytracing o per il rilevamento delle collisioni. L’organizzazioni di strutture dati di partizionamento spaziali è genericamente gerarchica. Questo significa, in parole povere, che il livello superiore racchiude il livello sotto di esso, che racchiude a sua volta un ‘altro livello e così via. Quindi questa struttura è di tipo ricorsivo, come dicono gli informatici. La ragione principale per usare una gerarchia è che vari tipi di query vengono fortemente accelerate, da complessità di tipo O(n) a O(log n). E’ da sottolineare tra l’altro che la costruzione della maggior parte delle strutture dati di partizionamento è abbastanza costosa . equindi viene fatta prima di cominciare la simulazione vera e propria. Alcuni tipi di strutture di partizionamento sono le Bounding Volume Hierarchies (BVH s) , gli alberi Binary Space Partition (BSP) e gli octrees. Gli alberi BSP e gli octree sono strutture dati basate sulla suddivisione spaziale. Questo significa che l’intero spazio della scena è suddiviso e catturato nella struttura dati. Per esempio, l’unione dello spazio di tutti i nodi “finali” della struttura (in inglese leaf ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 24 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ nodes, cioè i nodi privi di figli) equivale all’intero spazio della scena. Questi nodi finali non si sovrappongono mai, ad eccezione dei loose octree che hanno delle proprietà molto interessanti però come analizzeremo in seguito. Le varianti dei BSP partizionano lo spazio in modo irregolare, a differenza degli octree e derivati, in cui lo spazio è suddiviso uniformemente. Anche se a volte può sembrare restrittiva, questa uniformità può essere fonte di efficienza computazionale. Una Bounding Volume Hierarchy invece,non è propriamente classificabile come una struttura di partizionamento spaziale. Piuttosto racchiude regioni dello spazio che circondano oggetti geometrici e quindi le BVHs non necessariamente racchiudono tutto lo spazio. 2.5.2 Bounding Volume Hierarchies Un Bounding volume (BV) è un volume che racchiude un insieme di oggetti. Il punto di forza di un BV consiste nel fatto che esso sia una forma geometricamente più semplice dell’oggetto contenuto, in modo tale che fare test su un BV può essere fatto più velocemente che usando gli ogetti da soli. Esempi di BV sono sfere, parallelepipedi allineati agli assi (Axis-Aligned Bounding Boxes AABBs), parallelepipedi orientati (Oriented Bounding Boxes OBBs) e k-DOP (k Discretely Oriented Polytope). Una BV è comunemente usata per velocizzare le query di intersezione. Quando si usa una BVH, la scena viene organizzata in un albero gerarchico, che consiste in un nodo radice, nodi interni e nodi finali (leaves). Questi nodi, come ogni albero, sono legati da relazioni di “parentela” del tipo padre/figlio. Il nodo radice è quello che non ha padre, ed è anche un nodo interno, tranne nel caso sia l’unico nodo nell’albero. Ogni nodo, e anche i nodi finali, nell’albero hanno un BV associato che racchiude la geometria dell’intero sotto-albero che diparte da esso. Questo significa che il nodo radice ha un VB che racchiude l’intera scena. Un esempio è mostrato in figura. ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 25 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ Figura 12. Una Bounding Volume Hierarchy e la sua rappresentazione ad albero La struttura sottostante della BVH è un albero, e nell’ambito dell’informatica la letteratura sulle strutture dati ad albero è vastissima. Qui verranno presentati solo alcuni risultati notevoli. Per maggiori informazioni si consulti ad esempio il libro Introduction to Algorithms [29] Si consideri un albero k-nario, cioè un albero dove ogni nodo interno ha k figli. In albero con solo un nodo (la radice) è detto a livello 0. Un nodo finale del nodo radice è al livello 1 e così via. Un albero bilanciato è un albero dove tutti i nodi sono al livello h o h-1. In generare il livell, h, di un albero bilanciato è logk n, dove n è il numero totale di nodi (interni e finali) dell’albero. Un albero si dice completo se tutti i nodi finali sono allo stesso livello h. Alcune proprietà degli alberi completi sono esposte di seguito. Il numero totale di nodi può essere calcolato come somma geometrica di: k h +1 − 1 n = k 0 + k 1 + ...k h −1 + k h = k −1 h Di conseguenza il numero di nodi finali, l è l=k , e il numero di nodi interni i è i = n-l = (15) k h −1 . Assumendo che sia noto saolametne il numero dei nodi finali, allora il numero k −1 totale dei nodi è n= i+l = kl − 1 . Per un albero binario, dove k=2, questo ci da n = 2l1. k −1 Da notare che un k più alto genera un albero con un minor numero di livelli, che significa si impiegherà meno tempo per percorrere l’albero,ma richiederà un maggior carico di lavoro ad ogni nodo. L’albero binario è in genere la scelta più semplice, e da ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 26 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ buone performance. Ad ogni modo per applicazioni specifiche si usano altri valori di k, in genere 2,4 e 8. Il BVH sono eccellenti per l’accelerazione di vari tipi di query e sono potenti anche in scene fortemente dinamiche. Se per esempio un oggetto contenuto in un VB si è mosso, basta controllare se esso è ancora contenuto nel suo BV padre. Se è così allora il VB è ancora valido, altrimenti il nodo che contiene quell’oggetto è rimosso, ed il BV del padre viene ricalcolato. Il nodo rimosso verrà successivamente reinserito ricorsivamente nell’albero partendo dal nodo radice. Un altro metodo è di far crescere il BV del nodo padre per mantenere i nodi figli al suo interno fino ad una certa soglia. Ad ogni modo, con entrambi questi metodi l’albero può diventare non bilanciato e inefficiente man mano che avvengono queste rimozioni ed inserzioni. 2.5.3 Sphere Tree Gli sphere tree, o più semplicemente alberi di sfere, sono una BVH il cui Bounding Volume è una sfera, come il nome stesso suggerisce. In letteratura sono disponibili i dettagli implementativi [30] e le possibilità ma anche le limitazioni di una struttura di questo tipo. Inizialmente si è provato ad implementare questa struttura poiché sembrava avere tutti i requisiti posti in fase di progetto. In primo luogo, considerando una sfera come Bounding Volume significa in generale sovrastimare l’effettivo volume occupato da oggetti lunghi e stretti (vedere la Figura 11). Figura 13. Una Bounding Sphere ‘obesa’ su un oggetto lungo e stretto ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 27 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ Questo non era un problema per il sistema ideato, dato che i nostri “oggetti” sono sfere di raggio unitario, cioè quanto di meglio si possa offrire in pasto ad un albero di sfere. Innanzitutto cerchiamo di capire come funziona lo sphere tree di fronte ad una moltitudine di oggetti in movimento. Quando una particella cambia posizione, si controlla se essa sia ancora contenuta nella sfera del nodo padre. In questo caso l’algoritmo si ferma subito, poiché la posizione del nodo associato al BV di quell’oggetto nell’albero è ancora valida. Per gli oggetti statici o che non si sono mossi (e nel nostro sistema è una condizione frequente), questa è addirittura l’unica operazione da eseguire per mantenere aggiornato l’albero, al di là dell’inserimento iniziale. Quando uno spostamento invece,fa in modo che il BV dell’oggetto in questione oltrepassi quello del suo BV padre,allora il nodo finale viene rimosso e reinserito nell’albero partendo dal nodo radice. In realtà per efficienze di implementazione, quando i nodi figli vengono staccati dai padri, vanno a finire in una coda di reintegrazione di tipo FIFO (First In First Out). Il padre è invece inserito in una coda di ricalcolo FIFO per mantenere bilanciato l’albero. Ad ogni step di simulazione, prima di eseguire le query, vengono svuotate queste code, reintegrando e ricalcolando il necessario in un unico loop. Un problema delle strutture di tipo quadtree od octree, come vedremo, consiste nel fatto che è possibile per un singolo nodo finale avere molteplici nodi padre. Se un oggetto attraversa un confine di nodo, necessiterà di essere rappresentato in tutti i nodi che ha “toccato”. Ebbene gli alberi di sfere non hanno questo problema, poiché nessun nodo finale può essere contenuto in più di una sfera padre. Qualunque proprietà di un nodo padre, ricade esattamente su tutti i nodi figli. Se ad esempio scopriamo che un determinato nodo padre non interseca un nostro volume di test, possiamo stare sicuri che anche i nodi figli del nodo padre non intersecheranno il volume. In figura possiamo vedere un esempio di questa tecnica in azione in un caso bidimensionale. Le circonferenze grandi e medie dal bordo sottile sono i nodi interni, il cui unico scopo è di contenere altri nodi. Le circonferenze piccole sono i nodi finali e rappresentano fisicamente gli oggetti di cui si sta tenendo traccia in questa struttura di partizionamento. La circonferenza di bordo spesso è quella di test. Come si può vedere si è prima cercato di capire quali fossero le circonferenze “grossolane”, di livello più basso,toccate da quella di test. Successivamente si è provveduto a vedere quali nodi figli ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 28 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ di questi grandi nodi intersecassero effettivamente la circonferenza di test, andando così via via fino ai nodi finali. Figura 14. La costruzione di uno Sphere Tree Una volta implementata questa struttura dati, si è avuta conferma delle buone prestazioni della struttura. L’unica pecca è forse l’elevato numero di test di intersezione, dovuta alla conservativa in senso stretto. Questa struttura infatti riporta solo i nodi che sono esattamente contenuti nel volume di test, piuttosto che riportare blocchi di nodi che “potrebbero” essere contenuti nel volume di test. Questo effetto potrebbe ovviamente ottenersi fermandosi a livelli fissati dell’albero invece di andare fino in profondità, ma in tal caso la forma “sovradimensionata” della sfera, rispetto al contenuto ritorna un numero di possibili oggetti intersecanti troppo alto. Si è provveduto quindi ad esplorare altre strutture di partizionamento. 2.5.4 Octree Un octree può essere definito come un albero BSP allineato agi assi.. Un cubo viene diviso simultaneamente lungo tutti e tre gli assi, con dei piani passanti per il centro del cubo. Questa procedura crea otto nuovi cubi, da cui il nome octree. Questa costruzione rendere la struttura regolare, ed alcune query possono diventare più efficienti grazie a questo fatto. Un octree è costruito racchiudendo l’intera scena nel più piccolo cubo allineato agli assi. Il resto della procedura è naturalmente ricorsiva, e si ferma quando si raggiunge un determinato criterio di stop. Questi criteri possono essere determinati da un numero massimo di livelli di ricorsione, oppure dal fatto che si vada sotto una determinata soglia di numero di primitive in un cubo. Se si ferma la ricorsione,l’algoritmo associa le primitive al cubo e termina la ricorsione, altrimenti suddivide il cubo lungo i suoi assi ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 29 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ coordinati, usando tre piani,e quindi formando otto cubi di eguale dimensione. Ogni cubo è testato e possibilmente suddiviso ancora in 2x2x2 cubi più piccoli. Figura 15. La costruzione di un Octree In figura si può vedere come funziona questa struttura in due dimensioni, con il nome di quadtree in questo caso caso. L’octree presenta notevoli vantaggi di velocità in tutte le operazioni, sia di aggiornamento sia di query di intersezioni e sembra il perfetto candidato per partizionare lo spazio della simulazione sin qui ideata. Purtroppo però, come si può vedere dalla figura, esistono oggetti completamente contenuti all’interno di un nodo finale ed oggetti, come la mela o la stella ad esempio, che appartengono a più di un nodo. Una soluzione a questo problema potrebbe esser quella di suddividere gli oggetti in questione, introducendo quindi un numero maggiore di primitive. Questa soluzione però non è praticabile per il sistema particellare ideato, in quanto la primitiva base, la sfera unitaria, è per noi unità indivisibile. Un’altra soluzione potrebbe invece essere quella di inserire praticamente questi oggetti in più di un nodo, ma ciò renderebbe difficoltose le operazioni di aggiornamento, in quanto si dovrebbe tener traccia di 8 ‘possibili’ nodi padre per ogni particella. Questo causerebbe problematiche di memoria e di cache miss in CPU enormi, poiché si dovrebbero inserire svariati test condizionali da eseguire su ogni particella. Pur sembrando questo un problema insormontabile, nel paragrafo successivo scopriremo che una semplice modifica di questa struttura riuscirà a soddisfare tutti i vincoli e le necessità del sistema particellare considerato. ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 30 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ 2.5.5 Loose Octree L’idea base dei loose octree [14] è la stessa degli octree ordinari, ma la scelta della dimensione del singolo cubo viene trattata differentemente. Se la dimensione del lato di un normale cubo è l, allora si usa kl con k > 1. Figura 16. Comparazione tra un Octree standard ed un Loose Octree Come si può vedere dalla figura, l’octree standard avrebbe dovuto inserire l’oggetto in nei due nodi “toccati”. Se invece allarghiamo ogni nodo di un fattore k opportuno, vediamo che l’oggetto è completamente contenuto in almeno un nodo, anche se ovviamente potrebbe anche essere contenuto in più di uno. In questo caso vediamo che l’oggetto è completamente contenuto nel nodo in alto a sinistra. E’ importante notare che i centri dei cubi sono gli stessi. Essendo ogni oggetto inserito in un solo nodo, l’eliminazione dall’octree è semplicissima. Alcuni vantaggi teorici ci sono usando k = 2. In primo luogo l’inserzione e l’eliminazione delgli oggetti è O(1), cioè costante. Questo perché la conoscenza della dimensione dell’oggetto significa conoscere immediatamente il livello dell’octree in cui può essere inserito, essendo completamente contenuto in un cubo loos. Il centroide dell’oggetto determina in quale cubo loose dell’octree esso debba essere messo. Vedremo nella Appendice A al paragrafo 6.4 dettagli di codice di queste operazioni. In poche parole si può sapere in quale “ottante” è andata a finire la nostra particella,esaminando i segni del vettore differenza tra il centro del nodo padre e la particella stessa. ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 31 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ Per via di queste proprietà dunque, questa struttura si presta molto bene a gestire oggetti dinamici, a costo ovviamente di una minima efficienza e la perdita di un rigoroso ordine quando si cammina l’albero. Inoltre se un oggetto si muove di poco da una iterazione alla successiva, il precedente cubo è in generale valido. Di conseguenza solo una frazione di oggetti nell’octree ha bisogno di essere aggiornata nel corso di un frame. 2.6 Politica degli aggiornamenti Quando il numero di particelle simulate cresce molto, diventa impossibile aggiornarle tutte ad ogni frame in tempo reale. Di conseguenza bisogna istituire una politica degli aggiornamenti, per aggiornare solo una porzione dell’intero volume. Gli step di simulazione non vengono quindi eseguiti ad ogni frame su tutte le particelle ma solo su alcune di esse. Queste considerazioni scaturiscono dall’osservazione del comportamento dei materiali clay-like: le maggiori deformazioni infatti sono localizzate “vicino” il tool. Inoltre nell’arco di pochi frames, gli strumenti spesso si spostano molto poco, se non rimangono addirittura fermi. La politica degli aggiornamenti è molto importante quindi per questa simulazione, ed è stata studiata per sfruttare le seguenti due considerazioni. Immaginiamo una situazione nella quale l’utente sta avvicinando alla superficie del materiale con uno strumento a forma di cubo. Figura 17. Fasi successive dello schema di propagazione della deformazione Lo schema di aggiornamento dovrebbe prima cercare di aggiornare le particelle “vicine” al tool, e poi “propagare” questi spostamenti alle altre particelle nella simulazione. Tra le varie strategie ideate quella che è risultata più efficace è stata quella alla “MonteCarlo”. ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 32 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ Figura 18. Generazione di sample points (Monte Carlo) [31] Il nome di questa tecnica prende spunto dalla teoria del calcolo delle probabilità, dove si usa il metodo di Monte-Carlo sfruttando il risultato notevole: (16) ∫ f ( x )dx=∫ f ( x) 1 N f ( x) p( x)dx ≈ ∑ p( x) N i =1 p( x) Con f(x) funzione generica e p(x) funzione densità di probabilità della variabile in considerazione. Questa tecnica viene utilizzate per eseguire una integrazione di una funzione definita su una sfera, prendendo dei punti non proprio completamente “a caso”, ma scalandoli di un certo fattore che da un peso minore ai punti che “più probabilmente” saranno scelti. Per scegliere questi punti casuali di integrazione, si genera una moltitudine di coppie di numeri casuali indipendenti, denotati come numeri casuali canonici ξ x ed ξ y entrambi appartenenti all’intervallo [0,1[ , che possiamo vedere nella figura [ref di figura] distribuiti in un quadrato. Successivamente questi numeri vengono “mappati” in coordinate sferiche usando la trasformazione: (17 ) (2 arccos( 1 − ξ x ),2πξ y ) → (ϑ , ϕ ) Ebbene in questo lavoro viene utilizzata questa distribuzione per generare dei punti casuali nei quali eseguire la nostra operazione di “integrazione” delle equazioni del moto delle singole particelle. Ovviamente non è una integrazione in senso stretto, matematico in quanto, come già detto precedentemente, sono stati abbandonati gli aspetti dinamici del problema. Utilizzando questo convergenza metodo però si è visto che il sistema tende rapidamente all’equilibrio, uniformemente in tutte le direzioni. Il sistema dunque funziona in questo modo: gli aggiornamenti seguono la superficie di una sfera di base centrata sul tool. Questa sfera ha un raggio chiamato ‘raggio di ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 33 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ espansione’ che aumenta fino ad arrivare ad un massimo per tornare poi a zero. Tale parametro è stato collegato al numero di iterazioni che viene eseguita ad un determinato livello. Questo vuol dire che le zone che sono più vicine al tool vengono aggiornate più frequentemente delle zone lontane. Il ragionamento ha perfettamente senso se si considera quanto detto precedentemente, e cioè che le deformazioni sono inizialmente ‘localizzate’ vicino al tool, e successivamente si propagano al resto del materiale. La propagazione ha sostanzialmente il compito di conservare del volume totale del materiale simulato. Il risultato finale è abbastanza piacevole, l’esperienza interattiva dell’utente risulta notevolmente migliorata. 2.7 Strumenti di modellazione Gli strumenti utilizzati per modellare il materiale deformabile che è stato messo a punto in questo lavoro possono essere di due tipi: a sfere o poligonali. 2.7.1 Strumenti composti di sfere Gli strumenti a sfere vengono creati approssimando la forma del ‘tool’ in considerazione con delle particelle. Tali particelle sono in tutto e per tutto uguali a quelle della simulazione, a parte un flag che le marca. Il risolutore iterativo provvede a considerare le particelle del tool come costitute da una massa infinita durante la risoluzione del vincolo. Questa fa sì che esse siano capaci solo di “spingere” altre particelle,ma non possano mai essere “spinte”. Figura 19. Un tool bidimensionale composto da sfere Questa formulazione dei tool è molto vantaggiosa in quanto evita di eseguire pesanti test di intersezione sfera/poligono, sostituendoli con semplici test sfera unitaria/sfera unitaria, che è il più semplice che si possa immaginare. Tra l’altro, poiché questo sistema riesce a simulare un discreto numero di particelle, l’approssimazione del tool ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 34 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ poligonale è “ben fatta”, nel senso che le impronte lasciate da questo tipo di tool sono quasi identiche a quelle dei tool poligonali. Rimane il problema di capire come si possa approssimare una forma arbitraria con un insieme di sfere. Innanzitutto se la forma che bisogna approssimare è una forma convessa chiusa, nulla è più facile poiché basta prendere il bounding volume che racchiude la forma, inserirlo in pezzo di materiale già impacchettato e scartare tutte le particelle che non sono contenute all’interno. Il test di contenimento all’interno per una forma convessa chiusa il test è semplicissimo,ma si utilizzerà quello descritto di seguito,valido per le forme concave chiuse e quindi anche per quelle convesse chiuse. Per le forme concave chiuse si potrebbero chiamare in causa diversi teoremi della geometria computazionale, ma una soluzione semplice potrebbe essere quella di utilizzare un algoritmo di flood-fill. In poche parole si parte da punto che si è certi sia all’interno della forma in questione e si creano altre sfere nelle tre direzioni cardinali, nonché nelle loro possibili combinazioni. Prima di creare fisicamente una nuova sfera però, si valuta se il segmento che va dal centro della sfera corrente, al centro della nuova sfera da creare oltrepassi un qualunque poligono dell’oggetto da approssimare. Figura 20. Flood-Fill per riempire di particelle una forma chiusa I test di intersezione raggio-poligono sono anche trattati nei paragrafi riguardante i dettagli implementativi. ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 35 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ Per le forme aperte purtroppo, data l’impossibilità di stabilire quale sia il “dentro” e quale sia il “fuori” non è possibile usare questi algoritmi. Si pensi al nodo di Moebius per esempio per il quale non è nemmeno possibile definire il concetto di normale uscente. Ebbene in questi casi l’unica possibilità potrebbe essere quella di fare un sampling dei triangoli del tool, ottenendo così dei punti sui quali poter piazzare le sfere. Con questo schema però risulta difficile garantire il perfetto impacchettamento delle particelle stesse. In realtà questo non dovrebbe essere un grosso problema per le particelle del tool in quanto esse non possono essere modificate dalla funzione di risposta, quindi non si hanno problemi di “vibrazione” attorno allo zero dell’energia poiché non si parte dallo stato di energia minimo. Il vero problema però è il fatto che questi tool siano “vuoti” al loro interno, e questo è un problema perché per la natura della simulazione, alcune particelle potrebbero “oltrepassare” la sottile superficie del tool e venir inglobate dal tool stesso, con un effetto totalmente irrealistico. Come ultimo aspetto si vuole sottolineare che è possibile inserire in questo contesto strumenti di tipo force feedback. Basterebbe accumulare la quantità di energia “assorbita” dal tool (semplicemente calcolando il lavoro virtuale dello spostamento impedito) e passarlo al device di Force Feedback. Allo stesso tempo è possibile ovviamente fare in modo che il tool sia comandato direttamente con le mani da un sistema di VR, e non attraverso l’innaturale mouse e tastiera. 2.7.2 Strumenti poligonali Gli strumenti poligonali, come indica il nome, sono delle mesh arbitrarie che possono essere modellate in un qualunque programma CAD o di grafica 3D in generale. Questi strumenti hanno il vantaggio di rappresentare con grande esattezza la forma del tool che si vuole utilizzare nella simulazione, ma allo stesso tempo lo svantaggio di dover eseguire dei pesanti test di intersezione con distanza di penetrazione di sfera con poligono. Da alcuni test svolti si è avuta la certezza che questa rappresentazione dei tool non da apprezzabili vantaggi nella modellazione di Virtual Sculpturing e allo stesso tempo causa una notevole perdita di performance. Per tali motivi questa soluzione è stata scartata. 2.7.3 Performance La dimensione del tool e la forma è molto importante per quanto riguarda le performance. Il raggio di espansione, descritto nel paragrafo sulla politica degli ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 36 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ aggiornamenti è proporzionale alla dimensione più grande dello strumento. Gli oggetti stretti ed allungati hanno prestazioni peggiori di quelli più ‘cubici’, a parità di nmero di particelle. Ovviamente seguendo questo ragionamento, gli strumenti piccoli sono più leggeri computazionalmente di quelli grossi. La misura del tempo di simulazione è molto difficoltosa, poiché dipende dalla forma del tool, dalla dimensione ma anche dalla velocità con la quale lo strumento stesso viene mosso dall’utente. Una maggior velocità di movimento dello strumento causa un numero maggiore di particelle toccate, e quindi un maggior numero di cicli della CPU che devono essere impiegati per aggiornarle. I tempi di simulazione per diversi numeri di particelle sono stati rilevati su un Athlon XP 2000+, utilizzando un tool a forma di cubo composto da 10*10*10 particelle. I risultati sono mostrati in tabella: N° of Particles Simulation time [ms] 60*60*60=216000 16 80*80*80=512000 34 100*100*100=1000000 54 I risultati sono molto interessanti poiché i tempi di simulazione sembrano essere quasi lineari col numero di particelle, e assolutamente accettabile anche per un milione di essere Figura 21. Grafico delle perfomance del sistema ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 37 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ Capitolo 3: Rendering in CPU Il rendering [28] è il più grande collo di bottiglia di tutto il sistema fin qui ideato. Il problema fondamentale è che la simulazione viene eseguita in CPU e indipendentemente dalla tecnica di rendering che si intende utilizzare ci si trova di fronte ad una quantità enorme di dati da passare dalla CPU all’acceleratore Video. Ovviamente questo problema deriva dall’architettura stessa dei PC che non è progettata per questo genere di applicazioni che sfruttano pesantemente la banda passante. Esistono altri tipi di architetture, come ad esempio quelle delle moderne console o dei sistemi SGI che utilizzano architetture memoria di tipo UMA (Unified Memory Architecture). In poche parole in queste architetture CPU e chip grafici possono leggere e scrivere nella stessa memoria, riducendo enormemente i tempi di latenza nel ‘passaggio’. Prima dell’avvento delle porte AGP sulle architetture PC, la situazione era drammatica, in quanto il bus PCI era insufficiente a far passare le decine di giga di dati per secondo che sono la norma per i rendering odierni. Giusto per fare un esempio di come sia possibile raggiungere queste moli di dati, facciamo un paio di conti approssimati. Questi conti ovviamente non tengono in considerazione fattori tipo il caching ed il DMA (direct memory access) che sono presenti nelle architetture moderne, ma ad ogni modo l’ordine di grandezza dei numeri che verranno presentati è corretta. Immaginiamo di scrivere un singolo pixel. Prima di scrivere il pxiel, b isogna leggere dallo Z-buffer il pixel stesso (ZR), e se il test viene passato, allora questa z deve essere riscritta nel buffer (ZW) e ovviamente anche il color buffer dovrebbe essere aggiornato (CW), ma per ora lo trascuriamo. Se si utilizzasse qualche forma di blending (come vedremo nella parte sui pixel shader) sarà necessario anche leggere dal color buffer (CR). Se immaginiamo poi che le nostre primitive abbiano una texture applicata per aumentarne il realismo, sono necessari uno o più letture da texture (TR). Immaginiamo il caso comune di due TR con trilinear mipmapping per pixel, con costo totale di 8 x 3 = 24 bytes. Immaginiamo anche che ZR,ZW,CW e CR usino 32 bits (cioè 4 bttres) di accesso in memoria. Un pixel quindi ‘costa’: ZR+ZW+CW+2TR= 60 bytes/pixel Sembrano pochi questi 60 bytes per un pixel, ma se si immagina un contesto reale, con 60 frame al secondo alla risoluzione di 1280 x 1024 abbiamo ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 38 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ 60x1280x1024x60 bytes/sec à4,5 Gbytes/s Questo conto ovviamente ha tenuto conto di scrivere ogni singolo pixel una sola volta. Questo ovviamente non è un caso realistico, in media si ha un fattore di depth complexity che è circa 4, quadruplicando il numero di tests. In questo contesto è ben poco quello che si può fare poiché l’ostacolo non può essere aggirato. Le due tipologie di rendering che è possibile utilizzare in questo campo sono due: il rendering poligonale e il rendering per pixel. 3.1 Introduzione La prima cosa da dire riguardo al rendering in CPU è che esso è sostanzialmente di tipo poligonale, in quanto genera delle primitive poligonali (in genere triangoli). Successivamente questi triangoli vengono mandati alla GPU per essere esclusivamente disegnati, magari con qualche effetto di illuminazione particolare come vedremo. Questa è stata la prima soluzione adottata nel rendering del sistema particellare descritto nel precedente capitolo poiché è più semplice da realizzare e ha permesso di vedere praticamente se i risultati della simulazione fossero coerenti con quanto previsto. Per capire come si sia potuto passare dalle singole particelle ai poligoni si osservi la seguente immagine. Figura 22. Flood-Fill per riempire di particelle una forma chiusa A destra vediamo le particelle disegnate nella loro consistenza di sfere a raggio unitario. Al centro e a sinistra vediamo invece la iso-superficie che esse generano. Questa isosuperficie è anche detta superficie implicita generata dalla funzione f, e sarà analizzata dal seguente paragrafo. ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 39 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ 3.1.1 Superfici Implicite La modellazione geometrica 3D classica si basa sulla combinazione di oggetti base, detti anche ‘primitive’, che possono essere ad esempio linee, piani, cubi etc. Esiste però una serie di oggetti curvi, magari deformabili che sono difficili o poco efficienti da rappresentare con queste primitive, anche utilizzando superfici parametriche come sfere o superfici tipo bezier/spline. E’ per questo motivo che sono stati inventati metodi per poter disegnare delle iso-superfici di funzioni scalari in 3D. Non è stato usato a caso il termine iso-superficie poiché si sta parlando di una funzione del tipo: f : ℜ3 → ℜ (18) f (x) = k dove f è un campo vettoriale, funzione di tutte le particelle. In generale la nostra funzione f sarà di questo tipo: (19) f (x) = n −1 ∑ D( x − c i ) i=0 D:ℜ → ℜ Ovviamente è la funzione D che fa da padrone in questa formula. Consideriamo una serie di possibili formulazione per la D. 3.1.2 Funzione D1 Si consideri la funzione: (20) D ( x) = 1 x2 E una griglia di punti di controllo nello spazio 3D. x è la distanza di un punto nello spazio da un particolare punto di controllo. Questi punti di controllo poi sono nel nostro caso specifico i centri delle sfere,ma per ora continuiamo a chiamarli così, in modo che il discorso sia più generale. Il campo totale generato dalla funzione f definita precedentemente, è la somma delle singole D calcolate su tutti i punti di controllo rispetto ad un fissato punto dello spazio. Ripetendo tale procedura per tutti i punti dello spazio riusciamo a definire il nostro campo vettoriale. ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 40 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ Se proviamo a disegnare f(x)=k con k un valore arbitrario otteniamo la isosuperficie. Proviamo a vedere cosa succede nel caso il numero di punti di controllo sia uguale ad uno: (21) f 1(x) = D ( x − c1 ) = 1 (x − c1 ) ⋅ (x − c1 ) Quindi f1(x)=k è il luogo dei punti il cui inverso della distanza al quadrato dal centro del punto di controllo è uguale a k, che è ovviamente una sfera. Immaginiamo per ora di “sapere” come si possa fare per disegnare i poligoni ‘giusti’ per approssimare questa superficie (lo vedremo nel paragrafo sull’algoritmo di Marching Cubes). Figura 23. Una metaball Proviamo ora a vedere cosa succede se abbiamo due punti di controllo distinti: (22) f 2(x) = D ( x − c1 ) + D ( x − c 2 ) = 1 1 + (x − c1 ) ⋅ (x − c1 ) (x − c 2 ) ⋅ (x − c 2 ) La nostra iso-superficie diventa di questo tipo: Figura 24. Due Metaball Questa superficie assomiglia abbastanza una ellissoide. Proviamo a variare la distanza tra i due punti di controllo: ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 41 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ Figura 25. Allontanamento delle metaball La forma che assume la iso-superficie proiettata su un piano ricorda molto le curve ad iso-potenziale in un campo elettrico generato da due cariche puntiformi. Proviamo a variare k, e quindi a cambiare il ‘livello’ di iso-superficie scelto, a parità di distanza: Figura 26. Variazione del fattore di iso-livello Come vediamo dalla figura, abbassando il fattore k diminuisce l’influenza ‘attrattiva’ tra le due particelle. E’ lecito immaginare quindi che non sia necessario calcolare l’interazione in ogni punto come somma dei contributi di tutte le particelle, ma basterà limitarsi solamente a quelle che sono più ‘vicine’ al punto considerato. In realtà noi abbiamo considerato solo il caso di oggetti puntiformi, ma è possibile generalizzare il concetto di distanza |x-c| con una distanza di x da un ente geometrico qualsiasi, ad esempio la distanza di un punto da un segmento, utilizzando note formule della geometria. In tal caso avremmo isosuperfici del tipo (per vari valori di k): Figura 27. Metaball usando linee come primitive ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 42 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ 3.1.3 Funzione D2 La funzione D2 è probabilmente una delle prime utilizzate, modellata dal famoso Jim Blinn (e da lui chiamata Blobby Function) sulle formule della densità di carica in elettromagnetismo: (23) D( x) = ae −bx 2 Il fattore ‘b’ è collegato alla deviazione standard della curva, e il fattore ‘a’ all’altezza. Questa funzione è riconoscibile come una curva gaussiana centrata all’origine (in realtà mezza curva in quanto per noi r>0). 3.1.4 Funzione D3 Uno dei problemi della funzione D2 delle consiste nel fatto che la funzione si estende all’infinito. Questo significa che per calcolare il campo in un punto dello spazio, bisogna eseguire la sommatoria di tutti i contributi delle primitive di controllo. Questo ovviamente diventa molto pesante a livello computazionale, al crescere del numero di primitive di controllo. Questa funzione non presenta questo problema in quanto è definita come: (24) 3x 2 a1 − 2 b 2 D ( x) = 3a 1 − x 2 b 0 0≤ x≤ b 3 b ≤ x≤b 3 b≤x Con ‘a’ fattore di scala, e ‘b’ la massima distanza oltre la quale una primitiva di controllo contribuisce al calcolo del campo 3.1.5 Funzione D4 Questa funzione è attribuita al lavoro dei fratelli Wyvill, ed è in pratica composta dai primi termini di una espansione di Taylor della funzione esponenziale, troncata per restringerla all’intervallo di influenza: ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 43 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ (25) 4 x 6 17 x 4 22 x 2 0 ≤ x ≤ b + − a1 − 2 4 D ( x) = 9b 6 9b 9b x>b 0 Il fattore ‘a’ scala la funzione, e il fattore ‘b’ come negli altri casi taglia l’influenza oltre una certa soglia. Questa funzione è più leggera delle metaballs perché usa solo potenze di 2 della distanza, e quindi non è necessario calcolare radici quadrate per ottenere la norma prima di elevarla ad una potenza arbitraria. 3.1.6 Funzioni a paragone Figura 28. Grafici sovrapposti delle funzioni D1,D2,D3,D4 Questo grafico ci mostra le diverse funzioni a paragone. Come vediamo a parte la 1/r^2 vanno tutte a zero oltre una certa soglia e quindi il loro calcolo può venir enormemente semplificato. La funzione utilizzata in questo lavoro è la D2. Essa è stata scelta poiché appartiene al gruppo di quello che è possibile “tagliare” oltre un certo range e poiché tende a ‘gonfiare’ molto di meno la zona compresa tra due control points. ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 44 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ 3.2 Marching Cubes L’algoritmo dei Marching Cubes (MC) è stato ideato con lo scopo approssimare la isosuperficie generata da una funzione implicita con dei poligoni. Il concetto di base dietro ai MC è di suddividere lo spazio in una griglia di piccoli cubi. L’algoritmo poi provvederà a ‘marciare’ attraverso questi cubi, controllando i vertici di tali cubi e sostituendo ai cubi stessi dei poligoni. L’insieme di tutti i poligoni generati sarà una superficie che approssima quella descritta dalla funzione stessa, calcolata però solo nei vertici di questa griglia regolare. I MC sono anche molto usati per la ricostruzione di superfici provenienti da scansioni volumetriche in ambito medico. Per esempio le scansioni MRI descrivono un volume 3D di campioni disposti sui vertici di una mesh regolare. Per capire meglio di cosa si tratta è forse meglio guardare al corrispondente algoritmo bidimensionale (che alcuni chiamano ‘marching squares’). 3.2.1 Marching Squares Figura 29. Ingrandimento di una cella di confine con Marching Square L’algoritmo dei marching-squares parte dal presupposto che sia possibile definire un “dentro” ed un “fuori” per la forma considerata da approssimare. Se la funzione è analitica, questo si fa semplicemente controllando che sia rispettivamente f(x)<k o f(x)>k. Successivamente si crea una griglia attorno alla forma stessa, dividendone i punti che cadono dentro alla forma dagli altri. Preso un singolo quadrato, sapendo quali vertici sono dentro e quali sono fuori è facile definire per quali lati passerà la linea ‘di ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 45 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ confine’ della forma. Se si prende in esame il quadrato in questione infatti: Figura 30. L’approssimazione fatta dal Marching Square Ci si rende facilmente conto che collegando tutti i lati del quadrato nei punti in cui la funzione va a zero, si ottiene una “approssimazione” del contorno ‘vero’ della funzione. Trovare i punti e ed f dove va a zero la funzione, può venir fatto calcolando analiticamente la derivata della funzione e ponendola a zero se e possibile farlo, oppure per interpolazione lineare (caso comune quando si deve approssimare un dataset che non ha rappresentazione analitica). In tal caso useremo una formula del tipo: P = P1 + (k − V1 )( P2 − P1 ) V2 − V1 Dove i vari Pi sono i punti nella griglia, i Vi sono i valori della funzione nella griglia e K è la costante della isosuperficie, la stessa usata per f(x)=k. Per far funzionare correttamente tutti i casi del Marching Cubes, è ora solo questione di enumerare correttamente tutti i possibili casi. In 2D abbiamo 24 possibili combinazioni poiché ogni vertice può avere due stati, dentro o fuori. Ecco le 16 combinazioni: ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 46 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ Figura 31. Tutti i possibili casi del marching square I casi 5 e 10 sono tratteggiati poiché appartengono alla categoria dei casi ambigui, basti guardare il seguente esempio: Figura 32. Caso ambiguo di Marching Square Ovviamente non si è in grado di dire quale delle due soluzioni sia ‘corretta’. Ovviamente in una situazione come questa la cosa migliore da fare è diminuire il ‘passo’ della maglia del marching squares. 3.2.2 L’algoritmo L’algoritmo vero e proprio dei marching cubes è la semplice trasposizione in 3D dei marching squares. In questo caso abbiamo però 28 possibili combinazioni, per un totale di 256. Considerando però simmetrie e rotazioni, ci si può ricondurre a 15 casi ‘base’. ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 47 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ Figura 33. Casi ‘base’ dei Marching Cubes Ovviamente anche in 3D esiste il problema dei casi ambigui, ed è possibile vederlo nella Figura 32. ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 48 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ Figura 34. Metaball usando linee come primitive Essi vengono però risolti aggiungendo famiglie addizionali di casi combinati: Figura 35. Risoluzione casi ambigui Marching Cubes ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 49 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ 3.2.3 Ottimizzazioni L’algoritmo dei marching cubes ‘standard’ non è molto veloce e vanno quindi adottati alcuni espedienti per poterlo utilizzare in real-time su un gran numero di sfere da tassellare. Si elencano di seguito le ottimizzazioni che sono state realmente implementate nell’applicativo a corredo di questa tesi. Ricalcolo zone modificate La parte simulativa del sistema particellare aggiorna ad ogni frame solo un piccolo subset dell’intero sistema. Di conseguenza non è necessario ricalcolare la funzione che definisce la iso-superficie su tutti i punti della griglia ogni volta, ma solo su quelli ‘vicini’ alle particelle spostate. Il valore effettivo da attribuire alla distanza limite oltre la quale si evita di aggiornare, dipende ovviamente dalla funzione utilizzata. Abbiamo visto per esempio che per la funzione D1 questa distanza è infinita, in quanto la funzione stessa tende asintoticamente a zero. Per altre funzioni fortunatamente non è così, ed è quindi stata impostata una procedura generica per il calcolo della zona di influenza. Marcia Guidata Jonsson [32] suggerisce un ottimo metodo per ottimizzare la ‘marcia’ dell’algoritmo. Figura 36. Si cammina esaminando le celle di superficie contigue. In sostanza suggerisce di partire da un punto di controllo, e sparare un raggio verso l’esterno fino ad incontrare la superficie. Una volta trovato un cubo di MC che contiene ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 50 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ un pezzo di superficie, si ‘cammina’ nelle direzioni che contengono altri pezzi di superficie. Ottenere questa informazione è banale perché si tratta semplicemente di una tabella che associa ad un particolare caso del MC le possibili direzioni sulle quali potrebbe continuare la superficie, che poi sono quelle su cui giacciono i lati dei triangoli del caso corrente. Utilizzo della struttura di partizionamento Il loose octree risulta ancora utile anche in fase di rendering. Infatti per calcolare la funzione di isosuperficie in una determinata ‘zona’, viene prima eseguita una query sul loose octree per ottenere solo le sfere ‘vicine’, che potrebbero dare una qualche influenza sul risultato finale. Questa è in assoluto l’ottimizzazione più pesante, dato che la gran parte del tempo CPU richiesto dall’algoritmo viene speso per calcolare la isofunzione nei punti di griglia. 3.2.4 Modalità di calcolo della normale Come si può vedere dal programma in azione, la normale viene calcolata in tre diversi modalità, ognuna con dei vantaggi e svantaggi propri. La modalità mesh-normals provvede a calcolare la normale in ogni vertice, prendendo la risultante delle normali di tutti i triangoli che lo condividono e normalizzandola. Ovviamente questa procedura non è matematicamente corretta, ma il risultato è indistinguibile dalle normali calcolate analiticamente per superfici con forme dolci ed arrotondate. In presenza di cuspidi o curvature molto strette questo metodo fallirebbe miseramente. Inoltre il vero problema di questa modalità esce fuori quando essa si accoppia con il ricalcolo della superficie soltanto nelle zone modificate consiste nel fatto che bisogna pre-allocare un vettore di possibili normali su tutti i punti della griglia. Nel paragrafo riguardante i requisiti di memoria ci si renderà conto che questo è un problema non da poco. ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 51 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ Figura 37. Normale calcolata come risultante normali ai poligoni vicini. In figura si vede come la normale al vertice evidenziato dal pallino è la risultante normalizzata (resa versore) delle normali di tutti i poligoni che in esso convergono. La modalità analitic normals invece calcola la normale differenziando la funzione f: f : ℜ3 → ℜ (26) f ( x) = n −1 f (x) = k ∑ D( x − c i ) D:ℜ → ℜ i =0 (27 ) ∂f ∂f ∂f ∇f (x) = , , ∂x ∂y ∂z n −1 n −1 n −1 ∂ D (y ) ∂ D(y ) ∂ D(y ) ∑ i ∑ i i n −1 ∑ i = 0 i = 0 = 0 i = ∇f (x) = ∇ ∑ D (y i ) = , , ∂ ∂ ∂ x y z i=0 n −1 n −1 n −1 ∑ ∂D(y i ) ∑ ∂D (y i ) ∑ ∂D(y i ) i =0 n −1 ∂D (y i ) ∂D(y i ) ∂D (y i ) n −1 , i=0 , i =0 , , , = ∑ ∇D (y i ) = ∑ ∂x ∂y ∂z ∂y ∂z i =0 i = 0 ∂x L’ultima modalità è quella delle flat normals che calcola la normale per ogni triangolo e quindi permette solo un rendering in flat shading, inaccettabile per un sistema di modellazione. ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 52 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ 3.2.5 Rendering adattativo Variando la densità della griglia si possono ottenere diverse approssimazioni della funzione di isospuerficie, ad esempio si consideri la seguente figura: Figura 38. Rendering adattativo a diversi livelli di LOD Il rendering adattativo consiste nel variare la risoluzione della griglia nelle zone a maggior curvatura, in modo da dare più dettaglio dove effettivamente ce n’è bisogno. In pratica questa approssimazione viene eseguita creando diverse griglie sovrapposte l’una all’altra dove il passo di ognuna è il doppio di quello della precedente. In questo modo si riesce a disegnare la isosuperficie prendendo i ‘pezzi’ approssimati nei vari livelli di griglia. Si usano multipli di 2 del passo di griglia in modo che sia facile gestire la giunzione tra ‘pezzi’ appartenenti a livelli diversi. Figura 39. Rappresentazione di pezzi di una forma ai diversi livelli LOD ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 53 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ 3.2.6 Requisiti di memoria I requisiti di memoria per la versione correntemente implementata nell’applicativo a corredo della tesi sono piuttosto elevati. Non poteva essere altrimenti dato che si salvano quasi tutti i risultati del MC per ogni cella, in modo da poter ‘recuperare’ al frame successivo i risultati precedenti. Calcoliamo i vari contributi e sommiamo: v1 = vettore della energia di griglia; v2 = vettore dei ‘possibili’ vertici e normali per un dato lato della griglia v1 = (n+1)^3 elementi di tipo float v2= (n*(n+1)^2)*6 elementi di tipo float (3 scalari per la posizione + 3 scalari per la normale) Ovviamente v2 va moltiplicato per 3 poiché ogni triangolo è composto da 3 vertici. Facendo un veloce calcolo considerando una griglia fatta di 100 posizioni e considerando un float fatto da 32 bit (4 byte) come è comune sui moderni PC: Memoria = 4*[(100+1)^3+3*(100*(100+1)^2)*6] = 77568404 bytes = 74 Mb Una dimensione poco più grande farebbe esplodere i requisiti di memoria necessari all’applicazione. 3.2.7 Considerazioni Finali I Marching cubes sono sicuramente la soluzione giusta per generare un rendering ‘ottimale’ che calcoli con precisione tutti i poligoni della isosuperficie. Purtroppo la natura stessa dell’algoritmo lo vede relegato sempre dal lato CPU. Tra l’altro le quantità enormi di triangoli passati via AGP dalla CPU causano degli stalli incredibili, e situazioni in cui la CPU è ferma poiché sta aspettando che la GPU si liberi per poterle mandare i nuovi triangoli. Il campo del rendering volumetrico va sicuramente approfondito con l’utilizzo delle nuove tecniche dal lato GPU. A tale proposito si vuole citare la nascita di siti dedicati all’utilizzo delle GPU consumer a basso costo, provenienti dal mercato dei videogames di ultima generazione, per scopi di visualizzazione puramente scientifici [33]. ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 54 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ Capitolo 4: Rendering in GPU Nell’ultimo quinquennio, l’avvento degli acceleratori 3D nel campo dell’entertainment ha avuto una notevole risonanza anche nel campo della visualizzazione scientifica. E’ possibile infatti oggi avere sul proprio PC a prezzi assolutamente abbordabili, tecnologie che fino a poco tempo fa erano relegate nelle mani dei pochi fortunati che avevano accesso alle costose workstation SGI o simili. E’ nata, ed è in costante evoluzione, una generazione di acceleratori hardware video che ha delle capacità di programmabilità incredibili. Non si parla più di pura potenza di calcolo, di ‘numero di triangoli per secondo’, o altre cifre prestazionali poco significative, quanto della possibilità di creare dei microprogrammi che vengono eseguiti in un ambiente dedicato, detto GPU. Questo termine sta per Graphical Processing Unit, ed è sostanzialmente una CPU specificamente studiata per risolvere problemi visualizzativi in tempo reale. Già da tempo le GPU hanno superato la complessità delle moderne CPU, tanto da avere un numero di transistor superiore a queste ultime. Figura 40. Curva del numero di transistor installati sulle GPU recenti. Inoltre l’evoluzione con la quale si stanno succedendo versioni sempre più evolute di questo hardware a basso costo permette ai ricercatori di non fossilizzarsi sull’utilizzo di una macchina costosa tipo workstation come in passato. Non è quindi più necessario spendere ingenti somme in questo ambito specifico della visualization technology, le moderne GPU assolvono egregiamente il questo compito. Peraltro in ambito ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 55 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ prettamente scientifico ci si sta orientando quasi ovunque a sfruttarne la potenza non più semplicemente aumentandone le frequenze di lavoro o il numero di transistor, ma facendole lavorare in parallelo attraverso cluster di PC. Figura 41. Confronto qualitativo tra performance GPU/CPU Le aziende che portano avanti la ricerca su questo tipo di hardware (al momento principalmente NVidia e ATI con PowerVR e Matrox con minore importanza) hanno a disposizione know-how e fondi enormi, derivanti dal mercato dell’entertainment per il quale producono la loro tecnologia. Fino a poco tempo fa queste aziende hanno avuto il ruolo di portare a basso costo tecnologie già ampiamente disponibili e documentate in ambito scientifico. Ultimamente però si sta avendo un’inversione di tendenza, dove è la ricerca nel campo dell’entertainment a ‘dare qualcosa’ al campo scientifico. Non a caso poi molti gruppi di ricerca universitari sono ‘gemellati’ con qualcuna in particolare delle aziende citate. Entrambe le parti hanno visto gli innumerevoli vantaggi di una tale collaborazione. Non sfruttare queste opportunità significa non essere al passo con i tempi. Prima di analizzare i dettagli tecnici, cerchiamo di capire quali sono e come sono classificate le molteplici tecniche di visualizzazione disponibili ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 56 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ 4.1 Classificazione delle moderne tecniche di visualizzazione Le classiche tecniche di visualizzazione non sono appropriate per visualizzare grandi dataset, dove per dataset si intendono moli enormi di dati provenienti da vari ambiti scientifici. Alcuni esempi [34] potrebbero essere le simulazioni al calcolatore nell’ambito della fisica, fluidodinamica, chimica etc., oppure da strumentazioni di misura. Queste ultime sono particolarmente importanti nel campo medico, sismico, satellitare ma anche prettamente meccanico. Ogni struttura implica un diverso approccio per la progettazione di algoritmi di visualizzazione. Figura 42. Il tipo di dati implica un determinato algoritmo [34] Le tecniche di visualizzazione avanzata possono essere suddivise in base al dominio di definizione ed al relativo condominio. Figura 43. Classificazione delle varie tipologie di rendering [34] ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 57 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ 4.1.1 Campi vettoriali I campi vettoriali invece possono rappresentarsi ‘sezionando’ il volume contenente il campo stesso, per poter visualizzare vari tipi di linee ‘interessanti’ per il ricercatore fluidodinamico, quali ad esempio le strikelines [34] o i flussi di vario tipo, sicuramente più interessanti nel campo dell’ingegneria meccanica. Lo scopo di queste tecniche però è puramente visualizzativo, non si pensa assolutamente di ricavare risultati numerici approssimati da questo genere di algoritmi, per i quali bisogna ripiegare ai sistemi classici basati su CPU e programmi simulativi in linguaggi tipo C o Fortran. Figura 44. Visualizzazione di Campi vettoriali fluidodinamici e streaklines [34] ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 58 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ 4.1.2 Simboli matematici Un’altra categoria di oggetti visualizzabili è quella di strumenti matematici quali tensori, quaternioni o altri simboli più o meno astratti. Figura 45. Visualizzazione di un simbolo matematico [34] 4.1.3 Campi scalari 2D E’ possibile disegnare campi scalari bidimensionali, f(x,y) = k, detti anche heightfields, colorando diversamente zone separate magari da curve di iso-livello. Figura 46. Visualizzazione di un HeightField [34] ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 59 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ 4.1.4 Campi scalari 3D Il caso proprio di questo tipo di simulazione sono i campo scalari tridimensionali, definiti, come già descritto nel capitolo di rendering poligonale, come f(x,y,z) oppure acquisiti da strumenti di misura sensibili a determinate grandezze fisiche rappresentabili come scalari definiti in ogni punto dello spazio, ottenuti per sampling o per ricostruzione. La terminologia utilizzata in questo caso è quella di ‘voxel’ [38] per indicare una singola cella della griglia tridimensionale. La griglia invece viene chiamata Texture 3D, che sarà formalizzata più avanti. Figura 47. Campo scalare 3D ‘Voxel’ [38] ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 60 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ 4.2 Teoria del Rendering Volumetrico Lo scopo del rendering volumetrico è quello di ricostruire graficamente un segnale proveniente da scansioni effettuate ad esempio con delle apparecchiature mediche attraverso convoluzione con filtri appropriati, oppure di rappresentare funzioni analitiche, come nel caso del virtual sculpturing, oggetto di questa tesi. Figura 48. Filtri comunemente usati nella ricostruzione [38] A differenza degli approcci poligonali, queste tecniche di rendering operano tutte in DVR (Direct Volume rendering), ovverosia senza estrarre superfici di alcun tipo [38] Quello che invece si fa è appunto mappare direttamente range di valori scalari con proprietà ottiche quali colore ed opacità, attraverso una funzione chiamata Transfer Function. [40]. In [37] possiamo vedere una trattazione delle transfer function anche multidimensionali, capaci di mostrare i risultati di diversi dataset acquisiti contemporaneamente Figura 49. Applicazione di una TF per evidenziare l’interno di una scansione[37] ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 61 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ Per ottenere il colore di un singolo pixel sullo schermo, si immagina di creare un raggio che parte dall’osservatore e attraversa tutto il volume del dataset in considerazione. Questo raggio prende i valori scalari che incontra sul suo percorso li trasforma con la funzione di trasferimento e li ‘compone’. La composizione, come vedremo potrà essere additiva ma anche di altri tipi. Se la composizione è additiva, questa operazione equivale a risolvere un integrale che viene appunto chiamato Volume Rendering Integral (equazione Figura 50. (28) ) [38] Integrale di Volume Rendering (parzialmente preso da [38]) Questo integrale è composto da due contributi. Il primo è quello che tiene in considerazione l’emissione iniziale, dipendente sostanzialmente dalle condizioni di illuminamento dell’ambiente virtuale nel quale si immagina di visualizzare il modello. Questa emissione perde intensità lungo il percorso del raggio a causa dello scattering ambientale. A questo contributo si ‘sovrappone’ quello specifico della tranfer function in questione. La I(s) rappresenta quindi la parte di ‘opacità’ della transfer function integrata lungo il percorso del raggio, alla quale va accoppiata ovviamente l’altra parte della transfer function che si occupa del ‘colore’. L’ultima cosa da notare è che per una data transfer function, questo integrale può essere precalcolato dal lato CPU ed inserito in una tabella di look-up, ovverosia una texture di dimensione pari a quella della transfer function. ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 62 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ 4.3 Tecniche di Rendering Volumetrico Si cercherà ora di spiegare come queste tecniche di rendering possano essere praticamente implementate in hardware [43]. E’ da dire che molte di queste tecniche sono nate nelle loro forme primitive già alla fine degli anni ’80 in campo medico, ma le implementazioni attuali differiscono lievemente dai modelli ‘base’ ideati circa 25 anni fa. Si introdurrà prima il concetto di texture tridimensionale, e successivamente le due famiglie di rendering volumetrico principali: le texture slices ed il raytracing. 4.3.1 Texture 3D Nonostante le texture tridimensionali [42] siano state implementate da circa un decennio nelle workstation High End, e da circa 3 anni nelle schede ‘consumer’, solo poche applicazioni sono state create per sfruttarle. La realtà è che il rendering volumetrico in tempo reale è ancora per larga parte una scienza che tenta di ‘incollare’ diverse immagini 2D su superfici 3D. I pixel program hanno finalmente dato la possibilità di implementare algoritmi grafici avanzati e le texture 3D sono un modo conciso di implementare tecniche che sarebbero assolutamente scomode o impossibili da programmare con texture 1D o 2D. Definizione Il modo più semplice per immaginare una texture 3D è una pila di texture 2D. Noi indicheremo con le lettere s, t, r e q le coordinate in larghezza,altezza,profondità e coordinate nello spazio di proiezione. Figura 51. Comparazione tra una Texture 2D e una Texture 3D [42] ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 63 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ Filtering Con l’aggiunta di una dimensione in più, la nomenclatura del filtering cambia leggermente. Per una texture 3D il semplice filtraggio lineare di un singolo divello della catena di mipmap è riferito come trilinear filtering, poiché esegue un filtraggio lineare su tutti i tre assi della texture, leggendo colori da otto diversi textel. In genere si è abituati a definire il trilinear filtering come diverse mipmap fuse insieme, ma non è il caso riguardante le texture 3D. Con le texture 3D ci si riferisce a questo caso con la terminologia di quadrilineaar filtering in quanto aggiunge un filtering lineare sulla quarta dimensione delle mipmap volumetriche, leggendo 16 diversi texel. Come suggerisce questo cambio di nomenclatura, il filtering diventa due volte più pesante quando si passa da texture 2D a texture 3D. Con le texture 2D, l’anisotropic filtering è pensato come un filtro su una linea lungo la texture con una larghezza di 2 e di lunghezza limitata solo dal massimo grado di anisotropia. Questo significa che il filtro anisotropico con il massimo livello (8) richiede 16 texel. In tre dimensioni, la linea diventa una ‘fetta’ con laghezza 2, che si estende in due dimensioni fino al massimo grado di anisotropia. Ora il caso peggiore per il livello massimo di anisotropia diventa 8*8*2=128 texel. Questo è pari a 32 volte il costo della semplice lettura bilineare di una texture 2D che la maggior parte dei programmatori considera come unità base delle performance delle texture. Figura 52. Comparazione Filtering Anisotropico su Texture 2D e Texture 3D [42] ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 64 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ Memoria Le texture tridimensionali crescono in modo estremamente rapido con l’aumento della risoluzione. Per esempio una texture 32bit di 256x256x256 occupa circa 64 mega di meoria video. Questo problema viene in genere aggirato tenendo il numero di canali per pixel al minimo. Se i dati da salvare in una texture 3D rappresentano quantità scalri coem densità o intesità, si provvederà a salvarla come canale di luminanza o alfa e non come una texture in RGBA. In secondo luogo le imperfezioni degli stili di compressione DXTC non sono un problema, le texture 3D possono essere compresse per salvare memoria. Applicazioni Nonostante i suoi costi di memoria, le texture 3D rendono semplici moltissimi compiti e possono frequentemente essere più efficienti dell’utilizzo di insiemi di texture 2D per implementare lo stesso algoritmo, come vedremo successivamente a riguardo delle texture slices. Tra l’altro i problemi citati sono destinati a diventare meno rilevanti col passare del tempo, come è già successo. La memoria sugli acceleratori grafici è raddoppiata di anno in anno, e il numero di letture da texture (texture fetch) per ciclo aumenta allo stesso modo sugli acceleratori di moderna generazione. La prima applicazione è quella che vede la texture 3D come una funzione di tre variabili indipendenti. Possiamo quindi rappresentare una funzione siffatta in una texture 3D, ottenendo automaticamente approssimazione lineare sui singoli punti di discretizzazione della griglia. La seconda applicazione, che poi è quella che interessa questo lavoro di tesi più da vicino, è quella di rappresentare direttamente campi scalari o vettoriali. Se il campo è scalare può bastare una 3D Texture con un solo canale, altrimenti si possono affiancare fino a 4 altri canali, inserendoli nelle componenti RGBA della texture stessa. Possiamo quindi rappresentare anche campi vettoriali a valori in R4 senza alcun problema. Si può dire che fu [44] a ipotizzare l’uso delle 3D texture nell’ambito della visualizzazione scientifica al posto della solita tecnica delle texture slice 2D utilizzata da tempo. Nel seguito vedremo due tecniche che usano le texture 3D nelle modalità ipotizzate da Drebin, ma con qualche piccola modifica dovuta all’architettura reale delle GPU correnti, diversa di quella ipotizzata nell’88 da Drebin stesso. ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 65 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ 4.3.2 Texture slices La tecnica delle texture slices [38] consiste nel disegnare delle ‘sezioni’ del dataset volumetrico utilizzando una geometria intermedia o ‘proxy’. Queste sezioni vengono combinate attraverso operazioni di alpha blending classico per poter ottenere le trasparenze volute dalla transfer function. Figura 53. Composizione di ‘fette’ 2D (slice) per il rendering 3D [38] Texture Slices 2D Nella tecnica delle texture slices 2D si prende il campo scalare e si creano 3 pile di ‘sezioni’ lungo gli assi coordinati. Ogni sezione viene rappresentata con una texture bidimensionale contenente i valori del campo. A seconda del punto di vista poi viene scelta la pila che ‘si allinea meglio’ con l’osservatore, ovverosia quella che espone più superficie verso la camera rispetto alle altre Figura 54. Composizione di slice allineate all’oggetto [38] Questa tecnica è semplice e veloce ma consuma molta memoria, in quanto bisogna tenere in memoria le varie sezioni. Tra l’altro essendo queste sezioni orientate con l’oggetto, è facile per l’osservatore incontrare bruschi cambiamenti di qualità del ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 66 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ rendering. Questi ‘scatti’ derivano dal fatto che in prossimità dei 45 gradi su uno dei 3 assi coordinati, si ha il ‘cambio’ di una pila con un’altra meglio allineate all’osservatore. Figura 55. Problema del ‘cambio’ del set di slices [38] Si può ovviare parzialmente a questo problema con l’utilizzo di schemi di cambio ad isteresi ma il problema fondamentale permane egualmente. La qualità del rendering non è eccezionale poiché la distanza di sampling non è costante per i raggi idealmente mandati dal punto di vista dell’osservatore. Un aumento della qualità si può avere ovviamente con l’aumento del numero di sezioni disegnate, ed è possibile farlo anche interpolando due slices vicine in alphablending. Figura 56. Blending di una slice intermedia interpolata tra due diverse slices [38] Texture Slices 3D Se si ha a disposizione dell’hardware capace di gestire le Texture 3D si può fare l’inverso di quanto si faceva nello slicing bidimensionale [39]. Si genera una sola pila di sezioni allineate con la camera, e la si ‘taglia’ (clipping) lungo la forma geometrica di contenimento scelta (in genere un cubo). ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 67 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ Figura 57. Slices Orientate alla camera [39]. Ogni sezione ha i vertici correttamente mappati direttamente sulla texture 3D e quindi provvederà automaticamente a visualizzare sulla sua superficie i giusti pixel presi dal dataset. Il compositing dei layer si fa esattamente come nello slicing 2D, anche qui per aumentare la qualità di rendering basta aumentare il numero di sezioni. Figura 58. A destra una singola slice. A sinistra una composizione di slice Se proviamo a giocare con la transfer function possiamo avere diversi output di rendering: ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 68 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ Figura 59. Due Transfer Function diverse sulo stesso oggetto Lo slicing 3D è più lento dello slicing bidimensionale, ma con l’hardware di ultimo grido questa differenza si va assottigliando. In compenso però si risparmia un notevole quantitativo di memoria, che può essere dedicata ad altri fini, principalmente quello di aumentare la risoluzione massima dei dataset gestibili. 4.3.3 Pre integrated volume rendering In [45] è presentate una interessante tecnica di accelerazione del rendering utilizzando le transfer function. Nel contesto delle textured slice questa tecnica richiede i pixel program, ma supporta a pieno anche transfer function di qualità nettamente superiore a quella derivante da una semplice composizione di sezioni, in particolare per transfer function con salti e cuspidi o picchi improvvisi. Il ‘rendering volumetrico pre-integrato’ riduce il numero di sezioni disegnando le ‘fette’ (slab) di volume tra di esse al posto delle slice stesse. Uno slab è quindi uno spazio tra due slice consecutive. Per un singolo pixel il problema si riduce al calcolo del contribuito di colore di un raggio tra due slices. ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 69 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ Figura 60. Un raggio che passa attraverso due slice Se si assume di usare l’interpolazione lineare dei dati all’interno del volume lungo questo raggio, il colore dipenderà solamente da tre numeri: dal valore sulla slice frontale (punto F della figura), dal valore della slice posteriore (al punto B) e dalla distanza tra le slice stesse. Se la distanza tra di esse p anche assunta costante, il colore del raggio dipenderà esclusivamente dai due valori del volume, e quindi una tabella di lookup bidimensionale è tutto il necessario per descrivere questa dipendenza. Nel contesto del GPU rendering, questa tabella è ovviamente implementata come una texture bidimensionale, o meglio una dependant texture per chi è a conoscenza dei dettagli tecnici del GPU rendering. Questa texture è generata come preprocesso calcolando l’integrale di rendering volumetrico della transfer function lungo un raggio che ha come punti inziali e finali (F e B) appartenenti a tutte le possibili coppie di slab. Questo precalcolo è appunto la ragione del nome pre-integrated volume rendering. Il corrispondente vertex program dovrà prendere il valore della volume texture sulla slice frontale e quello sulla slice successiva. Poi questi due valori sono usati come coordinate texture per indicizzare nella texture che funge da lookup dell’integrale precalcolato come appena descritto. Nell’appendice sulle implementazioni al paragrafo 0 sarà mostrato il codice pixel shader e quello necessario alla generazione della texture pre-integrata. Come si vedrà Esso è una semplice applicazione del VRI. ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 70 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ 4.3.4 GPU Raytraced volumetric Rendering Da quanto esposto sappiamo che è possibile rappresentare la nostra funzione f(x,y,z) con una texture 3D. Nell’ambito del volumetric rendering [39] però, bisogna cambiare il modo di considerare la funzione f. Ora infatti non si parla più di f(x,y,z) = k, ma di una f(x,y,z)<k che definisce lo spazio ‘racchiuso’ dalla nostra superficie. Questo spazio viene detto spazio pieno mentre il restante è chiamato spazio vuoto. L’algoritmo che verrà presentata fa uso di loop all’interno dei pixel shader, di istruzioni di controllo dinamico del flusso di esecuzione (IF,BREAK) e di numero illimitato di letture da texture, anche con coordinate generate nel pixelshader stesso (dependant read). Infine si utilizzeranno anche le chiamate di funzione. Prima di descrive l’algoritmo però si provvede a dare un brevissimo rinfresco sulla nozione di raytracing. Introduzione al raytracing Il ray-tracing [28] è una tecnica di rendering nella quale i raggi sono usati per determinare la visibilità dei vari elementi. Il meccanismo base è molto semplice, e infatti come vedremo è possibile implementarlo in hardware. Nei raytracer ‘classici’ i raggi sono ‘sparati’ dall’osservatore per ogni pixel del rettangolo che contiene la scena. Per ogni raggio, si trova il punto di intersezione più vicino all’osservatore stesso. Da qui si possono mandare altri raggi per ottenere ulteriori informazioni di shading su quel punto, applicando ad esempio le leggi della riflessione o della rifrazione in base alle caratteristiche del ‘materiale’ che compone la superficie alla quale esso appartiene. Figura 61. Funzionamento basilare di un raytracer classico ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 71 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ Come si può notare questa nozione di raytracing è applicata più a delle primitive poligonali o definire da equazioni parametriche. Nel nostro caso è la transfer function a prendere il sopravvento sulle leggi di riflessione o rifrazione, si potrebbero addirittura programmare due transfer function diverse per i raggi sparati in questi due casi. L’algoritmo L’algoritmo di base è molto semplice: 1. Si disegni un cubo che abbia gli otto vertici con coordinate texture 3D scelte in modo da mappare l’intero volume della texture stessa, cioè con un vertice a coordinate [0 0 0] e l’angolo opposto a coordinate [1 1 1]. Se il piano di clipping frontale della camera taglia il cubo, bisogna aggiungere dei poligoni di chiusura sul ‘buco’ creato. Figura 62. Cubo con vertici mappati sulla texture 3D 2. Nel vertex shader si emetta la coordinata texture 3D ed un vettore indicante la direzione del raggio che va dall’osservatore al vertice (step vector). 3. Nel pixel shader, cominciando alla coordinata texture data, si proceda per piccoli passi lungo questo raggio, entrando in sempre più in profondità nel volume. Ad ogni passo si legga il contenuto del volume. La lunghezza del vettore dalla camera al vertice, calcolata nel vertex shader, controlla direttamente la distanza camminata attraverso il volume ad ogni loop. Di conseguenza le volume texture contenenti piccoli oggetti avranno bisogno di essere disegnate con ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 72 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ lunghezze di questo vettore inferiori a quella di un voxel. Per esempio per una texture 100x100x100 è bene usare una lunghezza dello step vector pari a 100-1. Problemi dello Step Vector E’ da sottolineare che l’interpolazione fatta di questi vettori lungo il triangolo è lineare, di conseguenza i pixel che si trovano verso la zona centrale del poligono riceveranno degli step vector più corti del previsto. Figura 63. Lo step vector interpolato dal PS si ‘accorcia’ nei pixel centrali La soluzione ovviamente è quella di imporre la lunghezza di questo vettore nel pixel shader, prima normalizzandolo e poi scalandolo per la lunghezza effettivamente scelta. Raytracing con Transfer Function Questa tecnica è anche chiamata dei ‘voxel accumulati’ (accumulated voxels) riferendosi all’operazione di somma cumulata in cui si trasforma l’integrale di volume rendering successivamente alla sua discretizzazione.Il funzionamento di base è il seguente: 1. Man mano che il raggio attraversa il volume, si calcola un altro ‘pezzo’ dell’integrale di VR. 2. Se si è deciso di utilizzare un numero fissato di intervallini di integrazione da effettuare attraverso il volume, il loop non è più dinamico ma diventa statico, in quanto ha un numero fisso di iterazioni da compiere. Di conseguenza questo algoritmo potrebbe essere implementato anche con Shader Model 2.0, stando attenti però a fare in modo che i pixel del bordo texture siano ‘vuoti’, altrimenti si vedrà il material ‘stirato’ verso l’infinito. 3. Se il raggio viene fermato quando lascia il range texture [0..1], allora saranno effettuati meno letture da texture, ma non si potrà ovviamente utilizzare lo ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 73 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ shader mode 2.0 per questo scopo, a causa della mancanza di strutture di controllo dinamico. 4. Infine, se necessario, si può ridurre l’intensità del colore calcolato per un fattore costante su tutti i pixel. Questo fattore è costante e non calcolato sul singolo pixel per evitare la formazione di ‘bande’ di colore, tipiche delle procedure di discretizzazione. Uno pseudocodice che implemnta la procedura descritta sopre è riportato a seguire, dove la funzione VRI(s1,s2), che sta per Volume Rendering Integral, è stata già precalcolata e messa in una texture con la tecnica del pre-integrated volume rendering descritta precedentemente: p0 = v; //Posizione corrente sulla superficie finalColor = 0 while in [0…1] range p1 = p0+stepVector finalColor += VRI(p0,p1)*f(p0); p0=p1 Output finalColor Raytracing ‘First Hit’ Se nel rendering non si ha la necessità di dover visualizzare il dataset utilizzando le transfer function, l’algoritmo può essere velocizzato enormemente. Immaginando quindi a avere a che fare con delle celle ‘solide’ (solid voxel) della griglia 3D, il problema si riduce al solo avanzare attraverso il volume fino a quando non si trovi una cella piena. Questo quindi implica che il raggio termini quando lascia il volume o trova materia. Figura 64. Step successivi nel pixel shader per trovare la superficie ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 74 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ Abbiamo due possibilità ora per rappresentare la texture 3D nel caso specifico della simulazione presentata. La prima è quella di calcolare tutte le zone dentro/fuori in cpu e questo si fa facilmente senza costi addizionali rispetto a quello che già si fa. Per tenere in memoria una mappa del genere basterebbe 1 bit per pixel, che ci dica se il voxel in questione è pieno o vuoto, ma il minimo che possiamo avere sono gli 8 bit del formato LUMINANCE8. E’ possibile se lo si vuole ‘comprimere’ questa mappa di ‘opacità’ in una texture3D 8 bit, ma a costo di istruzioni aggiuntive per la decompressione nel pixel shader. La seconda possibilità è quella di passare semplicemente il campo scalare riportato al range 8 bit [0 – 255] e lasciar fare al pixel shader la comparazione f(x,y,z) < k per identificare i punti ‘solidi’ che interrompano il cammino del raggio. La differenza tra queste due soluzioni è il solito compromesso tra velocità di esecuzione e memoria utilizzata, dove il vantaggio dell’una implica uno svantaggio dell’altra. Sono in corso delle sperimentazioni per valutare l’alternativa più vantaggiosa per quanto riguarda il rendering specifico del sistema particellare descritto che si basa su questa tecnica. Calcolo della normale Finora forse non ci siamo resi conto di aver disegnato con gli algoritmi descritti, oggetti completamente opachi. Mancando informazioni sulla normale alla superficie nel punto disegnato ci si trova nell’impossibilità di eseguire un qualunque algoritmo di illuminazione, anche il più banale. Una soluzione potrebbe essere creare un’altra texture 3D contenente le normali per tutti i punti della griglia, calcolate in modi diversi a seconda di come è stata generata la texture 3D principale. Nel nostro caso dato che deriva da una funzione analitica nota, è possibile calcolare la normale differenziando la funzione stessa nel punto, come è stato ampiamente descritto nella sezione del rendering poligonale. Se invece non è possibile calcolare queste normali in modo ‘esatto’, oppure non si è disposti a spendere la memoria texture per la mappa delle normali, allora bisogna calcolare una normale per ogni pixel nel pixel shader. Questo è un problema non da poco e richiederebbe una descrizione approfondita, ma di seguito sarà descritta una tecnica che possa dare una buona approssimazione del calcolo della normale. Ad ogni modo è bene sapere che esistono metodi migliori per svolgere questo compito, con maggiore qualità visuale di rendering. Ad esempio si possono tracciare tre raggi per ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 75 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ pixel e calcolare il prodotto vettoriale dei punti di intersezione con il solido, ma è una procedura molto costosa in termini di calcolo e ricca di casi singolari da gestire. Una soluzione migliore è quella illustrata in figura, e di seguito descritta: Figura 65. Algoritmo approssimato per il calcolo della normale nel PS 1. Il punto di intersezione viene trovato con l’algoritmo descritto precedentemente 2. Si prende un numero di punti ‘campione’ su una sfera centrata attorno al punto. Per un risultato soddisfacente può bastare prendere otto punti di sampling ben disposti. 3. Si sommano gli offset vector, ovverosia i vettori che vanno dal punto di intersezione al punto campione (i vettori a,b,c, e di nella figura) che non toccano il solido e si normalizza il vettore risultante (N nel diagramma). I punti a,b,c etc., verranno di seguito chiamati punti di sampling per la ricerca della normale. Con la lettera N, ovviamente, si indica la normale approssimata cercata Migliorie I punti di sampling scelti per la generazione della normale possono essere ottimizzati per ottenere risultati migliori. 1. Gli offset vector utilizzati per scegliere i punti di sampling sulla sfera, possono essere salvati in costanti del pixel shader. Queste posizioni verranno salvate per un solo ottante della sfera, i restanti sette ottanti possono essere calcolati invertendo i segni degli offset vector su ogni asse coordinato. Di conseguenza tre offset vector, con segni cambiati applicati al punto di intersezione del raggio ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 76 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ con la superficie, danno coordinate per 24 possibili sample. In figura si vede l’analogo caso 2D, dove salvando due vettori di offset per quadrante avremmo un totale di 8 punti di sampling. 2. Si possono raggiungere risultati migliori effettuando il sampling da diverse sfere con raggi variabili. Ovviamente questo si fa facilmente variando la lunghezza degli offset vector. Bisogna però stare attenti ai possibili errori che si possono incontrare nell’utilizzo di questa tecnica. Si immagini ad esempio di avere una risoluzione come in figura: Figura 66. Caso ‘difficile’ da trattare nel calcolo della normale I punti di sampling 2,3,4,6,7 e 8 ci diranno di trovarsi nello spazio vuoto. La risultante di questi vettori ovviamente ci darà una normale di lunghezza zero. Per ovviare a questo problema,bisogna introdurre un ulteriore controllo: quando si calcola la normale bisogna tenere in considerazione solo i punti dove il prodotto scalare tra gli offset vector e lo step vector è negativo ( in figura ad esempio passerebbero questo test solo i punti 5,6,7 e 8). Questo controllo porta con se anche il positivo effetto di dimezzare il numero di letture da texture, che è un grandissimo vantaggio. Ad ogni modo si sta valutando se sia più conveniente precalcolare le normali in CPU e passarle alla GPU frame per frame poiché questa tecnica per il calcolo ‘al volo’ della normale è risultata abbastanza pesante dai test. ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 77 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ Z-Buffering Nel caso si utilizzino transfer function, e quindi si disegnino volumi ‘traslucenti’ nella scena, bisogna stare attenti a disegnarli dopo ogni altro oggetto. Nel caso specifico di questa tesi ad esempio bisogna effettuare il disegno sicuramente dopo i tool utilizzati dal simulatore. Figura 67. Un oggetto esterno dovrebbe ‘bloccare’ i raggi In figura si può notare come un raggio idealmente tracciato dalla faccia del volume di fronte all’osservatore, non debba terminare alla fine del volume,ma anche quando incontra un oggetto. Quindi se l’oggetto si muove gradualmente attraverso il volume, da dietro verso l’osservatore, l’intensità visibile di fronte all’oggetto non diminuirà dolcemente, bensì passera da una intensità piena a nessuna intensità. Per risolvere questo problema bisognerebbe avere conoscenza dei contenuti dello Z-Buffer, cosa possibile solamente tenendone una copia in una texture,aggiornata ogni frame. Quand’anche non si usassero transfer function, e quindi si abbia a che fare con voxel solidi provenienti da raytracing del tipo ‘first hit’, bisognerebbe che il pixel shader calcolasse anche il valore di profondità corretto (nel registro oDepth) all’interno del pixel shader stesso. Se è possibile evitare questa cosa, magari per gli oggetti solidi per i quali si è sicuri di non avere mai la possibilità di avere intersezioni con altri oggetti, questo non è necessario e va assolutamente evitato per questioni di performance. L’hardware 3D corrente infatti non gradisce molto che i pixel shader scrivano anche nello Z-Buffer, perché impediscono una serie di importantissime ottimizzazioni tra le quali citiamo solo lo Hierarchical Z-Buffer [46]. Ad ogni modo se c’è assolutamente bisogno di avere il valore corretto nello Z-Buffer non si può fare molto,bisogna scrivere il registro oDepth dal pixel shader, scrivendo la Z del punto di intersezione. E’ da notare che a differenza del rendering con transfer function, non è necessario avere il depth buffer anche in input al pixel shader per il rendering first hit. ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 78 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ Capitolo 5: Il Software Implementato Tutto il sistema qui presentato è stato implementato e testato in linguaggio C++ su un normale PC (AMD Athlon XP 2000+, ATI Radeon 9600 Pro, 512 Mb di RAM). Il compilatore utilizzato è il Visual C++ 6 della Microsoft insieme al kit di sviluppo delle DirectX 9, in modo da assicurare le migliori performance per il rendering sul target scelto. E’ stato programmato anche il manipolatore 3D visibile in quasi tutte le immagini, poiché DirectX, in quanto API a basso livello, ne è sprovvista. Per il futuro sono già previsti porting in ambienti VR Immersivi come quelli descritti in [51]. Le soluzioni presentate in questa tesi sono il risultato di un processo iterativo nel quale sono stati provate diverse strutture dati e schemi di aggiornamento. E’ stato speso anche del tempo con l’interfaccia visuale. E’ stato usato il framework wxWidgets per la creazione delle GUI (una libreria Open Source Multi-platform). Tra le caratteristiche interessanti dell’applicazione c’è quella di poter prototipare la funzione di risposta salvandola e leggendola da disco, molto utile in fase di sperimentazione. E’ possibile selezionare le varie modalità di calcolo della normale, decidere la costante k di isosuperficie, il numero di aggiornamenti per frame e creare tools di forme predefinite. Ecco uno screen -shot dell’applicazione: Figura 68. L’applicazione realizzata per questa tesi ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 79 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ Ecco visualizzata la rappresentazione interna del blocco così come essa è vista dal simulatore: Figura 69. La rappresentazione interna del blocco di materiale C’è la possibilità di caricare modelli provenienti da scansioni di vario genere. Di seguito ad esempio c’è la rappresentazione particellare di una scansione MRI di una testa umana: Figura 70. Un teschio proveniente da una scansione MRI ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 80 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ Esiste anche una modalità che riporta tutta la simulazione su un piano, modalità utilizzata in fase di prototipazione del sistema: Figura 71. Modalità di deformazione 2D E’ possibile ‘staccare’ un pezzo di materiale ed usarlo come tool: Figura 72. Materiale originario usato come tool Di seguito è possibile vedere le particelle dopo una deformazione applicata dal tool. C’e’ da dire che vedere in azione il programma è tutt’altra cosa, le immagini statiche ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 81 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ non rendono assolutamente l’idea di quello che sta succedendo. Nella seguente figura si può vedere la funzione di risposta utilizzata: Figura 73. Risultati della deformazione Ora per provare il funzionamento della parte ‘attrattiva’ della funzione LJ, si selezionino alcune particelle definendole come ‘tool’ e si provi a staccarle. Figura 74. Selezione delle particelle del tool Allontanando il tool lentamente, le particelle rimangono attaccate ad esso per effetto della funzione LJ: ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 82 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ Figura 75. Le particelle vicine al tool rimangono ‘attaccate’ grazie ad LJ Si crei un blocco di materiale per provare ad ‘incidere’ qualcosa su di esso. Da notare che questo è un tool fatto di sfere, come descritto nell’apposita sezione dedicata al paragrafo 2.7.1 . Figura 76. Il blocco di materiale e la punta pronta per ‘incidere’ qualcosa Si usi il tool trascinandolo per incidere il materiale: ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 83 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ Figura 77. Si trascini la punta e si incida il materiale Figura 78. Si continui il percorso ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 84 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ Figura 79. Si chiuda il percorso Per vedere bene come l’effetto di tensione superficiale sia presente grazie alla funzione LJ, creiamo un blocco compsto da relativamente poche particelle: Figura 80. Un blocco composto da poche particelle ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 85 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ Provando a spingere con il tool sul materiale si possono vedere gli effetti della ‘tensione superficiale’ imposta dalla funzione di LJ. La superficie non si ‘rompe’ subito, ma bisogna applicare una certa forza affinché questo avvenga: Figura 81. Iniziamo a premere sul materiale. La superficie non si rompe. Dopo aver premuto un po’, la superficie si rompe creando un buco nel materiale Figura 82. La superficie si è rotta. ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 86 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ Ecco il ‘foro’ creato: Figura 83. Figura 84. Il foro creato Il foro visto da lontano ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 87 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ Si provi a tirare una sfera sul materiale: Figura 85. Ecco la ‘vittima’ da rompere Figura 86. La pallina tocca la superficie ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 88 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ Figura 87. Figura 88. La pallina entra nella superficie Oramai il danno è fatto ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 89 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ Figura 89. Alcune immagini random ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 90 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ Capitolo 6: Appendice A In questo capitolo saranno dati dettagli tecnici implementativi delle tecnologie citate o realizzate effettivamente all’interno del programma a corredo della tesi. E’ stato scelto di fare un capitolo a parte su questo aspetto per evitare di spezzare i discorsi portati avanti nei precedenti capitoli con dettagli tecnici. Questo non vuol dire che i dettagli tecnici non siano importanti, anzi è fondamentale per un buon ricercatore avere una solida conoscenza di come funzionano ‘dietro le quinte’ determinati algoritmi o test geometrici e conoscerne la complessità. In questo modo ci si può creare un bagaglio di conoscenze e di algoritmi che saranno la base per nuove idee e nuovi algoritmi nell’inarrestabile mondo della ricerca. Questo capitolo è una collezione quindi di spezzoni di codice citati negli altri capitoli e spiegati in maggior dettaglio in questa sede. 6.1 Test di Intersezione Sfera-Cubo Un algoritmo per testare una sfera e un AABB è stato presentato da Arvo [47] ed è sorprendentemente semplice. In questo codice si usa una versione ulteriormente semplificata: //Rappresentazione intera di un valore in floating point #define MUSE_IR(x) ((unsigned int&)(x)) //Rappresentazione in floating point di un valore intero #define MUSE_FR(x) ((float&)(x)) //Procedura ottimizzata per 'ripulire' un numero floating point //dal bit di segno. Può essere più o meno veloce a seconda del contesto static __forceinline float FastFabs(float x) { unsigned int mfloatBits = MUSE_IR(x)&0x7fffffff; return MUSE_FR(mfloatBits); } bool LooseCell::RecursiveContactingObjects(SimulationSphere* spheres, int nSpheres,LooseSphereQuery* query,LooseOctree* octree,LooseQueryCallback callback,void* userData) { ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 91 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ //Controlliamo se la sfera e l'AABB non si toccano const float test = octree->HalfSizeTable[depth]+query->radius; if( FastFabs(cx - query->x)>test|| FastFabs(cy - query->y)>test|| FastFabs(cz - query->z)>test) { return false; } //...missing } Come si può vedere dal codice, al di là di ottimizzazioni specifiche che sfruttano la particolarità dei numeri floating point di mantenere il segno in un bit ben preciso, quello che si fa è trasformare lo spazio nel quale si effettua la comparazione. In due dimensioni il discorso è quello in figura. Figura 90. Trasformazioni geometriche nel Test AABB-Sfera Come prima operazione si trasporta la circonferenza al centro degli assi. La seconda cosa che si fa è quella di aumentarne il raggio di una quantità pari a metà diagonale del quadrato. A questo punto basterà controllare che il centro del quadrato si trovi all’interno della ‘nuova’ circonferenza creata. In 3D è tutto analogo,con la sola aggiunta della terza coordinata. ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 92 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ 6.2 Funzione di risposta void CMetaballs::RecalcGridInfluencedRadius() { int counter=1; float fDist = 0; const float thresold=m_fLevel/1000.0f; while(EnergyFunction(fDist*fDist)>thresold) { fDist+=m_fVoxelSize; counter++; } m_nGridInfluencedRadius = (counter+1)/2; m_fInfluenceRadius = m_nGridInfluencedRadius*m_fVoxelSize; } 6.3 Calcolo raggio funzione di influenza del MC Il calcolo del raggio di influenza della funzione di blending delle particelle è molto semplice, semplicemente ci si allontana dalla funzione fino a quando essa non void CMetaballs::RecalcGridInfluencedRadius() { int counter=1; float fDist = 0; const float thresold=m_fLevel/1000.0f; while(EnergyFunction(fDist*fDist)>thresold) { fDist+=m_fVoxelSize; counter++; } m_nGridInfluencedRadius = (counter+1)/2; m_fInfluenceRadius = m_nGridInfluencedRadius*m_fVoxelSize; } ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 93 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ 6.4 Ricerca dell’ottante giusto del looseoctree LooseCell* LooseCell::RecursiveInsert(SimulationSphere* spheres, int nSpheres,int sphereIndex,LooseOctree* octree) { SimulationSphere* sphere=spheres+sphereIndex; //...Missing // Selezioniamo l'ottante in base al segno del vettore che // va dal centro della sfera al centro del cubo dell'octree const int i = (sphere->mCenter.x <= this->cx) ? 0 : 1; const int j = (sphere->mCenter.y <= this->cy) ? 0 : 1; const int k = (sphere->mCenter.z <= this->cz) ? 0 : 1; //...Missing } Questo banalissimo pezzo di codice riesce a dire con pochissime istruzioni in quale ottante di un cubo di octree suddiviso, cioè in quale nodo figlio deve venire posizionata. La cosa importante da tenere a mente però è la convenzione di indici usata quando si ha la necessità di indicare un determinato nodo figlio. Figura 91. Numerazione dei nodi figli dell’octree ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 94 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ 6.5 Codice di crazione texture pre-integrata Il seguente codice precalcola per tutte le possibili coppie di punti iniziali e finali di integrazione la pre-integration map definita dalla seguente formula già illustrata: void createLookupTable(float thickness, float tfunc[TABLE_SIZE][4], float lutable[TABLE_SIZE][TABLE_SIZE][4]) { for (int x = 0; x < TABLE_SIZE; x++) { for (int y = 0; y < TABLE_SIZE; y++) { int n = 10 + 2 * abs(x-y); double step = thickness / n; double dr = 0.0, dg = 0.0, db = 0.0,dtau = 0.0; for (int i = 0; i < n; i++) { double w = x + (y-x)*(double)i/n; if ((int)(w + 1) >= TABLE_SIZE) w = (double)(TABLE_SIZE - 1) - 0.5 / n; double tau = step * (tfunc[(int)w][3]*(w-floor(w))+ tfunc[(int)(w+1)][3]*(1.0-w+floor(w))); double r = exp(-dtau)*step*( tfunc[(int)w][0]*(sfloor(w))+tfunc[(int)(w+1)][0]*(1.0-w+floor(w))); double g = exp(-dtau)*step*( tfunc[(int)w][1]*(w-floor(w))+ tfunc[(int)(w+1)][1]*(1.0-w+floor(w))); double b = exp(-dtau)*step*( tfunc[(int)w][2]*(w-floor(w))+ tfunc[(int)(w+1)][2]*(1.0-w+floor(w))); dr += r; dg += g; db += b; dtau += tau; } } lutable[x][y][0]=(dr > 1.0 ? 1.0f : (float)dr); lutable[x][y][1]=(dg > 1.0 ? 1.0f : (float)dg); lutable[x][y][2]=(db > 1.0 ? 1.0f : (float)db); lutable[x][y][3]=(1.0 - exp(-dtau)); } } ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 95 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ 6.6 Dettagli tecnici sul GPU rendering attuale Come una qualunque macchina, prima di poter sfruttare una GPU bisogna capire come essa funziona e cosa è capace di fare. Il secondo punto è strettamente legato ai modelli particolare di schede che si considera, ma gran parte delle caratteristiche base sono condivise dai modelli della stessa ‘fascia’ promossa dai singoli Hardware Vendors (HV). In questa sede verranno esposte potenzialità e tecniche che si applicano ad hardware programmabile di seconda e terza generazione [48] (per intenderci con supporto pixelshader 2.0 e 3.0), che sono le prime veramente ‘utilizzabili’ in ambito scientifico. Si cercherà ora di spiegare in breve in cosa consistono le tecnologie citate, che hanno dei nomi sicuramente molto d’effetto ma che sicuramente non ne esplicano la funzionalità. La terminologia ‘vertex program’ e ‘pixel program’ sono sicuramente più corrette dei corrispondenti commerciali vertex shader e pixel shader. Nel seguito si farà riferimento a queste due tecnologie indifferentemente con le abbreviazioni VP e PP o VS e PS. 6.6.1 La pipeline Figura 92. Diagramma schematico di una Pipeline di GPU moderna Per pipeline si intende la sequenza di operazioni che porta una primitiva ad essere disegnata a schermo. In figura è riportato uno schema generico di pipline. Quello che ci interessa sapere è solo quanto descritto di seguito. Alla base di tutto il processo ci sono i vertici, che formano le primitive, ad esempio un triangolo o una superficie parametrica, ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 96 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ e delle mappe di pixel N-dimensionali (texture 2D, 3D etc). La pipeline prende singolarmente i vertici delle primitive ed esegue su ognuno di loro un vertex shader attraverso il Vertex Processor.Il VS prenderà un vertice in input e lo trasformerà in un certo output, con la possibilità di aggiungere delle quantità calcolate ‘al volo’ su di esso. Dopo alcuni processi tecnici necessari (culling, clipping etc) la primitiva approda al pixel shader, che provvede a ‘colorare’ un pixel alla volta, eseguendo tramite il fragment processor un microprogramma su ognuno di essi . Di seguito si parlerà di primitiva riferendosi principalmente a dei triangoli. Probabilmente con le poche parole che è possibile dedicare in questa introduzione all’argomento non si riesce a capire il perché della necessità di ‘due livelli’ di programmabilità, uno per vertice ed uno per pixel,ma gli tecniche che verranno esposte attireranno sicuramente anche l’attenzione del più scettico. 6.6.2 Vertex Program Figura 93. Il Vertex Program all’internod della pipeline Come abbiamo appena detto, un Vertex Program è un piccolo programmino che viene nativamente eseguito sulla GPU, compilato in un suo linguaggio macchina. L’applicazione che sembra più naturale per un vertex program, è quello di modificare le proprietà geometriche di un vertice, sostanzialmente di ‘trasformarlo’. Si potrebbe obiettare che anche prima dell’avvento della programmabilità della GPU, era possibile impostare delle matrici di trasformazione per vertice, ma già ci si rende conto di essere su due piani diversi. Un vertex program ha la possibilità di eseguire una qualunque operazione di trasformazione sul vertice, non solo una trasformazione lineare come può essere quella effettuata tramite una matrice. Ad ogni modo vediamo come è strutturato un semplice vertex program: ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 97 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ float4x4 view_proj_matrix; float4x4 texture_matrix0; struct VS_OUTPUT { float4 Pos : POSITION; float3 Pshade : TEXCOORD0; }; VS_OUTPUT main (float4 vPosition : POSITION) { VS_OUTPUT Out = (VS_OUTPUT) 0; // Si trasforma il vertice in projspace Out.Pos = mul (view_proj_matrix, vPosition); // si crea una coordinata texture a partire dalla posizione // da una matrice Out.Pshade = mul (texture_matrix0, vPosition); return Out; } Questo piccolo vertex shader trasforma il vertice in questione proiettandolo a schermo e generando dinamicamente una coordinata texture al suo interno. Quest’ultima viene ottenuta moltiplicando la posizione in object space dell’oggetto per una matrice di trasformazione texture. Quello che è importante capire di questo esempio è che i nuovi ‘campi’ che vengono creati per vertice possono avere dei significati arbitrari. In questo caso specifico i valori inseriti nel campo Pshade potranno in seguito essere utilizzati come tali nei conti oppure per indicizzare una texture. Astraendosi un attimo dall’ambito specifico dello shading a fini visualizzativi, si possono osservare alcune cose: 1. Disponibilità di un linguaggio di programmazione evoluto 2. Programmi eseguiti su una architettura dedicata 3. Possibilità di indicizzare tabelle, eseguire operazioni SIMD (single instruction multiple data) per processare parallelamente diversi dati. Tutta questa potenza è dedicata ai soli fini visualizzativi. La CPU potrà in questo modo esser scaricata di una mole di lavoro enorme ed occuparsi di compiti per i quali è certamente più portata, quali ad esempio gli aspetti simulativi e di gestione. Il segreto di questa architettura, ma contemporaneamente la sua debolezza sta nell’unidirezionalità delle comunicazioni tra CPU e GPU. La CPU manda continuamente dati alla GPU, che ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 98 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ provvede a processarli e a disegnarli a video. Non è assolutamente possibile però per la CPU riutilizzare l’output della GPU per un ulteriore processing, o meglio, è possibile ma a costo di una irreparabile rottura del parallelismo del sistema. Questa rottura si manifesta infatti con un calo vertiginoso delle performance. Non avrebbe senso tra l’altro ipotizzare un sistema del genere poiché a conti fatti equivarrebbe ad un sistema con due CPU, con tutti i limiti che una scelta del genere comporta. La difficoltà del progettare algoritmi per la GPU sta proprio in questo: ricordarsi costantemente che si sta lavorando su uno stream processor. Il termine stream (flusso) indica che è in grado di gestire un enorme flusso di dati unidirezionale, come un fiume in piena. Figura 94. Comunicazione unidirezionale da CPU a GPU Questo concetto è perfettamente esemplificato nella lettura [49] 6.6.3 Pixel (o fragment) program Figura 95. Posizionamento del Pixel Program nella Pipeline ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 99 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ Una volta usciti dal vertex program, i triangoli sono composte da un insieme di vertici con delle quantità numeriche ben definite al loro interno, che possono venire interpretate nei modi più disparati per riempire l’area coperta a schermo dal triangolo stesso. Figura 96. Rasterizing di un triangolo Nella fase di disegno vera e propria a schermo, queste quantità vengono interpolate lungo tutto il triangolo. Su ogni pixel ‘interpolato’ viene eseguito un microprogramma che permette di effettuare ulteriori calcoli prima di plottarlo a schermo. Figura 97. Il Pixel Program viene applicato ad ogni pixel disegnato In figura ad esempio si prende il colore calcolato per vertice, ed interpolato sull’i-esimo pixel e si scrive a schermo l’esponenziale. Quella appena descritta potrebbe benissimo essere una procedura per riportare in un range visualizzabile su un normale monitor PC (LDR o Low Dynamic Range), un colore calcolato in un altro spazio, quale ad esempio ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 100 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ l’HDR (High Dynamic Range). Per gli interessati questa procedura si chiama Tone Mapping [50]. 6.6.4 Novità dei modelli VS e PS 3.0 I Modelli VS e PS 3.0 sono quelli implementati dalle nuovissime schede in commercio al tempo della scrittura di questa tesi. I prezzi di questo tipo di hardware non sono ancora a livello di consumer, ma sicuramente alla portata di chi vuole utilizzarle per scopi scientifici o di ricerca. Il pregio di questi nuovi modelli è quello della ‘convergenza’ di features delle diverse proposte da parte dei vari Hardware Vendors. Si è ragionevolmente certi di poter sviluppare algoritmi che funzionino indifferentemente sui diversi modelli da essi proposti. Dichiarazioni Input/Output Nel modello shader 3.0 è obbligatorio dichiarare i registri di input (sia per VS che PS) e quelli di output (solo per i VS) prima che essi vengano utilizzati. In compenso però i registri dichiarati hanno la caratteristica di essere in grado di contenere più di un tipo di dichiarazione. Questo significa che anche se il numero di input di uno shader program eccede il limite di registri di input a disposizione, gli input possono essere impacchettati insieme nei registri nella fase di dichiarazione dello shader. Per esempio una dichiarazione di VS 3.0 potrebbe accettare posizione,normale,tangente, binormale,due color, otto pesi di blending, otti indici di blending e 14 coodinate texture bidimensionali attraverso un uso ottimale dell’impacchettamente dei registri di input. Con lo shader model 2.0 una tale dichiarazione sarebbe stata possibile solo pre-impaccando tutti questi dati in una struttura vertice utilizzando 16 input totali. Gli outputs sono dichiarati allo stesso modo degli input. Ad esempio: vs_3_0 ; Declare inputs dcl_position0 v0.xyzw dcl_normal0 v1.xyz dcl_tangent0 v2.xyz dcl_binormal0 v3.xyz dcl_blendweight0 v1.w dcl_blendweight1 v2.w dcl_blendweight2 v3.w dcl_texcoord0 v4.xy dcl_texcoord1 v4.wz ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 101 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ ; Declare outputs dcl_position o0.xyzw dcl_texcoord0 o1.xy dcl_texcoord1 o1.zw dcl_texcoord2 o2.xyz dcl_fog o2.w dcl_psize o3 Poichhe il numero di VS output e di pixel shader input è lo stesso (12) questa caratteristica non è vantaggiosa nel pixel shader come lo è nel vertex shader. Il metodo preferito per selezionare gli input nei PS è lo swizzling sorgente arbitrario, di cui si parlerà in seguito. Queste dichiarazioni di input ed output così flessibile permettono di accoppiare diversi VS e PS senza assicurarsi di utilizzare esattamente lo stesso assegnamento dei registri. Questa può essere una caratteristica utile quando si ha a che fare con un grande numero di vertex e pixel program. Predicazione Il registro dei predicati (p0) è un insieme di 4 flag booleani (uno per x,y,z, e la w) che è sostanzialmente una ‘maschera di scrittura dinamca’. Esso permette alle istruzioni shader di essere eseguite per ogni singolo canale, basandosi sui risultati dei calcoli precedenti. I flag nel registro dei predicati sono impostati con il comando setp_comp p0, src1,src2, dove comp è la modalità di comparazione (maggiore di, minore di, etc.), p0 è il registro dei predicati e src1 e src2 sono due registri di input. La comparazione viene eseguita quatrro volte sulle corrispondenti component dei registri sorgenti, e i risultati sono salvati come flag booleani nel registro dei predicati. Per esempio il seguente codice imposta i registri dei predicati a (falso,vero,falso falso): def c0, 0.0f, 2.0f, -4.0f, 1.0f def c1, 4.0f, -8.0f, -2.0f, 1.0f mov r0, c0 setp_gt p0, r0, c1 Una volta che il registro dei predicati è stato impostato, il suo contenuto può essere utilizzato per permettere o impedire che vengano portate a termine operazioni ‘per canale’. Per abilitare la predicazione, (p0) è aggiunto di fronte alla corrispondente istruzione aritmetica o di texture. Per esempio, basandosi sul contenuto del registro dei ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 102 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ predicati definito precedentemente, solo la compnente y del registro di destinazione r0 è presa in considerazione dalla seguente istruzione: (p0) mul r0, r1.x, c1 Usare la predicazione come una maschera di scrittura dinamica ha vari campi di applicazione. Per sequenze di branching corte, bisognerebbe preferire istruzioni del tipo if_comp. Il registro dei predicati usa anche meno registri temporanei in comparazione alla versione equivalente che non usa i predicati, che può aiutare il compilatore ad eseguire alcune ottimizzazioni. Istruzioni di controllo condizionale come loop, if_comp, etc.,non possono essere usate insieme al predicate mode, anche se i registri di predicate possono essere usati come condizionale usando le istruzioni dedicate if_pred, callnz_pred, e break_pred. Controllo di flusso statico e dinamico Il modello vs_2_0 supporta il controllo statico del flusso del programma (cioè istruzioni di branching come loop e sottofunzioni o subroutine che sono chiamate in base a determinati valori presenti nei registri costanti). Il controllo di dlusso statico permette di combinare differenti shaders in shaders più lunghi, riducendo il numero di cambi di shader durante il processo. I loop statici posso anche essere utili con un numero fisso di iterazioni (ad esempio effettuare un ciclo su un certo numero di luci). L’unica differenza nel modello 3.0 sul controllo statico di flusso, è il numero di loop che possono essere innestati l’uno dentro l’altro (nesting). Mentre il l vs_2_0 non supporta il neesting (cioè avere loop dentro loop), sia vs_3.0 e ps_3_0 supportano il controllo di flusso statico con una profondità di nesting di 4. Comunque la vera potenza del modello 3.0 deriva dall’abilita di supportare il controllo di flusso dinamico. Il controllo di flusso dinamica è un modo di specificare diversi percorsi di codice in base alla comparazione di registri il cui contenuto è modificato dinamicamente dentro lo shader program. Ci sono due vantaggi principali con questa nuova carrteristica: flessibilità e performance. La flessibilità deriva dal fatto che diverse istruzioni di branching possono ora essere eseguite a livello di vertice o di pixel, permettendo l’implementazione di percorsi di codice molto complessi. Le performance derivano invece dal fatto che il codice può venire eseguito solo sui vertici o pixel che lo richiedono (anche se la performance guadagnata da codice non eseguito può variare a seconda dell’implementazione hardware). Le istruzioni di branch dinamico possono essere innestate fino a 24 livelli di ricorsione. Una tipica applicazione ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 103 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ del dynamic branching sta nel classico calcolo dell’illuminazione di una superficie. In base al risultato del prodotto scalare N.L, dove N è la normale alla superficie e L è il vettore che collega il punto sulla superficie stessa alla luce, possiamo sapere se il punto è rivolto dalla parte opposta rispetto alla luce. In questo modo con un condizionale possiamo scartare la pesante equazione per il calcolo dell’illuminazione che tiene conto dell’attenuazione, del colore speculare, etc etc. a seconda del modello usato. Il seguente esempio mostra questa cosa ps_3_0 ; costanti def c0, 0.0f, 0.0f, 0.0f, 1.0f ; Dichiariamo I vari registri di sampling dcl_2d s1 ; Normal map ; Dichiariamo l’input dcl_texcoord0 v0.xy ; Coordinate texture dcl_texcoord1 v1.xyz ; Vettore Punto->Luce texld r2, v0, s1 ; Leggiamo la normale alla superficie nel punto nrm r1, v1 ; Normalizziamo il vettore punto->Luce dp3 r0.w, r2, r1 ; Calcoliamo il fattore(N.L) if_gt r0.w, c0.x ; Se (N.L)>0 ; Calcoliamo il resto dell’equazione di illuminazione: colore ; speculare, attenuazione, lightmap, etc. ; r3 conterrà il valore finale di tutta questo calcolo else ; Altrimenti scriviamo nero (o un colore ambient) ; saltando tutta il complesso calcolo di illuminazione! mov r3, c0 endif mov oC0, r3 ; Scriviamo a schermo il colore Il dynamic branching può quindi servire ad eseguire forti ottimizzazioni. Bisogna solo stare attenti a non usarlo con numeri di istruzioni molto piccoli, poiché risulterebbe più lento che eseguendo tutte le istruzioni. Le istruzioni di break all’interno dei loop hanno la stessa funzione, quando si è trovato il giusto risultato si può stoppare l’iterazione. Come vedremo si farà uso di questa istruzione esattamente nel nostro caso di volumetric rendering, per effettuare il raytracing del campo scalare generato dalla simulazione per estrarne una iso-superficie. ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 104 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ Altre novità Esistono altre caratteristiche nuove dello shader model 3.0 ma sono state esposte solo quelle fondamentali per la scrittura degli algoritmi necessari al tipo di rendering utilizzato in questa sede. Il modello shader 3.0 è un grande passo in avanti rispetto al 2.0. Nuove caratteristiche sono state introdotte mentre i limiti di registri e numero di istruzioni sono stati aumentati enormemente. La semplicità aggiunta dall’unificazione dei modelli vertex e pixel shader permettono una maggiore flessibilità sulle istruzioni e sui registri. ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 105 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ Conclusioni In questa tesi è stata presentata una nuova tecnica per la simulazione e rendering in tempo reale di corpi deformabili utilizzando una ridotta potenza di calcolo. La semplicità del modello, le ottimizzazioni nello schema di partizionamento e le strategie di aggiornamento hanno portato la simulazione ai livelli del real-time su numero di particelle molto alti per un normale PC. Il collo di bottiglia attuale è la fase di rendering attraverso Marching Cubes, ma i risultati dei primi test sul GPU rendering fanno ben sperare per soluzioni alternative valide. Il metodo qui presentato può anche essere esteso per utilizzare periferiche di force feedback. In questo modo gli utenti possono sentire realisticamente la presenza fisica del materiale virtuale nel corso del processo di modellazione. ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 106 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ Bibliografia [1] Dewaele G., Cani M.-P.,, “Interactive Global and Local Deformations for Virtual Clay”, in Pacific Graphics, Canmore, Canada, October 2003 [2] A. Raviv and G. Elber, “Three-dimensional freeform sculpting via zero sets of scalar trivariate functions”, Computer-Aided Design, 32(8-9):513–526, August 2000. [3] Arata H., Takai Y., Takai N. K., Yamamoto T.: “Free-form shape modeling by 3d cellular automata”. In Shape Modeling International (1999), pp. 242–247. [4] Druon S., A.Crosnier, Brigandat L.: “Efficient cellular automata for 2d / 3d freeform modeling”. In WSCG (Feb. 2003). [5] Ferley E., Cani M.-P., Gascuel J.-D.: “Practical volumetric sculpting”. the Visual Computer 16, 8 (Dec. 2000), 469–480. [6] IX F. D., El-Sana J., Qin H., Kaufman A.: “Haptic sculpting of dynamic surfaces”. 1999 ACM Symposium on Interactive 3D Graphics (April 1999), 103– 110. [7] McDonnell K. T., Qin H., Wlodarczyk R. A.: “Virtual clay: A real-time sculpting system with haptic toolkits”. 2001 ACM Symposium on Interactive 3D Graphics (2001). [8] Onoue K., Nishita T.: “Virtual sandbox”. In Pacific Graphics 2003 (2003), pp. 252–259. [9] Rossignac J.: “Finger sculpting with digital clay: 3d shape input and output through a computer-controlled real surface”. In Shape Modeling International (2003), pp. 229–231. [10] T. W. Sederberg and S. R. Parry. “Free-form deformation of solid geometric models”. In Computer Graphics (Proceedings of SIGGRAPH 86), volume 20, pages 151–160, Aug. 1986. [11] C. Shaw and M. Green., “THRED: A two-handed design system. Multimedia Systems”, 5(2):126–139, 1997. [12] J. R. Bill and S. Lodha. “Computer sculpting of polygonal models using virtual tools”. In Tech. Rep. UCSC-CRL-94- 27, Baskin Center for Computer ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 107 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ Engineering and Information Sciences, University of California, Santa Cruz, US, July 1994. [13] Kuester, F., Duchaineau, M.A., Hamann, B., Joy, K.I. and Uva, A.E., (1999), “3DIVS: 3-dimensional immersive virtual sculpting”, in Workshop on New Paradigms in Information Visualization and Manipulation (NPIV '99), ACM Press, New York, New York, pp. 92-95 [14] Thatcher U., “Notes on spatial partitioning” http://tulrich.com/geekstuff/partitioning.html [15] Fiorentino M., De Amicis R., Stork A., Monno G., “Spacedesign: A Mixed Reality Workspace for Aesthetic Industrial Design”, Proc. of ISMAR 2002 IEEE and ACM International Symposium on Mixed and Augmented Reality, pp. 86-94, Sept. 30 - Oct. 1, 2002, Darmstadt, Germany. [16] J. M. Haile, “Molecular Dynamics Simulation: Elementary Methods”, Wiley Professional. [17] N. J. A. Sloane, R. H. Hardin, T. S. Duff and J. H. Conway, “Minimal-Energy Clusters of Hard Spheres” Discrete Computational Geom., 14 (1995), pp. 237259. [18] D. L. Tonnesen. “Dynamically Coupled Particle Systems for Geometric Modelling, Reconstruction, and Animation” [19] M. Matyka, M. Ollila "Pressure Model of Soft Body Simulation" [20] J. Krivanek “Representing and Rendering Surfaces with Points” [21] D. B. Murray "Molecular Dynamics Simulation of an Elastic Material" [22] J. M. Haile, “Molecular Dynamics Simulation: Elementary Methods”, Wiley Professional [23] Press, William H. et al, Numerical Recipes, Cambridge University Press, 1993. http://www.nr.com/nronline_switcher.html [24] T. Jakobsen "Advanced Character Physics". GDC [25] Verlet, L. "Computer experiments on classical fluids. I. Thermodynamical properties of Lennard-Jones molecules", Phys. Rev., 159, 98-103 (1967). [26] Stewart, D. E., and J. C. Trinkle, “An Implicit Time-Stepping Scheme for Rigid Body Dynamics with Inelastic Collisions and Coulomb Friction”, International Journal of Numerical Methods in Engineering ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 108 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ [27] Eric W. Weisstein. "Cubic Close Packing." From MathWorld--A Wolfram Web Resource. http://mathworld.wolfram.com/CubicClosePacking.html [28] Tomas Akenine-Moller; Eric Haines. “Real-Time Rendering” [29] T.H. Cormen, C.E. Leiserson; R.L. Rivest, C. Stain, "Introduction to Algorithms, Second Edition". The MIT Press [30] J. W. Ratcliff “Sphere Trees for Fast Visibility Culling, Ray Tracing, And Range Searching” from Game Programming Gems [31] R.Green "Spherical Harmonic Lighting: The Gritty Details" [32] Andreas Jonsson. http://www.angelcode.com/ [33] http://www.gpgpu.org [34] K. Engel, M. Hadwiger, J. Kniss, A. Lefohn, D. Weiskopf "Interactive Visualization of Volumetric Data On Consumer PC Hardware.". Slides. IEEE Visualization 2003 Tutorial [35] D. Weiskopf “Flow Visualization”. Slides. IEEE Visualization 2003 Tutorial: Interactive Visualization of Volumetric Data On Consumer PC Hardware [36] J. Kniss “Transfer Functions: Optical Properties”. Slides. IEEE Visualization 2003 Tutorial: Interactive Visualization of Volumetric Data On Consumer PC Hardware [37] J. Kniss “Transfer Functions: Classification” Slides. IEEE Visualization 2003 Tutorial: Interactive Visualization of Volumetric Data On Consumer PC Hardware [38] M. Hadwiger “Introduction to GPU Volume Rendering: Part 1” Slides. IEEE Visualization 2003 Tutorial: Interactive Visualization of Volumetric Data On Consumer PC Hardware [39] M. Hadwiger “Introduction to GPU Volume Rendering: Part 2” Slides. IEEE Visualization 2003 Tutorial: Interactive Visualization of Volumetric Data On Consumer PC Hardware [40] K. Engel “Basic Illumination Techniques”. Slides. IEEE Visualization 2003 Tutorial: Interactive Visualization of Volumetric Data On Consumer PC Hardware ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 109 Tesi per il conseguimento della Laurea in Ingegneria Meccanica L3 ______________________________________________________________________________________________ [41] K. Engel “Advanced Volume Rendering Techniques”. Slides. IEEE Visualization 2003 Tutorial: Interactive Visualization of Volumetric Data On Consumer PC Hardware [42] E. Hart “3D Textures and Pixel Shaders” on “ShaderX. Vertex And Pixel Shader Tips and Tricks” edited By W. F. Engel. [43] M. Kraus “Truly Volumetric Effects” on “ShaderX. Vertex And Pixel Shader Tips and Tricks” edited By W. F. Engel.” [44] Robert A. Drebin, Loren Carpenter, and Pat Hanrahan, “Volume Rendering,”SIGGRAPH Proceedings, Vol. 22, No. 4, August 1988, pp. 65-74. [45] Klaus Engel, Martin Kraus, and Thomas Ertl, “High-Quality Pre-Integrated Volume Rendering Using Hardware-Accelerated Pixel Shading,” SIGGRAPH Proceedings/Eurographics Workshop on Graphics Hardware, August 2001, pp. 916 (http://wwwvis.informatik.uni-stuttgart.de/~engel/pre-integrated/) [46] N. Greene, M. Kass, G. Miller “Hierarchical Z-Buffer Visibility”. Computer Graphics (SIGGRAPH 93 Proceedings), pp. 231-238, August 1993 [47] Arvo, James, “A simple Method for Box-Sphere Intersection Testing” in Andrei S. Glassner, ed., Graphics Gems, Academic Press, pp. 335-339 1990. http://www.graphicsgems.org/ [48] N. Thibieroz, K. Beets and A. Burton. “Introduction to the vs_3_0 and ps_3_0 Shader Models” on “ShaderX2 Introduction&Tutorials with DirectX9” edited By W. Engel. [49] T.J. Purcell “Ray Tracing on a Stream Processor” 2004 [50] Reinhard, Erik, Mike Stark, Peter Shirley, and Jim Ferwerda. "Photographic Tone Reproduction for Digital Images" . [51] Fiorentino M., De Amicis R., Stork A., Monno G., “Spacedesign: A Mixed Reality Workspace for Aesthetic Industrial Design”, Proc. of ISMAR 2002 IEEE and ACM International Symposium on Mixed and Augmented Reality, pp. 86-94, Sept. 30 - Oct. 1, 2002, Darmstadt, Germany. ______________________________________________________________________________________________ Stefano Cristiano; Simulazione e Rendering di materiali deformabili in Realtà Virtuale Pag. 110