4.4.1 Superfici
Bicubiche (Patches)
Le superfici bicubiche o di Bezier,
sono utili rappresentazioni di una superficie, dato che permettono una
semplice definizione di una superficie mediante l'uso di pochi punti di
controllo. I punti di controllo servono a determinare la forma della superficie.
Invece di definire i vertici dei triangoli che la formano, diamo le coordinate
dei punti di controllo. Una singola patch ha 16 punti di controllo, quattro
ad ogni angolo e le altre posizionate in modo da dividere la patch in sezioni
più piccole. Per il rendering le superfici di Bezier vengono approssimate
usando triangoli. Le superfici di Bezier sono quasi sempre create usando
un modellatore esterno a POV-Ray, così per questo tutorial, useremo
MORAY (ma può essere usato un qualunque altro modellatore che abbia
supporto per le superfici di Bezier e per POV-Ray). Useremo Moray solo
per creare la superficie, non per il resto della scena.
Le superfici di Bezier sono utilissime e con un po' di pratica, possono
essere create cose piuttosto sorprendenti. Per il nostro tutorial, faremo
una specie di tenda indiana, usando una patch costituita di un solo foglio.
Per prima cosa, avviamo Moray e dallo schermo principale, facciamo click
su "CREATE" e poi su "Bezier Patch". Diamo al nostro
oggetto il nome Teepee. Apparirà la finestra di dialogo "Create
Bezier Patch". Dobbiamo assicurarci che il pulsante "Sheet"
sia premuto. Facciamo clic su "OK, CREATE". In basso, sullo schermo
principale, facciamo clic su "EXTENDED EDIT".
Teniamo il cursore del mouse sulla vista "TOP" e facciamo clic
col bottone destro per fare apparire il menù. Facciamo clic su "MAXIMIZE"
e zoomiamo un po' [ALT-trascina] in modo da vedere bene la patch. Clic
su "MARK ALL" e nel riquadro del tipo di trasformazione, "UFRM
SCL". Tenendo premuto il bottone sinistro, trasciniamo il mouse in
modo da rendere la patch ampia circa 4 unità. Facciamo clic sul
pulsante "TRANSLATE" e spostiamo la patch in modo che il suo
centro sia sopra l'origine. Col bottone destro, facciamo clic su "MINIMIZE"
ed "UNMARK ALL". Con [SHIFT-trascina] tracciamo un rettangolo
attorno al punto di controllo inferiore destro, selezionandolo. Zoomiamo
nella vista "FRONT" in modo da vedere meglio la patch. Nella
vista "FRONT" trasliamo quel punto 10 unità nella direzione
delle Z negative (notiamo che in Moray l'asse Z è rivolto verso
l'alto). Poi, "UNMARK ALL". Ripetiamo questa procedura per
ognuno degli altri tre punti negli angoli. Assicuriamoci di ricordare di
eseguire "UNMARK ALL" ogni volta che ciascun punto è stato
traslato. Dovremmo avere una 'forma' che sembra stare in piedi su quattro
zampe appuntite. Infine, "UNMARK ALL".
Di nuovo nella vista "TOP", selezioniamo i quattro punti di controllo
centrali ([SHIFT]-trascina). Ingrandiamo la vista "TOP" (clic
destro e "MAXIMIZE") Facciamo clic su "UFRM SCL" e
trasciniamo il mouse per avvicinare insieme i quattro punti. Zoomiamo il
più possibile e cerchiamo di renderli il più vicini possibile.
Zoomiamo all'indietro ([ALT-trascina]), clic destro e "MINIMIZE".
Nella vista "FRONT", trasliamo ("TRANSLATE" ) i punti
selezionati 10 unità lungo l'asse delle Z positive. "UNMARK
ALL". La forma che ne risulta è piuttosto interessante, è
stata semplice da modellare e non avrebbe potuto essere costruita utilizzando
le primitive che abbiamo a disposizione. Ora usiamola nella scena.
Facciamo clic su "DONE" e torniamo nella finestra principale.
Notiamo che i parametri U_STEPS e V_STEPS sono impostati su 3, mentre FLATNESS
è su 0.01. Lasciamoli perdere per ora. Facciamo clic su "FILE"
e poi "SAVE SEL" (salva la parte selezionata). Nominiamo il nostro
nuovo file teepee1.mdl.
Premiamo [F3] e apriamo il file teepee1.mdl. Non c'è bisogno
di salvare il file originale. Quando è aperto il file, creiamo una
texture 'fasulla' (Moray non ci permetterebbe di esportare dati se non
vengono specificate texture). Utilizziamo il bianco con il finish predefinito
e lo nominiamo TeePeeTex. La applichiamo all'oggetto TeePee, salviamo il
file e poi premiamo [CTRL-F9]. Moray creerà due file : teepe1.inc
e teepee1.pov.
Usciamo da Moray e copiamo teepe1.inc e teepee1.pov nella
nostra directory di lavoro, dove stiamo svolgendo i tutorial. Creiamo un
nuovo file chiamandolo bezdemo1.pov e lo editiamo come segue.
#include "colors.inc"
camera {
location <0, .1, -60>
look_at 0
angle 40
}
background { color Gray25 } //per vedere meglio la patch
light_source { <300, 300, -700> White }
plane { y, -12
texture {
pigment {
checker
color Green
color Yellow
}
}
}
Per mezzo di un editor di testo, creiamo
e dichiariamo una semplice texture per il nostro oggetto.
#declare TeePeeTex = texture {
pigment {
color rgb <1, 1, 1,>
}
finish {
ambient .2
diffuse .6
}
}
Incolliamo i dati della patch dal file
teepee1.pov (eliminando le parole chiave 'in eccesso' come object
aggiunte da Moray) :
bicubic_patch {
type 1 flatness 0.0100 u_steps 3 v_steps 3,
<-5.174134, 5.528420, -13.211995>,
<-1.769023, 5.528420, 0.000000>,
<1.636088, 5.528420, 0.000000>,
<5.041199, 5.528420, -13.003932>,
<-5.174134, 1.862827, 0.000000>,
<0.038471, 0.031270, 18.101474>,
<0.036657, 0.031270, 18.101474>,
<5.041199, 1.862827, 0.000000>,
<-5.174134, -1.802766, 0.000000>,
<0.038471, 0.028792, 18.101474>,
<0.036657, 0.028792, 18.101474>,
<5.041199, -1.802766, 0.000000>,
<-5.174134, -5.468359, -13.070366>,
<-1.769023, -5.468359, 0.000000>,
<1.636088, -5.468359, 0.000000>,
<4.974128, -5.468359, -12.801446>
texture {
TeePeeTex
}
rotate -90*x // per orientare la patch al sistema di coordinate di POV-Ray
rotate 25*y // per vedere meglio le quattro 'zampe'
}
Aggiungiamo le rotazioni in modo che
la patch sia orientata al sistema di coordinate sinistrorso di POV-Ray
(la patch è stata fatta con Moray, in un sistema di coordinate destrorso)
e per vedere tutte e quattro le zampe. Renderizzando questa scena a 200x150
vediamo più o meno quello che ci aspettavamo, un 'tepee' bianco
su di un piano a scacchi verdi e gialli. Avviciniamoci di più, renderizzandolo
a 320x200.
![]() |
Fig. 10-Primo esempio
Ora vediamo che ci è sfuggito qualcosa.
Sembra che ci siano degli angoli netti, quasi delle sfaccettature, soprattutto
vicino alla cima. E' certamente un qualche tipo di sfaccettatura, dovuto
ai parametri U_STEPS
e V_STEPS.
Cambiamoli da 3 a 4 e vediamo cosa accade.
Molto meglio, ma il rendering ci ha messo un po' di più. Questo
è un compromesso inevitabile. Se vogliamo un dettaglio ancora più
fine, dobbiamo usare valori per U_STEPS
e V_STEPS
di 5 e impostare flatness
a zero. Ma dobbiamo aspettarci di usare molta più memoria ed un
tempo di rendering ancora più lungo.
Bene, non possiamo lasciare questa scena senza aggiungere qualche oggetto
per interesse. Dichiariamo l'oggetto patch e spargiamone un po' in giro :
#declare TeePee = bicubic_patch {
type 1 flatness 0.0100 u_steps 3 v_steps 3,
<-5.174134, 5.528420, -13.211995>,
<-1.769023, 5.528420, 0.000000>,
<1.636088, 5.528420, 0.000000>,
<5.041199, 5.528420, -13.003932>,
<-5.174134, 1.862827, 0.000000>,
<0.038471, 0.031270, 18.101474>,
<0.036657, 0.031270, 18.101474>,
<5.041199, 1.862827, 0.000000>,
<-5.174134, -1.802766, 0.000000>,
<0.038471, 0.028792, 18.101474>,
<0.036657, 0.028792, 18.101474>,
<5.041199, -1.802766, 0.000000>,
<-5.174134, -5.468359, -13.070366>,
<-1.769023, -5.468359, 0.000000>,
<1.636088, -5.468359, 0.000000>,
<4.974128, -5.468359, -12.801446>
texture {
TeePeeTex
}
rotate -90*x // per orientare correttamente l'oggetto
rotate 25*y // per vedere meglio le quattro 'zampe'
}
object { TeePee }
object { TeePee translate <8, 0, 8> }
object { TeePee translate <-9, 0, 9> }
object { TeePee translate <18, 0, 24> }
object { TeePee translate <-18, 0, 24> }
![]() |
Fig. 11-Aumentano gli oggetti
Sembra buono. Facciamo qualcosa per quel
noioso sfondo grigio. Eliminiamo la dichiarazione del background
e sostituiamola con :
plane { y, 500
texture { pigment { SkyBlue }
finish { ambient 1 diffuse 0} }
texture { pigment {
bozo turbulence .5
color_map { White]
White filter 1] } }
finish { ambient 1 diffuse 0 }
scale <1000, 250, 250> rotate <5,
45, 0> } }
Questo aggiunge un piacevole cielo riempito di nuvole.
![]() |
Fig. 12-Aggiungere un cielo
Ora, sostituiamo il piano a scacchi con
dune sabbiose ondulate :
plane {y,-12
texture {
pigment {
color <.85, .5, .15>
}
finish {
ambient .25
diffuse .6
crand .5
}
normal {
ripples .35
turbulence .25
frequency 5
}
scale 10
translate 50*x
}
}
Renderizziamo a 320x240 senza antialiasing.
![]() |
Fig. 13-Aggiungere della sabbia
Non male ! Aggiungiamo solo un altro
elemento. Mettiamo un 'uovo' dorato sotto ogni tepee. Dato che questo è
un tutorial sulle patch, facciamo le uova usando le patch.
Torniamo a Moray e creiamo un'altra patch. Diamole il nome Egg1 e selezioniamo
"CYLINDRICAL 2 - PATCH" dalla finestra di dialogo "CREATE
BEZIER PATCH". Facciamo clic su "EXTENDED EDIT". Ora "MARK
ALL" e ruotiamo la patch in modo che il cilindro giaccia su un lato.
"UNMARK ALL". Nella vista "FRONT" selezioniamo i quattro
punti all'estremità destra. Nella vista "SIDE", facciamo
clic col tasto destro del mouse e "MAXIMIZE". Zoomiamo un po'
più vicino. Col comando "UFRM SCL" avviciniamo i 4 punti
il più possibile. Zoomiamo ancora in avanti e ripetiamo. Zoomiamo
indietro, clic destro, "MINIMIZE". Selezioniamo "TRANSLATE"
e trasciniamo i punti a sinistra in modo che siano allineati sull'asse
Z col vicino gruppo di 4 punti. Questo dovrebbe creare un'estremità
chiusa. Ripetiamo questo procedimento per l'altra estremità. "UNMARK
ALL". Nella vista "FRONT" la griglia di controllo dovrebbe
essere un rettangolo e la patch un ellissoide. Tenendo premuto [SHIFT]
tracciamo un rettangolo attorno all'angolo superiore destro della griglia
di controllo per selezionare quei punti. Tracciamo un rettangolo attorno
all'estremità inferiore destra per selezionare anche quelli. Nella
vista "SIDE", si effettua un "UFRM SCL" su quei punti
per rendere un po' più larga quell'estremità dell'uovo. Infine,
"UNMARK ALL". L'uovo potrebbe avere bisogno di qualche aggiustatura.
Si dovrebbe riuscire a "MARK ALL" e "LOCAL SCL" le
tre viste per ottenere qualcosa che sembri un uovo. Avendo imparato dal
tepee, proseguiamo e cambiamo i valori di U_STEPS e V_STEPS a 4.
Creiamo un'altra texture fasulla, le diamo il nome EggTex e la assegnamo
all'uovo. Dal menu file, scegliamo "SAVE SEL" dando il nome egg1.mdl.
Carichiamo questo file ed esportiamo [CTRL F9]. Usciamo da Moray e copiamo
i file egg1.pov ed egg1.inc nella nostra directory.
Di ritorno al file bezdemo.pov creiamo una bella texture dorata
e brillante.
#declare EggTex = texture {
pigment { BrightGold }
finish {
ambient .1
diffuse .4
specular 1
roughness 0.001
reflection .5
metallic
}
}
già che ci siamo, miglioriamo
la nostra texture TeePeeTex :
#declare TeePeeTex = texture {
pigment { Silver }
finish {
ambient .1
diffuse .4
specular 1
roughness 0.001
reflection .5
metallic
}
}
Ora incolliamo i nostri dati della
patch relativa all'uovo e dichiariamo l'uovo :
#declare Egg = union { // Egg1
bicubic_patch {
type 1 flatness 0.0100 u_steps 4 v_steps 4,
<2.023314, 0.000000, 4.355987>,
<2.023314, -0.000726, 4.355987>,
<2.023312, -0.000726, 4.356867>,
<2.023312, 0.000000, 4.356867>,
<2.032037, 0.000000, 2.734598>,
<2.032037, -1.758562, 2.734598>,
<2.027431, -1.758562, 6.141971>,
<2.027431, 0.000000, 6.141971>,
<-1.045672, 0.000000, 3.281572>,
<-1.045672, -1.758562, 3.281572>,
<-1.050279, -1.758562, 5.414183>,
<-1.050279, 0.000000, 5.414183>,
<-1.044333, 0.000000, 4.341816>,
<-1.044333, -0.002947, 4.341816>,
<-1.044341, -0.002947, 4.345389>,
<-1.044341, 0.000000, 4.345389>
}
bicubic_patch {
type 1 flatness 0.0100 u_steps 4 v_steps 4,
<2.023312, 0.000000, 4.356867>,
<2.023312, 0.000726, 4.356867>,
<2.023314, 0.000726, 4.355987>,
<2.023314, 0.000000, 4.355987>,
<2.027431, 0.000000, 6.141971>,
<2.027431, 1.758562, 6.141971>,
<2.032037, 1.758562, 2.734598>,
<2.032037, 0.000000, 2.734598>,
<-1.050279, 0.000000, 5.414183>,
<-1.050279, 1.758562, 5.414183>,
<-1.045672, 1.758562, 3.281572>,
<-1.045672, 0.000000, 3.281572>,
<-1.044341, 0.000000, 4.345389>,
<-1.044341, 0.002947, 4.345389>,
<-1.044333, 0.002947, 4.341816>,
<-1.044333, 0.000000, 4.341816>
}
texture { EggTex }
translate <0.5, 0, -5> // centra l'uovo sull'origine
translate -9.8*y // mette l'uovo sul suolo
}
Ora mettiamo una copia dell'uovo sotto
ogni tepee. Questo dovrebbe richiederci di cambiare solo le coordinate
x e z di ogni uovo :
object { Egg }
object { Egg translate <8, 0, 8> }
object { Egg translate <-9, 0, 9> }
object { Egg translate <18, 0, 24> }
object { Egg translate <-18, 0, 24> }
Renderizziamo la scena a 320x240 -a.
Tutto va bene e possiamo renderizzarla a 640x480 +a.
![]() |
Fig. 14- Risultato finale
Possiamo vedere che c'è ancora qualche sfaccettatura vicino alla cima dei tepee e sulle uova. L'unica soluzione è di aumentare da 4 a 5 U_STEPS e V_STEPS e regolare flatness a zero per tutti i nostri oggetti. Facciamo i cambiamenti e renderizziamo a 640x480 +a.
![]() |
![]() |
![]() |