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

les transformations

objectif

Déplacer, étirer, faire pivoter,... des choses dans l'espace (un objet, un élément de texture,...).

translate

translate fait effectuer à un élément un simple déplacement dans l'espace. Ce déplacement est donné par un vecteur, exprimant la distance relative sur chacun des trois axes de référence.

sphere {... translate <5,1,-8>}

..indique que la nouvelle position de la sphère sera 5 unités plus loin sur l'axe X, 1 unité plus loin sur l'axe Y, et 8 unités moins loin sur l'axe Z.

translate est en fait une simple addition : si le centre de la sphère se trouvait à <6,0,5>, il se trouvera à présent à <6,0,5>+<5,1,-8>, c'est à dire à <11,1,-3>.

scale

scale ("échelle") permet d'étirer ou de comprimer, uniformément ou pas, un élement. Un vecteur donne la modification de taille relative sur chaque axe.

box {<0,0,0>,<1,1,1> scale <1,2,.5>}

Dans notre exemple, la boîte gardera la même longueur sur l'axe X, verra sa hauteur (axe Y) doublée, et sa longueur sur l'axe Z réduite de moitié.

Vous l'aurez compris, scale est une opération de multiplication appliquée à chaque point de l'élément.

Attention 1 : scale s'effectue toujours relativement aux axes (et donc à l'origine), indépendamment de la géométrie de l'élément transformé.

Astuce 1 : on peut parfaitement utiliser des valeurs négatives, ce qui permet de créer des copies "miroir" d'un objet. Pensez-y quand vous faites des compositions symétriques !

object {MoitieFacade}
object {MoitieFacade scale <-1,1,1>}

Attention 2 : on ne peut pas appliquer une échelle de 0 sur un axe. Si vous voulez doubler la longueur d'un objet sur Z et le laisser intact dans les autre directions, vous devez faire :

scale <1,1,2>

Un erreur courante est, à travers un raccourci de type scale z*2, de générer en fait un vecteur du genre <0,0,2>, ce qui est incongru. Heureusement, lorsque POV-Ray rencontre une valeur de 0 dans un vecteur d'échelle, il le convertit automatiquement en 1, mais produit un message d'avertissement.

rotate

rotate permet de faire pivoter un élément autour des trois axes. La rotation est exprimée en degrés, pour chacun des trois axes, sous forme d'un vecteur. Voici un schéma qui vous montre le sens positif de rotation, dans le système "main gauche" utilisé par défaut dans POV-Ray :

Comment se souvenir du sens de rotation sur un axe ? On est bien en système "main gauche", alors prenez votre main gauche, et, en l'air, devant vos yeux, pointez le pouce dans la direction de l'axe autour duquel vous voulez effectuer la rotation, et recroquevillez légèrement les autres doigts : le sens dans lequel ils se courbent est le sens de rotation positif !

note : quand vos amis vous verront agiter ainsi la main gauche devant votre ordinateur, ils ne manqueront pas de s'étonner, ce à quoi vous leur répondrez "tu ne peux pas comprendre !".

 object {...
         texture {BoisPourri rotate <20,-55,0>}
         }

Cet exemple fait effectuer à la texture une rotation de 20 degrés autour de l'axe X, puis de -55 degrés autour de Y, et puis rien autour de Z. Attention, en spécifiant la rotation par un vecteur, l'ordre des rotations est toujours le même. Si vous voulez changer cet ordre, il faudra spécifier chaque rotation séparément :

 object {...
         texture {BoisPourri rotate y*-55 rotate x*20}
         }

À l'instar de scale, la transformation se fait toujours relativement aux axes, indépendamment de la géométrie de l'élément transformé.

ordre des transformations

Du point de vue de la syntaxe, vous pouvez apporter à un élément autant de transformations que vous le souhaitez, et dans n'importe quel ordre. Cependant, l'ordre dans lequel les transformations ont lieu est primordial ! En effet, il y a une énorme différence entre :

box {<0,0,0>,<1,1,1> translate <0,2,15> rotate <30,10,0>}
// et
box {<0,0,0>,<1,1,1> rotate <30,10,0> translate <0,2,15>}

Le premier va d'abord se déplacer, puis orbiter à environ 15 unités de l'origine, tandis que le second va gentiment pivoter, puis se déplacer.

En règle générale, il est recommandé d'effectuer les opérations dans l'ordre suivant : scale (ajuster la taille), rotate (ajuster l'orientation), et enfin translate (ajuster la position).

Au moment de la modélisation, cela implique aussi qu'il faut être attentif, autant que possible, à placer les objets le plus logiquement possible en rapport avec les axes (centres, axes de symétrie,...).

transformations des textures

note : tout ceci est valable aussi bien pour les matériaux, que pour les textures, les pigment, les normales,...

Au moment où la texture est spécifiée dans la définition de l'objet, celle-ci est "fixée" à l'objet, et suivra les transformations de l'objet qui sont spécifiées après elle.

box {... translate <10,15,8> texture {Bois_Sapin}}

signifie que la boîte prendra la texture à l'endroit où se trouve la boîte après la translation, tandis que

box {... texture {Bois_Sapin} translate <10,15,8>}

signifie que la boîte prendra sa texture à l'endroit où elle se situe au départ, puis que cette texture "suivra" la boîte lors du déplacement qui suit.

On peut également faire bouger la texture indépendamment de l'objet, en mettant les transformateurs dans la définition de texture.

transform {...}

Il est possible de déclarer un ensemble de transformations en lui donnant un nom.

#declare Mouvement1 = transform {translate x*15 rotate y*90}
object {...
        transform {Mouvement1}
        }

Rédacteur: Fabien Mosen