4.4.11 Toro
Un toro può essere pensato come
una ciambella o un tubo richiuso. E' un oggetto molto utile in molti tipi
di costruzioni CSG, così POV-Ray ha adottato questa superficie polinomiale
di 4° ordine come una primitiva. La sintassi per il toro è talmente
semplice da renderlo un oggetto molto comodo con cui lavorare, una volta
imparato cosa significano i due valori numerici. Invece di fare una lezione
sull'argomento, facciamone uno e sperimentiamoci un po' sopra.
Creiamo un file di nome tordemo.pov e lo editiamo come segue :
#include "colors.inc"
camera {
location <0, .1, -25>
look_at 0
angle 30
}
background { color Gray50 } // per vederlo meglio
light_source{ <300, 300, -1000> White }
torus { 4, 1 // raggi maggiore e minore
rotate -90*x // per vederlo da sopra
pigment { Green }
}
Tracciamo la scena e vediamo cosa succede.
![]() |
Fig. 52-Toro
Bene, è una ciambella. Proviamo
a cambiare i valori del raggio maggiore e minore e vediamo cosa succede.
Li modifichiamo come segue :
torus { 5, .25 // raggi maggiore e minore
![]() |
Fig. 53- Toro più sottile
Questo sembra di più un hula-hoop.
Proviamo questo :
torus { 3.5, 2.5 //raggi maggiore e minore
![]() |
Fig. 54-Toro
Ehi ! Una ciambella con un serio problema
di peso !
Con una sintassi così semplice, non c'è molto altro che possiamo
fare con un toro a parte cambiargli la texture...o si ? Vediamo...
i tori sono oggetti molto utili in CSG. Tentiamo un piccolo esperimento.
Facciamo la differenza tra un toro ed un parallelepipedo :
difference {
torus { 4, 1
rotate x*-90 // così possiamo vederlo da sopra
}
box { <-5, -5, -1>, <5, 0, 1> }
pigment { Green }
}
![]() |
Fig. 55- Mezzo toro
Interessante...un mezzo toro. Ora ne aggiungiamo
un altro ruotato dall'altra parte. Però, dichiariamo il primo mezzo
toro e le trasformazioni necessarie in modo da poterlo riutilizzare :
#declare Half_Torus = difference { // Half
Torus significa "mezzo toro"
torus { 4, 1
rotate -90*x // così possiamo vederlo da sopra
}
box { <-5, -5, -1>, <5, 0, 1> }
pigment { Green }
}
#declare Flip_It_Over = 180*x // Flip It Over significa "capovolgilo"
#declare Torus_Translate = 8 // Il doppio del raggio maggiore
Ora creiamo un'unione dei due mezzi
tori :
union {
object { Half_Torus }
object { Half_Torus
rotate Flip_It_Over
translate Torus_Translate*x
}
}
![]() |
Fig. 56- I due mezzi tori sfalsati
Questo ci dà un oggetto a forma
di S, ma non riusciamo a vederlo interamente dalla nostra posizione attuale.
Aggiungiamo un altro po' di anelli, tre in ogni direzione, spostiamo l'oggetto
in direzione +z e ruotiamolo in direzione -y in modo da poterne vedere
di più. Notiamo anche che pare esserci un vuoto nel punto dove i
mezzi tori si incontrano. Questo è dovuto al fatto che stiamo osservando
la scena giacendo sul piano x-z. Cambieremo la coordinata y della macchina
fotografica da 0 a 0.1 in modo da eliminare questo inconveniente.
union {
object { Half_Torus }
object { Half_Torus
rotate Flip_It_Over
translate x*Torus_Translate
}
object { Half_Torus
translate x*Torus_Translate*2
}
object { Half_Torus
rotate Flip_It_Over
translate x*Torus_Translate*3
}
object { Half_Torus
rotate Flip_It_Over
translate -x*Torus_Translate
}
object { Half_Torus
translate -x*Torus_Translate*2
}
object { Half_Torus
rotate Flip_It_Over
translate -x*Torus_Translate*3
}
object { Half_Torus
translate -x*Torus_Translate*4
}
rotate y*45
translate z*20
}
![]() |
Fig. 57- "Serpente" formato da mezzi tori
Renderizzando questa scena vediamo qualcosa
di ondulante, serpentiforme, o qualcosa del genere. Carino. Ma vogliamo
fare qualcosa di utile, qualcosa che possiamo vedere nella vita reale.
Che ne diresti di una catena ? Pensandoci un momento ci accorgiamo
che un singolo anello di una catena può essere facilmente realizzato
usando due mezzi tori e due cilindri per unire le due metà. Creiamo
un nuovo file ed usiamo le stesse impostazioni di macchina fotografica,
sfondo, sorgenti luminose e oggetti dichiarati che abbiamo usato in tordemo.pov.
#include "colors.inc"
camera {
location <0, .1, -40>
look_at 0
angle 30
}
background { color Gray50 }
light_source{ <300, 300, -1000> White }
#declare Half_Torus = difference {
torus { 4,1
sturm
rotate x*-90 // così possiamo vederlo da sopra
}
box { <-5, -5, -1>, <5, 0, 1> }
pigment { Green }
}
#declare Flip_It_Over = x*180
#declare Torus_Translate = 8
Ora, facciamo un toro completo usando
le due metà :
union {
object { Half_Torus }
object { Half_Torus rotate Flip_It_Over }
}
Questa può sembrare una maniera
inutile per fare un toro competo, ma in effetti stiamo per allontanare
le due metà in modo da fare spazio per i cilindri. Per prima cosa,
aggiungiamo prima del blocco union
il cilindro dichiarato :
#declare Chain_Segment = cylinder { <0,
4, 0>, <0, -4, 0>, 1
pigment { Green }
}
Poi aggiungiamo due segmenti di catena
all'unione e li trasliamo in modo che si allineino col raggio minore del
toro su entrambi i lati :
union {
object { Half_Torus }
object { Half_Torus rotate Flip_It_Over }
object { Chain_Segment translate x*Torus_Translate/2 }
object { Chain_Segment translate -x*Torus_Translate/2 }
}
Ora trasliamo i due mezzi tori di +y
e -y in modo che le estremità tronche si incontrino con le estremità
dei cilindri. Questa distanza è uguale alla metà del valore
Torus_Translate
precedentemente dichiarato :
union {
object { Half_Torus
translate y*Torus_Translate/2
}
object { Half_Torus
rotate Flip_It_Over
translate -y*Torus_Translate/2
}
object { Chain_Segment
translate x*Torus_Translate/2
}
object { Chain_Segment
translate -x*Torus_Translate/2
}
}
Renderizziamo questa scena e voilà !
![]() |
Fig. 58-Anello di una catena
Un anello di una catena. Ma non abbiamo
ancora finito ! Chi ha mai sentito parlare di una catena verde ?
Preferiremmo invece usare un bel colore metallico. Per prima cosa, eliminiamo
tutti i blocchi pigment
nelle dichiarazioni di tori e cilindri. Poi aggiungiamo queste righe prima
di union :
#declare Chain_Gold = texture {
pigment { BrightGold }
finish {
ambient .1
diffuse .4
reflection .25
specular 1
metallic
}
}
E quindi aggiungiamo la texture all'unione
e dichiariamo l'unione come un singolo anello :
#declare Link = union {
object { Half_Torus
translate y*Torus_Translate/2
}
object { Half_Torus
rotate Flip_It_Over
translate -y*Torus_Translate/2
}
object { Chain_Segment
translate x*Torus_Translate/2
}
object { Chain_Segment
translate -x*Torus_Translate/2
}
texture { Chain_Gold }
}
Ora facciamo un'unione di due anelli.
Il secondo dovrà essere traslato di +y in modo che la sua parete
interna si incontri appena con la parete interna dell'altra maglia, proprio
come gli anelli di una catena. Questa distanza è il doppio della
distanza Torus_Translate meno
2 (due volte il raggio minore). Si può descrivere con l'espressione :
Torus_Translate*2-2*y
E noi dichiariamo l'espressione come
segue :
#declare Link_Translate= Torus_Translate*2-2*y
Nella parte relativa all'oggetto, useremo
questo blocco per moltiplicarlo in modo da creare altri anelli. Ora, ruotiamo
il secondo anello di 90*y in modo che sia perpendicolare al primo, come
gli anelli di una catena. Infine, scaliamo l'unione di 0.25 in modo da
poter vedere l'intera cosa :
union {
object { Link }
object { Link translate y*Link_Translate rotate y*90 }
scale .25
}
Renderizziamo questa scena e vedremo
un paio di anelli molto realistico.
![]() |
Fig. 59-Due anelli
Se vogliamo fare un'intera catena, dobbiamo
dichiarare l'unione vista sopra e creare un'altra unione di questo oggetto
dichiarato. Dobbiamo essere sicuri di rimuovere la frase scale
dall'oggetto dichiarato :
#declare Link_Pair =
union {
object { Link }
object { Link translate y*Link_Translate rotate y*90 }
}
Ora dichiariamo la nostra catena :
#declare Chain = union {
object { Link_Pair}
object { Link_Pair translate y*Link_Translate*2 }
object { Link_Pair translate y*Link_Translate*4 }
object { Link_Pair translate y*Link_Translate*6 }
object { Link_Pair translate -y*Link_Translate*2 }
object { Link_Pair translate -y*Link_Translate*4 }
object { Link_Pair translate -y*Link_Translate*6 }
}
Ed infine, creiamo la nostra catena,
con un paio di trasformazioni affinché sia più facile vederla.
Queste includono rimpicciolirla di un fattore 10 e ruotarla in modo che
si possano vedere bene tutti gli anelli.
object { Chain scale .1 rotate <0, 45,
-45> }
![]() |
Fig. 60-I Tori possono essere usati per creare catene
Renderizziamo questa scena e dovremmo vedere una catena dorata molto realistica che si estende diagonalmente attraverso lo schermo
![]() |
![]() |
![]() |