3.3.9 Les modificateurs d'objet

Une variété de modificateurs peuvent être attachés aux objets. Les éléments suivants peuvent être appliqués à tous les objets :

OBJECT_MODIFIER:
	clipped_by { UNTEXTURED_SOLID_OBJECT... } |
	clipped_by { bounded_by } |
	bounded_by { UNTEXTURED_SOLID_OBJECT... } |
	bounded_by { clipped_by } |
	no_shadow |
	no_image [ Bool ] |
	no_reflection [ Bool ] |
	inverse |
	sturm [ Bool ] |
	hierarchy [ Bool ] |
	double_illuminate [ Bool ] |
	hollow [ Bool ] |
	interior { INTERIOR_ITEMS... } |
	material { [MATERIAL_IDENTIFIER][MATERIAL_ITEMS...] } |
	texture { TEXTURE_BODY } |
	interior_texture { TEXTURE_BODY } |
	pigment { PIGMENT_BODY } |
	normal { NORMAL_BODY } |
	finish { FINISH_ITEMS... } |
	photons { PHOTON_ITEMS...}
	TRANSFORMATION

Des transformations comme le déplacement, la rotation ou la taille ont déjà été vues. Les textures, ainsi que les pigments, la normale et la finition, comme l'intérieur et le média (qui est une partie de l'intérieur) ont leur propre section. Dans les sections suivantes, nous traiterons d'autres modificateurs importants : clipped_by, bounded_by, material, inverse, hollow, no_shadow, no_image, no_reflection, double_illuminate et sturm. Bien que les exemples ci-dessous utilisent des déclarations d'objets, et des identificateurs d'objets, ces modificateurs peuvent être utilisés sur tout type d'objet, comme la sphère, la boîte, etc.

3.3.9.1 'clipped_by'

La déclaration clipped_by est techniquement un modificateur d'objet, mais il produit un type de CSG similaire à l'intersection CSG. La syntaxe est :

CLIPPED_BY:
	clipped_by { UNTEXTURED_SOLID_OBJECT... } |
	clipped_by { bounded_by }

UNTEXTURED_SOLID_OBJECT est un ou plusieurs objets solides sans aucune texture. Par exemple :

object {
	My_Thing
	clipped_by {plane {y, 0}}
}

Tout morceau de My_Thing, qui est dans le plan, est retenu, tandis que les morceaux restants sont coupés et ôtés. Dans un objet d'intersection, le trou est fermé. Avec clipped_by, il reste ouvert. Par exemple, la figure suivante montre l'objet A coupé par l'objet B.

Un objet coupé par un autre
Un objet coupé par un autre

Vous pouvez utiliser clipped_by pour éliminer certaines portions d'une forme. Dans la plupart des cas, il donnera aussi des temps de rendu plus rapides que les autres méthodes d'altération d'une forme. Pour le cas où vous voudriez utiliser les options clipped_by et bounded_by avec le même objet, le raccourci suivant évite la frappe, et utilise moins de mémoire.

object {
	My_Thing
	bounded_by {box {<0, 0, 0>, <1, 1, 1>}}
	clipped_by {bounded_by}
}

Cela dit à POV-Ray d'utiliser la même boîte pour couper et encapsuler.

3.3.9.2 'bounded_by'

Les calculs nécessaires pour tester si un rayon touche un objet peuvent être voraces en temps. Chaque rayon doit être testé pour tous les objets de la scène. POV-Ray essaye d'accélérer le processus en construisant une série de boîtes invisibles, appelées boîtes encapsulantes, qui regroupent les objets ensembles. Ainsi, un rayon qui voyage à un endroit de la scène, ne doit pas être testé pour les objets à d'autres lieux. Quand un grand nombre d'objets sont présents, les boîtes sont emboîtées les unes dans les autres. POV-Ray peut utiliser les boîtes encapsulantes sur tout objet fini, et quelque fois sur certains quadriques coupés ou encapsulés. Toutefois, les objets infinis (comme les plans, les quartiques, les cubiques et poly) ne peuvent pas être encapsulés automatiquement. Les objets CSG sont automatiquement encapsulés s'ils contiennent des objets finis (infinis dans quelques cas). Cela fonctionne par application des opérations de la CSG sur les boîtes encapsulantes de tous les objets dans la CSG. Pour les différences et les intersections, cela abouti toujours difficilement à une boîte optimisée. Il est parfois préférable (selon la complexité de l'objet CSG) d'utiliser la déclaration bounded_by avec de telles formes.

Normalement, les formes encapsulantes ne sont pas nécessaires, mais il y a des cas où elles peuvent accélérer le rendu d'objets complexes. Les formes encapsulantes disent au raytraceur que l'objet est totalement encapsulé dans une forme simple. Pendant le traçage, le rayon est d'abord testé sur les formes encapsulantes simples. S'il en rencontre une, le rayon est à nouveau testé sur l'objet interne plus compliqué. Sinon, la forme complexe complète est sautée, ce qui accélère grandement le rendu. La syntaxe est :

BOUNDED_BY:
	bounded_by { UNTEXTURED_SOLID_OBJECT... } |
	bounded_by { clipped_by }

UNTEXTURED_SOLID_OBJECT est un ou plusieurs objets solides qui n'ont pas de texture. Par exemple :

intersection {
	sphere {<0, 0, 0>, 2}
	plane {<0, 1, 0>, 0}
	plane {<1, 0, 0>, 0}
	bounded_by {sphere {<0, 0, 0>, 2}}
}

La meilleure forme encapsulante est la sphère ou la boîte, car ces formes sont grandement optimisées, mais bien sûr, toute forme peut être utilisée. Si la forme encapsulante est elle-même une forme finie qui répond au bloc d'encapsulage, alors l'objet inclus sera aussi utilisé dans le système du bloc.

Tandis qu'il est toujours préférable de faire un ajout manuel de bounded_by aux intersections, différences et fusions, il est souvent judicieux de ne jamais encapsuler une union. Si une union n'a pas bounded_by, POV-Ray peut découper les composants de l'union et encapsuler automatiquement les éléments finis. Notez que certains utilitaires comme raw2pov peuvent être capables de générer des capsules plus efficaces que POV-Ray. Toutefois, la plupart des unions que vous créez peuvent facilement être encapsulées par le système automatique. Pour des raisons techniques, POV-Ray ne peut pas découper un objet fusionné. Il est probablement mieux d'encapsuler manuellement une fusion, surtout si elle est très complexe.

Note : si la forme encapsulante est trop petite, ou mal positionnée, elle peut amputer la forme de manière imprévisible, ou l'objet peut disparaître. Pour faire de réels découpages, utilisez clipped_by comme expliqué précédemment. Souvent, vous voudrez utiliser les options clipped_by et bounded_by sur le même objet. Le raccourci suivant évite des frappes, et utilise moins de mémoire.

object {
	My_Thing
	clipped_by {box {<0, 0, 0>, <1, 1, 1>}}
	bounded_by {clipped_by}
}

Cela dit à POV-Ray d'encapsuler avec la même boîte que celle du découpage.

3.3.9.3 Matériau

L'un des changements de POV-Ray 3.1 a été d'enlever plusieurs éléments de texture { finish{...} } et de les déplacer dans une nouvelle caractéristique interior. La caractéristique halo, faisant précédemment partie de la texture, s'appelle maintenant media et fait partie de interior. Ce changement fut délibéré et discuté (voir "Pourquoi Interior et Media sont-ils nécessaires ?"), toutefois les testeurs signalèrent qu'il était difficile de décrire entièrement les propriétés de surface et l'intérieur d'un objet dans une seule déclaration pouvant être référencée dans une bibliothèque de textures.

Le résultat fut la création d'une 'enveloppe' autour de texture et interior que nous avons appelé le material.

La syntaxe est :

MATERIAL:
	material { [MATERIAL_IDENTIFIER][MATERIAL_ITEMS...] }
MATERIAL_ITEMS:
	TEXTURE | INTERIOR_TEXTURE | INTERIOR | TRANSFORMATIONS

Par exemple :

#declare MyGlass = material {texture {Glass_T} interior {Glass_I}}
object {MyObject material {MyGlass}}

En interne, le 'matériau' n'est pas attaché à l'objet. C'est seulement un conteneur qui apporte la texture et l'intérieur à l'objet. Ce sont la texture et l'intérieur qui sont attachés à l'objet. Les utilisateurs doivent toujours considérer la texture et l'intérieur comme des éléments séparés attachés à l'objet.

Le matériau est juste le 'porteur'. Si l'objet a déjà une texture, celle du matériau est empilée dessus. Si l'objet a un intérieur, celui du matériau le remplace totalement. Les transformations au sein du matériau ne concernent que ses textures et intérieurs, et seulement ceux spécifiés. Par exemple :

object {
	MyObject
	material {
		texture {MyTexture}
		scale 4	//affecte la texture mais ni l'objet, ni l'intérieur
		interior {MyInterior}
		translate 5*x	//affecte la texture et l'intérieur, pas l'objet
	}
}

Note : la déclaration material n'a rien à voir avec le material_map. Un material_map n'est pas un moyen de créer un spectre de matériaux. Voir "Les spectres de matériaux" pour des explications sur cette ancienne caractéristique sans lien.

3.3.9.4 Inverse

Pendant l'utilisation d'un CSG, il est souvent utile d'inverser un objet pour que son intérieur devienne extérieur. L'apparence de l'objet n'est pas changée, seulement la façon dont POV-Ray le perçoit. Quand le mot clé inverse est utilisé, l'intérieur de la forme devient l'extérieur, et vice versa. Par exemple :

object {MyObject inverse}

La distinction dedans/dehors est également importante lorsque vous attachez un interior à un objet, spécialement si media est aussi utilisé. Le média atmosphérique et le brouillard ne fonctionnent également pas bien si la caméra est dans un objet. L'utilisation de inverse est utile pour corriger ce problème.

3.3.9.5 Creux

POV-Ray assume par défaut que les objets sont pleins. Par ajout du mot clé hollow à l'objet, vous pouvez le rendre creux, voyez aussi le chapitre "Les objets vides et pleins". Cela est très utile si vous voulez des effets atmosphériques dans un objet. C'est aussi obligatoire pour les objets contenant un média d'intérieur. Le mot clé peut être optionnellement suivi par une expression numérique interprétée comme une valeur booléenne. Par exemple hollow off peut être utilisé pour le désactiver. Quand le mot clé est seul, il y a activation. Le défaut est off quand hollow n'est pas spécifié.

Pour obtenir un objet CSG creux, vous devez seulement rendre l'objet de premier niveau creux. Tous les enfants prendront l'état creux, sauf si leur état est décrit explicitement. L'exemple suivant place deux sphères dans une union creuse.

union {
	sphere {-0.5*x, 1}
	sphere {0.5*x, 1}
	hollow
}

tandis que l'exemple suivant ne déclare que la seconde sphère creuse, car la première est explicitement non creuse.

union {
	sphere {-0.5*x, 1 hollow off}
	sphere {0.5*x, 1}
	hollow on
}

3.3.9.6 Pas d'ombre

Vous pouvez spécifier le mot clé no_shadow à un objet pour qu'il ne dispense pas d'ombre. Cela est utile pour des effets spéciaux, et pour créer l'illusion qu'une source de lumière est visible. Ce mot clé était nécessaire pour les versions précédentes, qui ne disposaient pas de la déclaration looks_like. Maintenant, c'est utile pour créer des choses ressemblant à des rayons lasers, ou d'autres effets irréels. Pendant les test de rendu, le processus est accéléré si no_shadow est appliqué.

Attachez simplement le mot clé comme ceci :

object {
	My_Thing
	no_shadow
}

3.3.9.7 'no_image', 'no_reflection'

Syntaxe :

OBJECT {
	[OBJECT_ITEMS...]
	no_image
	no_reflection
}

Ces deux mots clés sont très similaires dans l'usage et le fonctionnement au mot clé no_shadow, et contrôlent la visibilité d'un objet.
Vous pouvez utiliser toute combinaison des trois avec votre objet.

Quand no_image est utilisé, l'objet ne sera pas vu par la caméra, de manière directe comme à travers des objets transparents/réfractants. Toutefois, il continuera de porter des ombres, et apparaîtra dans les réflexions (sauf si no_reflection et/ou no_shadow sont aussi utilisés).

Quand no_reflection est utilisé, l'objet n'apparaîtra pas dans les réflexions. Il sera vu par la caméra (et à travers des objets transparents/réfractants) et portera des ombres, sauf si no_image et/ou no_shadow sont utilisés.

En utilisant ces trois mots clés, vous pouvez produire des effets intéressants comme une sphère donnant une ombre rectangulaire, un cube qui apparaît comme un cône dans les miroirs, etc.

3.3.9.8 'double_illuminate'

Syntaxe :

OBJECT {
	[OBJECT_ITEMS...]
	double_illuminate
}

Une surface a deux côtés; habituellement, seul le côté qui fait face à la source de lumière est illuminé, l'autre reste dans l'ombre. Quand double_illuminate est utilisé, l'autre côté est aussi illuminé.
Cela est utile pour simuler la translucidité (comme dans un protège-lampe, morceau de papier, etc).

Note : double_illuminate illumine seulement les deux côtés de la même surface, donc pour une sphère, par exemple, vous ne verrez pas l'effet sauf si la sphère est partiellement transparente, ou si la caméra est à l'intérieur et la source de lumière à l'extérieur de la sphère (ou vise versa).

3.3.9.9 'sturm'

Certains des objets de POV-Ray vous permettent de choisir entre un calculateur de racine rapide, mais quelque fois imprécis, et un autre, plus lent mais plus précis. C'est le cas pour tous les objets qui appellent une solution pour un polynôme cubique ou quartique. Il y a des solutions mathématiques analytiques qui peuvent être utilisées pour ces polynômes.

Les polynômes de bas ordre sont aisés à résoudre, tandis que ceux d'ordre élevé requièrent des algorithmes itératifs. L'un de ces derniers est le calculateur de racine de Sturmian. Par exemple :

blob {
	threshold .65
	sphere {<.5, 0, 0>, .8, 1}
	sphere {<-.5, 0, 0>, .8, 1}
	sturm
}

Le mot clé peut être optionnellement suivi d'une expression numérique interprétée comme une valeur booléenne. Par exemple, sturm off peut être utilisé pour le désactiver. Quand le mot clé est utilisé seul, c'est la même chose que sturm on.Le défaut est l'inactivation quand il n'est pas spécifié.

La liste suivante montre tous les objets qui peuvent l'utiliser.

Complément sur la texture

Complément sur le média Complément sur l'intérieur Complément sur le CSG

3.3.8 Les groupes de lumières 3.3.8 Les groupes de lumières 3.4 Les textures 3.4 Les textures