7.5.7.2 Bounded_By
I calcoli necessari per determinare
se un raggio colpisce un oggetto possono impiegare molto tempo. Ogni raggio
deve essere provato su ogni oggetto nella scena. POV-Ray cerca di aumentare
la velocità del processo costruendo un insieme di scatole invisibili
chiamate bounding boxes che racchiudono gli oggetti. In questo modo,
un raggio che attraversa una parte della scena, non deve essere provato
di nuovo su oggetti che si trovano in un'altra parte lontana della scena.
Quando un gran numero di oggetti è presente, le scatole sono molto
vicine le une alle altre. POV-Ray può usare bounding boxes su ogni
oggetto finito ed anche su quadriche. Comunque, agli oggetti infiniti (come
piani, quartiche, cubiche e polinomiali) non può essere applicato
il bounding automaticamente. Il bounding viene applicato automaticamente
agli oggetti CSG solo se contengono oggetti finiti (ma in alcuni casi anche
se contengono oggetti infiniti). Ciò funziona applicando l'insieme
delle operazioni CSG alle bounding boxes per tutti gli oggetti compresi
nell'oggetto CSG. Per le operazioni di differenza ed intersezione questo
difficilmente porterà ad un bounding ottimale. Qualche volta (in
relazione alla complessità dell'oggetto CSG) potrà essere
meglio utilizzare la frase bounded_by{...}
su quegli oggetti.
Normalmente non è necessario usare il comando bounded_by,
ma ci sono casi in cui usarlo significa anche incrementare la velocità
del rendering di oggetti complessi. Gli oggetti che determinano il bounding
dicono a POV-Ray che l'oggetto 'bounded' è completamente racchiuso
in un oggetto più semplice (che viene definito all'interno della
frase bounded_by{...}).
Durante il rendering, i raggi sono prima provati sull'oggetto delimitante
(bounding box). Se i raggi lo colpiscono, il programma eseguirà
ulteriori prove sull'oggetto, più complicato, che si trova all'interno
dell'oggetto delimitante. Se ciò non avviene, l'intero oggetto complesso
sarà evitato con notevole incremento della velocità di rendering.
Per usare oggetti delimitanti, basta includere le seguenti linee nella
dichiarazione del tuo oggetto :
bounded_by {
object { ... }
}
Un esempio di oggetto delimitante :
intersection {
sphere { <0,0,0>, 2 }
plane { <0,1,0>, 0 }
plane { <1,0,0>, 0 }
bounded_by { sphere { <0,0,0>, 2 } }
}
I migliori oggetti delimitanti sono
sfere o parallelepipedi poiché questi oggetti sono molto ottimizzati,
comunque ogni oggetto può essere usato. Se lo stesso oggetto delimitante
è un oggetto finito che risponde alla suddivisione del bounding,
allora anche l'oggetto che racchiude rientrerà all'interno della
suddivisione.
Gli oggetti CSG possono trarre molto beneficio dal bounding anche senza
il comando bounded_by.
Comunque si possono presentare problemi in intersezioni, differenze e fusioni
(merge). In questi tre tipi di oggetti CSG il bounding automatico coprirà
interamente tutti i loro componenti. Comunque, il risultato di queste intersezioni
potrà essere un oggetto più piccolo. Confronta le dimensioni
per l'unione e l'intersezione nelle illustrazioni della sezione precedente.
E' possibile disegnare un parallelepipedo più piccolo intorno all'intersezione
di A e B rispetto a quello della loro unione, ma gli oggetti che delimitano
A e B saranno comunque grandi come l'unione di A e B a prescindere dal
tipo di operazione CSG specificata. E' quasi sempre una buona idea aggiungere
manualmente il comando bounded_by
a intersezioni, differenze e merge ed è spesso meglio non
applicare il bounding all'unione. Se l'unione non ha componenti del bounding
o del clipping POV-Ray può separare i componenti dell'unione ed
applicare il bounding automatico a ciascuno dei componenti finiti. Si deve
notare che alcune utility come raw2pov possono generare il bounding
con maggiore efficienza di POV-Ray. Comunque, si può applicare il
bounding automatico alla maggior parte delle unioni che possono essere
create. Per ragioni tecniche, POV-Ray non può suddividere un oggetto
merge nei suoi componenti. E' probabilmente meglio applicare il
bounding manualmente, soprattutto se l'oggetto è molto complesso.
E' da notare che se l'oggetto delimitante è troppo piccolo o in
una posizione sbagliata, potrebbe suddividere l'oggetto contenuto in maniere
imprevedibili oppure l'oggetto potrebbe non essere visibile. Per eseguire
il clipping di un oggetto, è necessario usare la parola chiave
clipped_by
come è specificato nel paragrafo precedente. E' possibile che tu
voglia usare clipped_by
e bounded_by
con lo stesso oggetto. Le frasi che seguono fanno in modo che si possa
risparmiare tempo di battitura ed usare meno memoria.
object {
Coso
clipped_by{ box { <0,0,0>,<1,1,1 > }}
bounded_by{ clipped_by }
}
Questo dice a POV-Ray di usare, come
oggetto delimitante, lo stesso parallelepipedo che era stato usato per
essere 'ritagliato' da Coso.