4.4.7.4 Estrusione
Conica ed Affusolamento.
Nel nostro prisma, la frase linear_sweep
è in effetti facoltativa. Questa
specifica il tipo di estrusione (linear
è il tipo predefinito) che viene adottato qualora non se ne specifichino
altri. Esiste tuttavia un altro tipo di estrusione estremamente utile :
l'estrusione conica. Il concetto è analogo a quello del prisma visto
in precedenza, eccetto che mentre estrudiamo la nostra curva dalla prima
quota alla seconda, la ingrandiamo dalle dimensioni di un singolo punto
fino a quando, raggiunta la seconda quota, la curva ha ripreso le dimensioni
originali della curva da cui l'abbiamo ottenuta. Per avere un idea di ciò
a cui servono questi effetti, sostituiamo il nostro prisma con questo (vedi
file prismdm5.pov)
prism {
conic_sweep
linear_spline
0, // quota 1
1, // quota 2
5, // il numero di punti che formano la curva...
<4,4>,<-4,4>,<-4,-4>,<4,-4>,<4,4>
rotate <180, 0, 0>
translate <0, 1, 0>
scale <1, 4, 1>
pigment { gradient y scale .2 }
}
![]() |
Fig. 34-Creare una piramide Usando l'Estrusione Conica
La colorazione gradient
è stata scelta per definire meglio il nostro oggetto senza dover
mettere a posto subito luci e macchina fotografica, ma quando lo renderizziamo,
cosa abbiamo ottenuto ? Una piramide a strisce orizzontali !
Per ora possiamo riconoscere la spline lineare che unisce i quattro vertici
di un quadrato ed il famoso punto finale che serve per chiudere la curva.
Nota tutte le trasformazioni nella frase di dichiarazione dell'oggetto.
Queste necessitano di una piccola spiegazione. La parte riguardante rotate
e translate
è semplice. Normalmente un oggetto conico parte nel pieno delle
sue dimensioni in cima e si restringe fino ad un punto per y=0, ma naturalmente
otterremmo un oggetto capovolto, se vogliamo fare una piramide. Allora
la capovolgiamo attorno all'asse delle x per metterla dritta e, dato che
in effetti abbiamo ruotato la piramide intorno
all'asse x, la trasliamo in modo di metterla nella stessa posizione in
cui era quando abbiamo iniziato.
La parte relativa al comando scale
serve per proporzionare il tutto in modo che si adatti a questo esempio.
La base è un quadrato di lato 8, ma l'altezza è di solo un'unità
e quindi l'abbiamo ristretta un poco nel senso della larghezza. A questo
punto pensiamo : "perché non traslare il quadrato di partenza
da y=0 a Y=4 per evitare tutto questo lavoro ?" Ecco un punto
importante ! Per vedere perché non funzionerebbe, proviamo
a metterlo in pratica (vedi file prismdm6.pov). Assicuriamoci di
rimuovere la frase scale
e poi sostituiamo la linea
1, //quota 2
con
4, //quota 2
che regola la seconda quota a 4, poi
renderizziamo di nuovo e vediamo se l'effetto è lo stesso.
![]() |
Fig. 35-La stessa piramide con l'altezza modificata
Ehi ! L'altezza è corretta,
ma la base della nostra piramide è immensa ! Cosa abbiamo sbagliato ?
Semplice. La base, per come l'abbiamo descritta con i punti che abbiamo
usato, si trova a y=1 indipendentemente dal valore della seconda quota.
Ma se impostiamo la seconda quota ad un valore maggiore di 1, dopo che
la piramide ha superato y=1, continua ad allargarsi uniformemente. Per
evitare di perdere il controllo di un prisma conico, è sempre meglio
impostare la seconda altezza ad 1 e usare un'istruzione scale
per dimensionare l'altezza. In questo modo possiamo essere sempre sicuri
che gli angoli della base restino dove vogliamo.
Questo conduce ad un'altra cosa interessante sulle estrusioni coniche.
Cosa facciamo se per un qualche motivo non vogliamo che l'estrusione avvenga
fino in cima ? Cosa facciamo se vogliamo ottenere, invece di una piramide,
qualcosa che assomigli di più ad uno ziggurat ? Facile. Dopo
avere rimesso ad uno la seconda quota ed avere rimesso a posto la frase
scale,
cambiamo la linea
0, //quota 1
in
2 //quota 1
![]() |
Fig. 36-Dopo aver aumentato la prima altezza
Quando renderizziamo di nuovo, vediamo che l'estrusione si ferma prima di finire in un punto, dandoci una piramide tronca. Quanto esattamente sia tronca dipende da quanto sono vicini i valori della prima e della seconda quota.
![]() |
![]() |
![]() |