4.4.8 Superellissoide
Sometimes we want to make an object
that does not have perfectly sharp edges like a box does. Then, the superquadric
ellipsoid is a useful object. It is described by the simple syntax:
superellissoid {<r,n>}
Dove r ed n sono numeri reali maggiori
di zero e minori o uguali ad uno. Facciamo un superellissoide e sperimentiamo
un po'con i valori di r ed n per vedere cosa possiamo ottenere.
Creiamo un file chiamato supellps.pov e lo editiamo come segue :
#include "colors.inc"
camera {
location <10, 5, -20>
look_at 0
angle 15
}
background { color rgb <.5, .5, .5> }
light_source { <10, 50, -100> White }
Aggiungere uno sfondo grigio ci rende
più semplice vedere il nostro oggetto. Poi aggiungiamo :
superellipsoid { <.25, .25>
pigment { Red }
}
Salviamo e renderizziamo a 200x150
per vedere cos'è.
![]() |
Fig. 37-Superellissoide
Sembra un cubo, ma ha gli angoli arrotondati. Ora sperimentiamo diversi valori di r ed n. Per la prossima prova, usiamo <1, 0.2>.
![]() |
Fig. 38-Superellissoide "cilindrico"
Ora sembra un cilindro, ma gli spigoli sono arrotondati. Proviamo <0.1,1>.
![]() |
Fig. 39- Superellissoide
Questa è strana ! Non sappiamo esattamente come chiamarla, ma è interessante. Infine proviamo <1,1>.
![]() |
Fig. 40-Superellissoide
Bene, questa è più familiare...una sfera ! (In effetti si possono usare valori superiori ad uno, fino a circa 8, sia per r che per n, ottenendo oggetti abbastanza interessanti N.d.T.)
![]() |
Fig. 41-Superellissoide
Dovremmo conoscere un paio di cose riguardo
ai superellissoidi in POV-Ray . Primo, dovremmo evitare di assegnare valore
zero sia ad r che ad n, dato che POV-Ray restituirebbe un cubo nero al
posto del nostro oggetto. Secondo, valori molto piccoli di r ed n possono
dare strani risultati e quindi andrebbero evitati. Infine, la soluzione
di Sturm (§ 7.5.7.5) non funziona con i superellissoidi.
I superellissoidi sono oggetti finiti e quindi rispondono all'auto-bounding
e possono essere usati per CSG. Ora usiamoli per fare qualcosa di utile
in una scena. Faremo un pavimento a mattonelle e ci metteremo sopra un
paio di superellissoidi. Possiamo partire dal file che abbiamo appena fatto.
Lo rinominiamo tiles.pov e lo editiamo in modo che sia così :
#include "colors.inc"
#include "textures.inc"
camera {
location <10, 5, -20>
look_at 0
angle 15
}
background { color rgb <.5, .5, .5> }
light_source{ <10, 50, -100> White }
Nota che abbiamo aggiunto #include
"textures.inc" in modo da
potere utilizzare texture predefinite. Ora vogliamo definire il superellissoide
che sarà la nostra mattonella .
#declare Tile = superellipsoid { <0.5,
0.1>
scale <1, .05, 1>
}
I superellissoidi sono grandi all'incirca
2x2x2 unità a meno che non vengano ridimensionati in altro modo.
Se vogliamo disporre un po'di queste mattonelle una di fianco all'altra,
dovranno essere traslate in modo da non sovrapporsi.Dovremo scegliere un
valore per questa traslazione leggermente superiore a 2 in modo che ci
sia un po' di spazio tra le mattonelle da riempre con stucco. Quindi aggiungiamo :
#declare Offset = 2.1
Ora vogliamo costruire una riga di
mattonelle. Ogni mattonella sarà traslata, rispetto all'originale
di una distanza sempre crescente nelle direzioni +z e -z. Ci riferiamo
al nostro valore di offset e lo moltiplichiamo per il 'numero' di ogni
mattonella per determinare la posizione di quella mattonella nella riga.
Poi uniamo le mattonelle in un singolo oggetto chiamato Row (riga) in questo
modo :
#declare Row = union {
object { Tile }
object { Tile translate z*Offset }
object { Tile translate z*Offset*2 }
object { Tile translate z*Offset*3 }
object { Tile translate z*Offset*4 }
object { Tile translate z*Offset*5 }
object { Tile translate z*Offset*6 }
object { Tile translate z*Offset*7 }
object { Tile translate z*Offset*8 }
object { Tile translate z*Offset*9 }
object { Tile translate z*Offset*10 }
object { Tile translate -z*Offset }
object { Tile translate -z*Offset*2 }
object { Tile translate -z*Offset*3 }
object { Tile translate -z*Offset*4 }
object { Tile translate -z*Offset*5 }
object { Tile translate -z*Offset*6 }
}
Questo ci fornisce una singola riga
di 17 mattonelle. Più che sufficienti per riempire lo schermo. Ora
dobbiamo fare delle copie della riga e traslarle, di nuovo secondo il valore
di offset, nelle direzioni +x e -x allo stesso modo.
object { Row }
object { Row translate x*Offset }
object { Row translate x*Offset*2 }
object { Row translate x*Offset*3 }
object { Row translate x*Offset*4 }
object { Row translate x*Offset*5 }
object { Row translate x*Offset*6 }
object { Row translate x*Offset*7 }
object { Row translate -x*Offset }
object { Row translate -x*Offset*2 }
object { Row translate -x*Offset*3 }
object { Row translate -x*Offset*4 }
object { Row translate -x*Offset*5 }
object { Row translate -x*Offset*6 }
object { Row translate -x*Offset*7 }
Finalmente le nostre mattonelle sono complete,
ma abbiamo bisogno di un materiale. Per questo motivo, uniamo insieme tutte
le righe e le colonne e applichiamo una colorazione marmorizzata ed una
finitura brillante ed un po'riflettente.
union{
object { Row }
object { Row translate x*Offset }
object { Row translate x*Offset*2 }
object { Row translate x*Offset*3 }
object { Row translate x*Offset*4 }
object { Row translate x*Offset*5 }
object { Row translate x*Offset*6 }
object { Row translate x*Offset*7 }
object { Row translate -x*Offset }
object { Row translate -x*Offset*2 }
object { Row translate -x*Offset*3 }
object { Row translate -x*Offset*4 }
object { Row translate -x*Offset*5 }
object { Row translate -x*Offset*6 }
object { Row translate -x*Offset*7 }
pigment { White_Marble }
finish { phong 1 phong_size 50 reflection .35 }
}
Ora dobbiamo aggiungere lo stucco.
Questo può semplicemente essere un piano bianco. Abbiamo aumentato
un poco il parametro ambient
in modo da farlo diventare più bianco.
plane { y, 0 //questo è lo stucco.
pigment { color White }
finish { ambient .4 diffuse .7 }
}
Per completare la nostra scena, aggiungiamo
cinque diversi superellissoidi, ognuno di un diverso colore, in modo che
'fluttuino' sopra le nostre mattonelle e vi siano riflessi.
superellipsoid {
<0.1, 1>
pigment { Red }
translate <5, 3, 0>
scale .45
}
superellipsoid {
<1, 0.25>
pigment { Blue }
translate <-5, 3, 0>
scale .45
}
superellipsoid {
<0.2, 0.6>
pigment { Green }
translate <0, 3, 5>
scale .45
}
superellipsoid {
<0.25, 0.25>
pigment { Yellow }
translate <0, 3, -5>
scale .45
}
superellipsoid {
<1, 1>
pigment { Pink }
translate y*3
scale .45
}
Renderizziamo la scena a 320x200. Se
ci va bene, facciamo un rendering finale a 640x480 +A0.2.
![]() |
Fig. 42-Alcuni superellissoidi che sorvolano un pavimento!
![]() |
![]() |
![]() |