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.