Ray tracing
Da Wikipedia, l'enciclopedia libera.
Il Ray tracing è una tecnica generale di geometria ottica che si basa sul calcolo del percorso fatto dalla luce, seguendone i raggi attraverso l'interazione con le superfici. È usato nella modellazione di sistemi ottici, come lenti per fotocamere, microscopi, telescopi e binocoli. Il termine viene utilizzato anche per un preciso algoritmo di Rendering nel campo della Computer grafica 3D, in cui le visualizzazioni modellate matematicamente delle scene vengono prodotte usando una tecnica che segue i raggi partendo dal punto di vista della telecamera piuttosto che dalle sorgenti di luce. Produce risultati simili al ray casting ed allo scanline rendering, ma semplifica alcuni effetti ottici avanzati, ad esempio un'accurata simulazione della riflessione e della rifrazione, restando abbastanza efficiente da permetterne l'uso in caso si voglia ottenere un risultato di alta qualità.
Indice |
[modifica] Descrizione generale dell'algoritmo per computer
Il ray tracing descrive un metodo per la produzione di immagini costruite in sistemi di computer grafica 3D, con maggior realismo di quello che si potrebbe ottenere con l'uso di ray casting o scanline rendering. Lavora tracciando, all'inverso, il percorso che potrebbe aver seguito un raggio di luce prima di colpire un'immaginaria lente. Mentre la scena viene attraversata seguendo il percorso di numerosi raggi, le informazioni sull'aspetto della scena vengono accumulate. La riflessione del raggio, la sua rifrazione o l'assorbimento sono calcolate nel momento in cui colpisce un qualsiasi oggetto.
Le scene, nel ray tracing, vengono descritte matematicamente, solitamente da un programmatore, o da un grafico, utilizzando particolari programmi. Le scene possono anche includere immagini e modelli creati attraverso varie tecnologie, per esempio usando la fotografia digitale. Seguendo i raggi in senso inverso, l'algoritmo viene alleggerito di molti gradi di magnitudine (matematica), il che rende possibile una precisa simulazione di tutte le possibili interazioni presenti nella scena. Questo è dovuto al fatto che la maggiorparte dei raggi che parte da una sorgente non fornisce dati significativi all'occhio di un osservatore. Potrebbero invece rimbalzare finché si riducono al nulla, andare verso l'infinito o raggiungere qualche altra camera. Una simulazione che parta seguendo tutti i raggi emessi da tutte le sorgenti di luce non è fisicamente praticabile.
La scorciatoia utilizzata nel raytracing, quindi, presuppone che un dato raggio termini sulla camera, e ne cerca la sorgente. Dopo aver calcolato un numero fisso di interazioni (già deciso in precedenza), l'intensità della luce nel punto di ultima intersezione viene calcolata con un insieme di algoritmi, inclusi il classico algoritmo di rendering ed altre tecniche (come la radiosity).
[modifica] Descrizione dettagliata dell'algoritmo, e sua nascita
[modifica] Cosa accade in natura
In natura, una sorgente di luce emette un raggio che viaggia fino a raggiungere una superficie che ne interrompe il tragitto. Si può pensare al raggio come ad un fascio di fotoni che viaggia sulla stessa linea. Nel vuoto assoluto questo raggio seguirebbe una linea retta. In realtà, una qualsiasi combinazione di questi tre risultati si può verificare: assorbimento, riflessione e rifrazione. Una superficie può riflettere tutto o parte del raggio di luce, in una o più direzioni. Può anche assorbire parte del raggio, causando una perdita di intensità della luce riflessa/rifratta. Se la superficie ha proprietà di trasparenza o traslucenza, convoglierà una porzione di luce dentro se stessa, in una direzione diversa rispetto a quella causata dall'assorbimento di una parte (o tutto) lo spettro ottico (e possibilmente alterandone il colore). Sommando i valori di assorbimento, riflessione e rifrazione, si ottiene esattamente la potenza del raggio entrante. Una superficie non può, ad esempio, assorbire il 66% del raggio entrante, e rifletterne il 50%, dal momento che la somma darebbe 116%. [1] Partendo da qui, i raggi riflessi e/o rifratti possono colpire altre superfici, dove verranno assorbiti, riflessi e rifratti (di nuovo). Alcuni di questi raggi, alla fine del viaggio, colpiscono il nostro occhio, permettendoci di vedere la scena e contribuendo al disegno dell'immagine finale.
[modifica] Algoritmo di Ray casting
Il primo algoritmo di ray casting (in opposizione a quello di ray tracing) venne presentato da Arthur Appel nel 1968. L'idea di fondo del ray casting consiste nel far partire i raggi dall'occhio, uno per pixel, e trovare il più vicino oggetto che ne blocca il percorso (pensa ad un'immagine come ad una grata, in cui ogni quadrato corrisponde ad un pixel). L'oggetto colpito è quello che l'occhio vede attraverso quel pixel. Usando le proprietà del materiale e gli effetti della luce nella scena, questo algoritmo è in grado di determinare il colore dell'oggetto. Questa supposizione è fatta pensando che una superficie è visibile se il raggio la raggiunge senza essere bloccato o in ombra. Il colore della superficie viene calcolato usando i tradizionali shading model presenti in Computer grafica. Un importante vantaggio offerto dal ray casting rispetto al più vecchio algoritmo di scanline, è la sua capacità di gestire con semplicità superfici solide o non-piane, come ad esempio coni e sfere. Se una superficie matematica può essere colpita da un raggio, il ray casting è in grado di disegnarla. Oggetti complicati possono essere creati utilizzando tecniche di modellazione solida, e facilmente renderizzati.
Il ray casting per la produzione di computer grafica venne usato per la prima volta da alcuni scienziati del Mathematical Applications Group, Inc., (MAGI) di Elmsford, New York. Nel 1966, il gruppo venne creato per effettuare calcoli di esposizione alle radiazioni da parte del Dipartimento della Difesa degli Stati Uniti. Il software creato dal MAGI calcolava non solo i rimbalzi dei raggi gamma sulle superfici (il ray casting per le radiazioni era utilizzato dagli anni '40), ma anche il modo in cui penetravano negli oggetti e ne venivano rifratti. Questi studi aiutarono il Governo a scegliere alcune applicazioni militari, costruendo veicoli che avrebbero protetto le truppe dalle radiazioni e veicoli di rientro per le esplorazioni spaziali. Sotto la direzione del dr. Philip Mittelman, gli scienziati svilupparono un metodo per la generazione di immagini utilizzando lo stesso software. Nel 1972 MAGI divenne un'azienda commerciale di animazione, che utilizzò il ray casting per creare animazioni 3D per la televisione, documentari, e film (crearono buona parte del film Tron utilizzando esclusivamente il ray casting). La MAGI venne chiusa nel 1985.
[modifica] Algoritmo di Ray tracing
La successiva scoperta rivoluzionaria venne fatta da Turner Whitted nel 1979. I precedenti algoritmi lanciavano il raggio dall'occhio verso la scena, ma i raggi non venivano più seguiti. Whitted continuò il processo. Quando un raggio colpisce una superficie, può generare fino a tre nuovi tipi di raggio: riflessione, rifrazione ed ombra. Un raggio riflesso continua nella direzione della riflessione a specchio su di una superficie lucida. A questo punto interagisce con altri oggetti della scena; il primo oggetto che colpisce sarà quello visto nel riflesso presente sull'oggetto originario. Il raggio rifratto viaggia attraverso il materiale trasparente in modo simile, con l'aggiunta che può entrare o uscire da un materiale. Per evitare di tracciare tutti i raggi presenti in una scena, un raggio ombra viene usato per testare se la superficie sia visibile ad una luce. Un raggio colpisce una superficie in un qualche punto. Se questo punto "vede" la luce, un raggio (dal punto di vista del computer un segmento) viene seguito fino alla sorgente, Se durante il tragitto si incontra un oggetto opaco, la superficie è in ombra, e quella sorgente non contribuisce al calcolo del colore. Questo nuovo livello di calcolo aggiunge più realismo alle immagini create attraverso il ray tracing.
[modifica] Vantaggi del ray tracing
La popolarità conquistata dal ray tracing pone le basi nella simulazione realistica della luce rispetto ad altri modelli di rendering (tipo scanline rendering o ray casting). Effetti come riflessione ed ombra, difficilmente simulabili con altri metodi, sono il risultato naturale dell'algoritmo. Un'implementazione relativamente semplice conduce a risultati impressionanti, il ray tracing spesso rappresenta il punto di accesso allo studio della programmazione grafica.
[modifica] Svantaggi del ray tracing
Un grave svantaggio è dato dalle performance. Algoritmi come lo scanline utilizzano la coerenza dei dati per gestire la computazione tra i pixel, mentre il raytracing ricomincia tutto il procedimento ad ogni nuovo pixel, trattando ogni raggio in modo separato. Questa separazione offre vantaggi, tipo la possibilità di spedire più raggi del necessario per ottenere l'antialiasing e migliorare la qualità dell'immagine. Nonostante gestisca interriflessioni e rifrazioni accuratamente, il Ray Tracing tradizionale non è necessariamente fotorealistico. Il vero fotorealismo si ottiene quando l'equazione di rendering è ben approssimata o completamente implementata. Il suo calcolo dà il vero fotorealismo, dal momento che descrive ogni effetto fisico del flusso di luce. Il calcolo completo è normalmente impossibile date le risorse di computazione richieste. Il realismo di tutti i metodi di rendering, quindi, deve essere valutato in rapporto all'approssimazione dell'equazione e, nel caso del ray tracing, non è necessariamente il più realistico. Altri metodi, tra cui il photon mapping, sono basati sul ray tracing in alcune parti dell'algoritmo, e danno migliori risultati.
[modifica] Attraversamento inverso della scena
Il processo di lanciare i raggi dall'occhio verso la sorgente di luce, per disegnare un'immagine, viene chiamato a volte backwards ray tracing (o "ray tracing inverso"), dal momento che i fotoni viaggiano in senso opposto a quello usuale. Questa terminologia crea confusione. All'inizio il ray tracing era fatto partendo dall'occhio, ed i primi ricercatori (tipo James Arvo), usarono il termine backwards ray tracing per riferirsi al percorso sorgente-occhio. Per questo motivo, è più semplice distinguere i due casi in eye-based (basato sull'occhio) e light-based (basato sulla sorgente). La ricerca, negli scorsi decenni, ha esplorato combinazioni di computazioni effettuate in entrambi i sensi, così come schemi in grado di generare più o meno raggi in direzioni differenti, partendo da una superficie colpita. Ad esempio, gli algoritmi di radiosity lavorano solitamente computando il modo in cui i fotoni, emessi da una sorgente, modificano le superfici, registrandone i risultati. Questi dati possono essere usati da un ray tracer ricorsivo standard per creare un'immagine più corretta. Nel contesto degli algoritmi di illuminazione globale, come il photon mapping ed il Metropolis light transport, il ray tracing è solo uno dei tool usati per calcolare il trasferimento di luce tra le superfici.
[modifica] Algoritmo: classico ray tracing ricorsivo
Per ogni pixel dell'immagine { Crea un raggio che, dall'occhio, passa attraverso questo pixel Inizializza "NearestT" a "INFINITO" e "NearestObject" a "NULL" Per ogni oggetto della scena { Se il raggio colpisce questo oggetto { Se la distanza "t" è meno di "NearestT" { Setta "NearestT" a "t" Setta "NearestObject" a questo oggetto } } } Se "NearestObject" è "NULL" { Colora questo pixel con il colore di sfondo } Altrimenti { Spedisci un raggio ad ogni sorgente di luce per testare se è in ombra Se la superficie è riflettente, genera il raggio riflesso: (ricorsione) Se la superficie è trasparente, genera il raggio rifratto: (ricorsione) Usa "NearestObject" e "NearestT" per calcolare il colore Colora questo pixel con il colore risultante } }
Sotto viene mostrata un'immagine che illustra il percorso di alcuni raggi ricorsivi, calcolato utilizzando lo pseudocodice scritto qui sopra. Una superficie diffusiva riflette la luce in tutte le direzioni.
Per prima cosa, un raggio viene creato dal punto di vista delle telecamera e tracciato attraverso un pixel verso una scena, dove colpisce una superficie diffusiva. Da questa superficie l'algoritmo genera un raggio riflesso, lanciato, a sua volta, attraverso la scena, fino ad un'altra superficie. Infine, un nuovo raggio parte, fino a raggiungere la sorgente di luce, dove viene assorbito. A questo punto, il colore del pixel dipende da quello delle due superfici colpite e da quello della sorgente di luce. Ad esempio, se la luce emessa è bianca e le due superfici sono blu, il colore risultante sarà blu.
[modifica] Ray tracing in real time
Nel tempo si sono succeduti anche sforzi tesi ad implementare un ray tracing in real-time per applicazioni di grafica quali i videogiochi.
Il progetto OpenRT è composto da un nucleo altamente ottimizzato basato sul ray tracing, e ad un API in stile OpenGL per poter offrire un'alternativa all'approccio corrente basato sulla rasterizzazione.
L'hardware specifico per il ray tracing, come il Ray Processing Unit sviluppato alla Saarland University, è stato progettato per accelerare alcune operazioni computazionalmente dispendiose.
Alcuni software real-time, con motore basato sul ray tracing, sono stati sviluppati da programmatori appassionati fino ai tardi anni '90. I ray tracer usati in queste demo, comunque, usano spesso approssimazioni inaccurate ed arrivano ad imbrogliare per poter ottenere un buon frame rate.[2]
[modifica] Nella progettazione ottica
Il ray tracing, in computer grafica, deriva il proprio nome ed i principi da una precedente tecnica usata per la progettazione di lenti fino al 1900. Il ray tracing geometrico viene usato per descrivere la propagazione di raggi di luce attraverso sistemi di lenti o strumenti ottici, permettendo di modellare le proprietà di creazione dell'immagine. I seguenti effetti possono essere integrati in un ray tracer in modo abbastanza intuitivo, ma sono stati esclusi dalla computer grafica portando ad un inutile branching del software:
- La dispersione porta ad aberrazioni cromatiche (parzialmente integrata in POV-Ray)
- Indice gradiente ottico
- Polarizzazione
- Ottica dei cristalli
- Equazioni di Fresnel
- Laser
- Interferenza di pellicole sottili: possono essere usate per calcolare la riflettività di una superficie
Riguardo la modellazione di lenti, due particolari casi sono importanti. In un fuoco i raggi provenienti da una sorgente si incontrano. Nelle vicinanze di una regione focale i raggi sono rimpiazzati da onde piane che ne ereditano la direzione. La lunghezza del percorso ottico dalla sorgente viene usata come fase. La derivata della posizione del raggio nella regione focale rispetto alla posizione della sorgente è usata per ottenere la larghezza del raggio e, da questa, l'ampiezza dell'onda piana. Il risultato è la "point spread function", la cui Trasformata di Fourier corrisponde alla MTF, da cui si può calcolare anche il rapporto di Strehl. L'altro caso è il calcolo del wavefront del piano, ovvero dell'insieme di punti che hanno la stessa fase. Quando i raggi si avvicinano tra loro, o si intersecano, il wavefront tende a rompersi. Le interferenze di onde sferiche non hanno solitamente a che fare con il ray tracing dato che la diffrazione, ad una determinata apertura, non può essere calcolata.
Questo metodo viene utilizzato per minimizzare le aberrazioni ottiche per la fotografia e per applicazioni con grandi lunghezze d'onda tipo la modellazione di microonde o sistemi radio, e per quelli con corte lunghezze d'onda come l'ottica relativa ai raggi ultravioletti ed ai raggi X.
Prima dell'avvento dei computer, i calcoli di ray tracing venivano svolti manualmente attraverso tavole trigonometriche e logaritmiche. Le formule ottiche utilizzate da molte classiche lenti fotografiche vennero ottimizzate da gruppi formati da numerose persone, ognuna delle quali era responsabile di una piccola parte del complicatissimo calcolo. Ora tutto viene effettuato con l'ausilio dei calcolatori e di programmi tipo OSLO o TracePro prodotti dalla Lambda Research, CODE V o Zemax. Una versione semplificata del ray tracing, conosciuta come "ray transfer matrix analysis", viene spesso usata nella progettazione di risonatori ottici utilizzati nei laser.
[modifica] Esempio
Una dimostrazione dei principi coinvolti nel ray tracing, ci permetterà di considerare in che modo si possa trovare l'intersezione tra un raggio ed una sfera. L'equazione generale di una sfera può essere espressa in notazione vettoriale, dove I è un punto sulla superficie della sfera, C ne è il centro e r il raggio, con questa formula: .
Allo stesso modo, se una semiretta è definita attraverso il punto di origine S (origine del raggio) e la sua direzione d, ogni punto sulla linea soddisfa la seguente equazione:
in cui t è una costante che definisce la distanza misurata sulla semiretta partendo dall'origine (per cui, per semplicità, d è generalmente un vettore unitario). Ora, nella scena noi conosciamo S, d, C, ed r. Quello che ci serve e'trovare t per poterlo sostituire ad I:
Supponiamo che per semplicità, allora
Questa equazione quadratica ha soluzioni:
Se il radicando è negativo, il raggio non interseca la sfera. Questa è la matematica di fondo del calcolo di intersezione raggio-sfera. Esistono ovviamente processi molto più generali per il raytracing, ma questo voleva solo essere un esempio di come l'algoritmo viene usato.
[modifica] Note
- ^ Vedi la Legge di conservazione dell'energia
- ^ [1] Elenco di alcuni demo conosciuti
[modifica] Voci correlate
[modifica] Esempi di Software
[modifica] Bibliografia
- Glassner, Andrew (Ed.) (1989). An Introduction to Ray Tracing. Academic Press. ISBN 0-12-286160-4.
- Shirley, Peter and Morley Keith, R. (2001) Realistic Ray Tracing,2nd edition. A.K. Peters. ISBN 1-56881-198-5.
- Henrik Wann Jensen. (2001) Realistic image synthesis using photon mapping. A.K. Peters. ISBN 1-56881-147-0.
- Pharr, Matt and Humphreys, Greg (2004). Physically Based Rendering : From Theory to Implementation. Morgan Kaufmann. ISBN 0-12-553180-X.
[modifica] Collegamenti esterni
- The Ray Tracing News - Brevi articoli di ricerca e link ad ulteriori fonti
- Interactive Ray Tracing: The replacement of rasterization? - Una tesi riguardante il ray tracing in real-time, dicembre 2006
- Giochi che utilizzano il real-time raytracing
- Serie di tutorial sull'implementazione di un ray tracer in C++
- The Internet Ray Tracing Competition - Competizione on-line su immagini ed animazioni in ray tracing
[modifica] Software di Raytracing
- Blender
- BRL-CAD
- Indigo
- jawray - Raytracer portabile scritto in C++
- OpenRT - real-time raytracing library
- Optis - Straylight ed illumination software con integrazione completa col CAD (Solidworks e Catia V5)
- OSLO - Progettazione di lenti e software di ottimizzazione; OSLO-EDU è gratuito
- PBRT - un Raytracer basato sulla Fisica
- Pixie
- POV-Ray È gratuito
- Radiance Gratuita la versione per Linux
- Raster3D
- Rayshade
- RayTrace - Software C++ open source
- RealStorm Engine - Motore real-time di raytracing
- RPS Ray Tace - AccuRender Ray Trace per SketchUp
- SSRT - Codice sorgente C++ per un algoritmo Monte-carlo
- Sunflow - Scritto in Java
- Tachyon
- TracePro - Straylight ed illumination software con interfaccia simile al CAD
- TropLux - Simulazione di luce diurna
- Yafray
- Zemax - Conosciuto software commerciale per progettazione ottica
- Link al codice sorgente di altri ray tracer
- Portale Informatica: accedi alle voci di Wikipedia che parlano di Informatica