vers l'index général de l'aide

vers l'index des motifs

motifs - turbulence et warp

objectif

Appliquer aux motifs des modifications spatiales, suivant des algorithmes particuliers, essentiellement destinés à briser leur régularité.

turbulence

Imaginez que les motifs soient en fait un liquide composé de plusieurs liquides colorés entremêlés. Si vous soufflez doucement sur ce liquide, vous allez provoquer de petits tourbillons, vaguelettes, et les couleurs seront un peu secouées. C'est plus ou moins ce que fait turbulence.

turbulence est suivi d'un vecteur, qui indique en quelque sorte dans quelle direction et avec quelle force on souffle sur le motif.

pigment {... turbulence <1,.1,0>}

...veut dire qu'on "souffle" un bon coup dans la direction x, un tout petit peu dans la direction y, et pas du tout vers z.

En fait, pour appliquer de la turbulence, POV-Ray effectue quelques déplacements (pseudo-)aléatoires sur les points qui constituent le motif. On peut contrôler la façon dont ce déplacement s'effectue à l'aide de trois mots clés :

octaves : suivi d'un entier, spécifie le nombre de ces déplacements successifs (de 1 à 10). La valeur par défaut est 6, ce qui est déjà beaucoup.

lambda : spécifie à quel point chaque nouveau déplacement peut (statistiquement) être différent du précédent. La valeur par défaut est de 2, ce qui est beaucoup. Des valeurs plus faibles rendent la turbulence plus "sage".

omega : spécifie quelle est le rapport de distance entre deux déplacement successifs. La valeur par défaut de 0.5 fait en sorte que chaque déplacement est deux fois plus court que le précédent (et, ici, les musiciens comprendront pourquoi on parle d'"octaves").

Exemple :

pigment {... turbulence <1,.1,0>
                    octaves 5  // 5 déplacements
                    lambda 1.5 // variation de direction un peu moins forte que d'hab'
                    omega 1/3  // chaque déplacement aura 1/3 de la longueur du précédent
                    }
  

Important : lorsque le motif subit plusieurs transformations (scale, rotate,...), la turbulence est TOUJOURS appliquée en premier lieu, quel que soit son emplacement parmi les autres transformations. Seul l'usage de warp (voir ci-dessous) permet de parer à cet inconvénient.

Note : plus la valeur d'octaves est grande, plus il y a de déplacements à calculer, et donc plus le rendu de ce motif sera long à éxécuter. Veillez donc à utiliser une valeur d'octaves qui vous convient, plutôt que d'utiliser la valeur pas défaut qui est assez élevée.

MegaPOV

La fonction vturbulence() renvoie les valeurs de turbulence utilisées par POV-Ray. Cela permet, entre autres, de disposer de vecteurs (pseudo-)aléatoires qui sont relativement cohérents dans l'espace, c'est-à-dire, que le vecteur généré pour un point donné de l'espace sera similaire en longueur et en direction à celui généré pour un autre point proche du premier.

vturbulence(Lbd, Omg, Oct, Pt) renvoie un vecteur dépendant des 4 paramètres qu'on lui passe, les 3 premiers ayant la même signification que pour turbulence. Ce vecteur correspond donc au déplacement généré par turbulence 1 octaves Oct lambda Lbd omega Omg appliqué au point Pt.

octaves 1octaves 2octaves 4octaves 10
lambda 1lambda 2lambda 4lambda 8
omega .2omega .4omega .6omega .8

warp

warp est un modificateur de motif très versatile, impliquant toujours une notion de "déplacement" des points d'un motif. Sa syntaxe générale est :

warp {...}

et il se place parmi les autres modificateurs de motifs, plus particulièrement avec scale, rotate, et translate, avec lesquels il interagit au niveau de l'ordre des transformations.

turbulence

C'est le type de warp le plus simple, qui permet tout simplement d'appliquer une turbulence à un endroit précis de la structure des modificateurs. En effet, comme on vient de le voir, la turbulence "ordinaire" est toujours appliquée avant les autres transformations, ce qui veut dire que entre ce code-ci :

pigment {gradient y color_map {...}
         scale 2 turbulence .1 rotate z*24
         }

et celui-ci :

pigment {gradient y color_map {...}
         scale 2 rotate z*24 turbulence .1
         }

..il n'y aura pas de différence. Pour que la turbulence soit appliquée exactement au moment où elle est invoquée, il faut la placer dans une définition de warp :

pigment {gradient y color_map {...}
         scale 2 rotate z*24 warp {turbulence .1}
         }

Ainsi, la turbulence sera appliquée au motif déjà transformé par les opérations précédentes.

La définition de la turbulence à l'intérieur de warp peut s'accompagner des paramètres habituels : octaves, lambda, et omega.

repeat

Le type repeat permet de répéter ad libitum une "tranche" de motif. Pour définir l'épaisseur et l'orientation de la tranche, on fait suivre le mot clé repeat d'un vecteur (qui doit toujours être le long d'un des 3 axes x, y ou z):

 pigment {bozo 
          warp {repeat <1.5,0,0>}
         } 

Le code ci-dessus prend une tranche de motif entre x=0 et x=1.5, et la répète à l'infini. Pour éviter un aspect trop répétitif, on peut employer le mot clé offset, qui, suivi d'un vecteur, indique le décalage à faire subir au motif à chaque nouvelle tranche. Cela peut servir à simuler certains appareillages de pierre, où des tranches successives d'un même bloc sont utilisées pour couvrir un mur.

 pigment {bozo 
          warp {repeat <1.5,0,0> offset y*.1}
         } 

On peut également faire subir une "inversion" au motif à chaque répétition. Pour cela, on utilise le mot clé flip suivit d'un vecteur. Les coordonnées non nulles de ce vecteur correspondent aux axes suivant lesquels on fait l'inversion:

 pigment {bozo 
          warp {repeat <1.5,0,0> flip <2,0,1>}
         } 

Dans cet exemple, le motif est inversé suivant les axes x et z à chaque répétition.

black_hole

Comme son nom l'indique, black_hole ("trou noir") provoque, en certains points de l'espace, l'aspiration du motif sur lui-même !

warp {
	black_hole  Centre, Rayon   // le centre du trou noir, et son rayon d'action
	strength    Decimal         // la force du trou noir
	falloff     Decimal         // la facon dont elle décroit en s'éloignant du centre
	inverse                     // un trou noir "répulsif"
	repeat      Vecteur         // répétition du trou noir
	turbulence  Vecteur         // un peu de piment dans la répétition....
}

Les deux premiers paramètres (Centre et Rayon) sont obligatoires. Tous les autres sont optionnels. Centre est un vecteur qui définit la position du centre du trou noir, là où sa force est la plus grande, alors que Rayon est le rayon d'action du trou noir. Les points à l'intérieur du trou noir sont "attirés" vers le centre, avec une force qui dépend de leur distance au centre. Plus le point est près du centre, plus la force exercée est grande, pour devenir nulle sur le périmètre du trou noir. Les points au-delà du rayon d'action ne sont pas perturbés par le trou noir.

La force du trou noir, c'est-à-dire l'amplitude des déplacements qu'il provoque, peut être pondérée par le mot clé strength. Une valeur supérieure à 1 (la valeur par défaut) augmentera sa force, alors qu'une valeur inférieure la diminuera.

La manière dont la force décroît en fonction de l'éloignement du centre est paramétrée par le mot clé falloff. Pour une valeur de 1, la décroissance est linéaire. La valeur par défaut 2 donne une force inversement proportionnelle au carré de la distance, elle décroît donc plus rapidement autour du centre et plus lentement en arrivant sur le périmètre. Il en est de même pour toutes les valeurs supérieures à 1. Les valeurs inférieures à 1 vont donner une décroissance lente autour du centre, et brutale en arrivant sur le périmètre.

Attention, une valeur de falloff inférieure à 1 en conjonction avec une valeur de strength supérieure à 1 peut donner des discontinuités au niveau du périmètre du trou noir.

On s'aperçoit très vite qu'il est difficile d'obtenir exactement ce que l'on désire. Un moyen d'y arriver est de commencer avec des valeurs de falloff et strength identiques et supérieures à 1. Après, on tatonne...

inverse, au lieu d'attirer le motif vers le centre, permet de le repousser vers la périphérie du trou noir.

Pour créer plusieurs trous noirs du même type, à intervalles réguliers, il faut utiliser le mot clé repeat. Celui-ci est suivi d'un vecteur qui va permettre d'échantillonner l'espace compris entre <0, 0, 0> et Vecteur, et de le répéter dans toutes les directions. Bien évidemment, ceci est intéressant uniquement si le trou noir se situe intégralement dans ce morceau d'espace. Au cas où le trou noir déborderait du "cube" spécifié par repeat, soit le "cube" sera agrandi, soit le centre du trou noir déplacé, et POV-Ray émettra un warning.

Si l'une des composantes de Vecteur est nulle, il n'y aura pas de répétition suivant cet axe.

turbulence ne peut s'utiliser qu'en conjonction avec repeat. Il permet d'ajouter de la perturbation à la manière dont le modificateur est appliqué, en décalant à chaque répétition le centre du trou noir. Les valeurs maximales de déplacement suivant chaque axe sont données par le vecteur qui suit turbulence. Là encore, on prêtera attention à ne pas spécifier des valeurs qui feraient déborder le trou noir, les résultats seraient alors imprévisibles.

// Un exemple:
warp
{
	black_hole <0.15, 0.125, 0>, 0.5
	falloff 3
	strength 1.0
	repeat <1.25, 1.25, 0>
	turbulence <0.25, 0.25, 0>
	inverse
}

cylindrical, spherical, toroidal, planar

MegaPOV

warp {
	spherical
	[ orientation Vecteur | dist_exp Décimal ]
}
warp {
	cylindrical
	[ orientation Vecteur | dist_exp Décimal ]
}
warp {
	toroidal
	[ orientation Vecteur | dist_exp Décimal | major_radius Décimal ]
}

Ces types de warp prennent la surface du motif comprise entre <0,0> et <1,1> sur le plan XY, et la projettent dans l'espace un peu à la manière d'une image_map, selon le mode de projection choisi. Les règles d'application géométrique du motif sont les mêmes que pour les image_map.

#declare Pig1 = 
 pigment {checker color YellowGreen color OrangeRed
          scale .1}

plane  {y,0 pigment {Pig1 warp {spherical}}}
sphere {0,1 pigment {Pig1 warp {spherical}}}

Autre exemple, avec un warp toroidal :

plane  {y,0 pigment {Pig1 warp {toroidal}}}
torus {1,.5 pigment {Pig1 warp {toroidal}}}

reset_children

MegaPOV

On veut parfois utiliser une texture_map, pigment_map, etc... avec un motif perturbé ou transformé, mais sans que les perturbations ou les transformations apparaissent dans les motifs définis à l'intérieur de la xxx_map. Il suffit pour cela de déclarer un warp { reset_children } pour inhiber les transformations.

Comme toujours, l'ordre de déclaration est important, et seules les transformations déclarées avant le reset_children seront annulées au niveau des motifs enfants.

#declare Pig1 = pigment {
	checker  Black, White
	scale .3
}

#declare Pig2 = pigment {
	hexagon  YellowGreen, OrangeRed, SteelBlue
	scale .3
	rotate x*90
}


box { <-3, -3, 0>, <0, 3, 1>
	pigment {
		bozo
		turbulence 1 octaves 3 lambda 2 omega .3
		scale .5
		pigment_map {
			[0.45 Pig1]
			[0.45 Pig2]
		}
	}
}

box { <0, -3, 0>, <3, 3, 1>
	pigment {
		bozo
		turbulence 1 octaves 3 lambda 2 omega .3
		scale .5
		warp { reset_children }
		pigment_map {
			[0.45 Pig1]
			[0.45 Pig2]
		}
	}
}

auteurs : Fabien Mosen / Christophe Bouffartigue