La terza dimensione

A volte si ha l'esigenza di realizzare un'immagine realistica di un modello matematico. L'immagine qui sotto è un esempio:

Rappresenta la superficie diagonale di Clebsch. Sono visibili le 27 rette che giacciono sulla superficie.

Quest'immagine proviene da un ipertesto realizzato in occasione di una mostra organizzata dal Dipartimento di Matematica. L'argomento dell'ipertesto è la collezione di modelli concreti (in gesso e legno) conservati nel dipartimento. Le superfici rappresentate dai modelli sono state riprodotte su calcolatore e sottoposte ad ulteriori elaborazioni grafiche.

Qui sotto si possono confrontare la fotografia di uno dei modelli e la corrispondente immagini sintetica:

Il modello virtuale può essere arricchito. Nelle due immagini seguenti sono evidenziate, rispettivamente, le 15 rette "diagonali" e un piano che passa per 3 di queste:

Nell'esempio seguente viene illustrata una superficie cubica rigata. In questo caso il modello sintetico può essere animato (gif 532Kb) mettendo in evidenza il fatto che la superficie sia interamente composta dalle rette:

Immagini realizzate con questa tecnica possono essere inserite in una pagina web come supporto per una dimostrazione matematica, come elemento grafico per catturare l'attenzione oppure possono semplicemente rappresentare il risultato di una ricerca estetica (magari sempre in ambito matematico).

L'ultimo argomento trattato in questo corso è proprio la tecnica che permette di creare immagini del genere.



Software

Per realizzare immagini analoghe a quelle riportate sopra si possono usare le funzioni grafiche dei programmi di manipolazione simbolica come i tre seguenti:

Mathematica
http://www.mathematica.com
MatLab
http://www.mathworks.com/products/matlab/
Maple
http://www.maplesoft.com

Oppure è possibile usare dei programmi specifici per la grafica come i seguenti:

Pov-Ray
http://www.povray.org
Rayshade
http://www-graphics.stanford.edu/~cek/rayshade


Questi ultimi due programmi utilizzano una tecnica chiamata "ray-tracing" per generare immagini foto-realistiche. L'immagine seguente illustra il principio su cui la tecnica si basa:

Dall'origine di un sistema di riferimento ruotato e translato rispetto a quello in cui è definito il modello, si proiettano dei raggi in direzione di uno schermo. Ogni raggio attraversa lo schermo in un punto e prosegue verso il modello. La più vicina intersezione del raggio con una parte del modello ci permette di definire il "colore" da assegnare a quel punto dello schermo. Ripetendo quest'operazione per un gran numero di raggi riusciamo a generare l'immagine in prospettiva che si formerebbe sulla pellicola di una "macchina fotografica virtuale" centrata nel sistema di riferimento dello schermo.

Pov-Ray

Pov-ray è un programma gratuito (scaricabile direttamente da http://www.povray.org) che permette di generare immagini di ottima qualità. I modelli vengono descritti utilizzando uno speciale linguaggio che ricorda per certi aspetti il linguaggio C. Un esempio di modello pov-ray si trova qui sotto assieme all'immagine generata:

Nei prossimi paragrafi riassumerò qualche concetto fondamentale, rimandando per una trattazione più completa all'help in linea fornito con il programma.

Concetti base

Il linguaggio permette di definire con facilità le forme più semplici:

La sfera
sphere { <0,0,0>, 1 }
Il cono
cone { <0,0,0>,1, <0,0,1>,0 }
Il cubo
box { <-1,-1,-1>, <1,1,1> }

e le superfici polinomiali (fino ad un certo grado).

Cubiche
cubic {<-16,  48, -24, 0, 48, 
          0,   0,   0, 0,  0, 
        -16, -24,   0, 0,  0, 
          0,  31, 54*sqrt(3), 72, 0> 
}
Quadriche
quadric { 
        <1,1,-1>,<0,0,0>,<0,0,0>,-1 
}

Inoltre permette di combinare forme semplici per ottenere forme più complesse. Più precisamente è possibile creare una forma come unione, intersezione o differenza di forme semplici. Combinando ad esempio queste due sfere

Si possono ottenere le figure seguenti


union {   
  sphere {0,1 
    pigment {color Yellow}
    translate -.5*x
  }
  sphere {0,1 
    pigment {color Green}
    translate .5*x
  }  
}


intersection {   
  sphere {0,1 
    pigment {color Yellow}
    translate -.5*x
  }
  sphere {0,1 
    pigment {color Green}
    translate .5*x
  }  
}


difference {   
  sphere {0,1 
    pigment {color Yellow}
    translate -.5*x
  }
  sphere {0,1 
    pigment {color Green}
    translate .5*x
  }  
}

Si possono definire le caratteristiche delle superfici modificandone il colore, la brillantezza e, più in generale il tipo di interazione con la luce.



Se si vuole una superficie di colore rosso uniforme bisogna dare il comando:
pigment { color Red }

Per avere l'aspetto del metallo cromato si può usare:
texture { Chrome_Metal }
Il metallo dorato:
texture { Gold_Metal }
È disponibile anche il vetro:
texture { Orange_Glass }
.. e i legno:
texture { DMFWood6 }
Oppure si può creare un materiale fatto su misura. Quest'esempio realizza un materiale colorato a strisce semitrasparenti lungo l'asse z:
texture { 
  pigment {
    gradient z 
    color_map{
      [0 color Gold transmit .5]
      [0.5 color Gold transmit .5] 
      [0.5 color Goldenrod transmit .5] 
      [1   color Goldenrod transmit .5]    
    }
    translate -4*z scale .1 
  }                  
}


Infine ogni oggetto può essere spostato, ruotato, ingrandito utilizzando un insieme di trasformazioni geometriche:

Rotazioni attorno agli assi X,Y,Z

  rotate -45*z
  rotate  35*x
  rotate  35*y

Operazioni di scala (non necessariamente isotrope)

  scale <0.3,1,1.0>

Trasformazioni generiche

  matrix <1,0,0, 0,1,0, 0.4,0,1, -.06,0,0>


Esempi di immagini generate con Pov-Ray

Qualche esempio, completo di codice sorgente, può servire come punto di partenza per fare qualche esperimento.

Ho preparato due esempi molto semplici e uno un po' più complicato:

Altri esempi si trovano sul Web. Ad esempio :

Le due pagine seguenti non riguardano povray, ma alcune superfici notevoli illustrate con Pov-Ray. Accanto alle immagini è disponibile il codice con cui le immagini sono state generate.















Gian Marco Todesco