Les objets, les lumières et la caméra sont positionnés en utilisant un système de coordonnées en 3D. Dans POV-Ray, ce système a l'axe des y pointant vers le haut, l'axe des x pointant vers la droite, et l'axe des z pointant vers l'écran. Les valeurs négatives de ces axes pointent dans les autres directions, comme cela est vu dans les images de la section "Comprendre le système de coordonnées de POV-Ray".
Les positions, dans ce système, sont spécifiées en utilisant un vecteur à trois composants. Les trois valeurs correspondent respectivement aux directions x, y et z. Par exemple, le vecteur <1, 2, 3> indique que le point est à une unité à droite, deux unité au-dessus et trois unités au delà de l'origine de l'univers de la scène, qui est à <0, 0, 0>.
Les vecteurs ne sont pas seulement pour les points. Ils peuvent également donner des quantités pour les tailles, les mouvements ou les rotations d'un élément de la scène, ou pour modifier le modèle de texture appliqué à un objet.
La taille, la rotation, l'orientation et la déformation des éléments dans le système de coordonnées sont contrôlés par des modificateurs appelés transformations. Les sous-sections suivantes décrivent les transformations et leur usage.
Les transformations supportées sont rotate, scale et translate. Elles sont utilisées respectivement pour tourner, dimensionner ou déplacer un objet ou une texture. Une matrice de transformation peut également être utilisée pour spécifier directement des transformations complexes. Des groupes de transformations peuvent être fusionnées et stockées dans un identificateur de transformation. La syntaxe est :
TRANSFORMATION: rotate <Rotate_Amt> | scale <Scale_Amt> | translate <Translate_Amt> | transform TRANSFORM_IDENTIFIER | transform { TRANSFORMATION_BLOCK...} | matrix <Val00, Val01, Val02, Val10, Val11, Val12, Val20, Val21, Val22, Val30, Val31, Val32> TRANSFORMATION_BLOCK: TRANSFORM_IDENTIFIER | TRANSFORMATION | inverse TRANSFORM_DECLARATION: #declare IDENTIFIER = transform { TRANSFORMATION_BLOCK...} | #local IDENTIFIER = transform { TRANSFORMATION_BLOCK...}
Les éléments peuvent être déplacés par ajout d'un paramètre translate. Il consiste en un mot clé translate suivi d'une expression vectorielle. Les trois termes du vecteur spécifient le nombre d'unités de déplacement dans chaque direction x, y et z. translate déplace l'élément relativement à sa position courante. Par exemple
sphere {<10, 10, 10>, 1 pigment {Green} translate <-5, 2, 1> }
déplacera la sphère de <10, 10, 10> à <5, 12, 11>. Il ne la déplace pas vers la position absolue <-5, 2, 1>. Les déplacements sont toujours relatifs à la position de l'objet au moment où ils s'appliquent. Un déplacement de zéro laissera l'élément inchangé sur cet axe. Par exemple :
sphere {<10, 10, 10>, 1 pigment {Green} translate 3*x // devient <3, 0, 0> donc déplace de 3 unités // dans la direction x et ne fait rien le long de y ou z }
Vous pouvez changer la taille d'un objet ou d'un modèle de texture en ajoutant le modificateur scale. Il consiste en un mot clé scale suivi d'une expression vectorielle. Les 3 termes du vecteur spécifient la quantité de modification d'échelle dans chaque direction x, y et z.
Le dimensionnement non uniforme est utilisé pour amincir ou élargir un élément. Les valeurs plus grandes que 1 agrandissent l'élément sur cet axe, alors que les valeurs plus petites que 1 le réduisent. Le dimensionnement est relatif à la taille courante de l'élément. Si l'élément a été déjà retaillé, alors il sera modifié relativement à la nouvelle taille. De multiples valeurs de taille peuvent être utilisées.
Par exemple
sphere {<0, 0, 0>, 1 scale <2, 1, 0.5> }
écrasera et étirera la sphère en un ellipsoïde qui aura le double de taille dans l'axe x, restera identique dans l'axe y, et sera diminué de moitié dans l'axe z.
Si une expression numérique seule est spécifiée, elle est promue en un vecteur à trois composants, dont tous les termes seront identiques. Ainsi, l'objet est uniformément dimensionné de la même valeur dans les trois axes. Par exemple :
object { MyObject scale 5 // Donne <5, 5, 5> donc agrandit uniformément // par 5 dans toutes les directions. }
Quand l'un des éléments est zéro, POV-Ray change ce composant par 1 car il assume que 0 signifie aucun changement d'échelle dans cette direction. Une alarme "Illegal Value: Scale X, Y or Z by 0.0. Changed to 1.0." est affichée alors.
Vous pouvez changer l'orientation d'un objet ou d'un modèle de texture en ajoutant un modificateur rotate. Il consiste en un mot clé rotate suivi d'une expression vectorielle. Les trois termes du vecteur spécifient le nombre de degrés de rotation autour de chaque axe x, y et z.
Note : l'ordre des rotations a de l'importance. Elles se font d'abord autour de l'axe x, puis de l'axe y, et enfin de l'axe z. Si vous n'êtes pas sûr que c'est ce que vous voulez, vous pouvez exercer une rotation sur un seul axe à la fois, en utilisant de multiples modifications pour obtenir ce que vous cherchez.
rotate <0, 30, 0> // 30 degrés autour de l'axe Y puis, rotate <-20, 0, 0> // -20 degrés autour de l'axe X puis, rotate <0, 0, 10> // 10 degrés autour de l'axe Z.
La rotation est toujours relative à l'axe. Ainsi, si un objet est à quelque distance de l'origine, il suivra une orbite autour des axes, au lieu d'une rotation sur lui-même, comme s'il était lié à une chaîne.
POV-Ray utilise un système de rotation main gauche. En utilisant le fameux exercice Computer Graphics Aerobics, vous dressez votre main gauche et pointez votre pouce dans l'axe de rotation. Vos doigts s'enrouleront dans le sens positif de la rotation. De même, si vous pointez votre pouce dans la direction négative de l'axe, les doigts s'enrouleront dans le sens négatif de la rotation. Voir 'Comprendre le système de coordonnées de POV-Ray' pour une illustration.
Le mot clé matrix peut être utilisé pour spécifier explicitement la matrice de transformation à utiliser pour les objets ou les textures. Sa syntaxe est :
MATRIX: matrix <Val00, Val01, Val02, Val10, Val11, Val12, Val20, Val21, Val22, Val30, Val31, Val32>
Où Val00 à Val32 sont des expressions numériques entre parenthèses d'angle et séparées par des virgules.
Note : ce n'est pas un vecteur. C'est une série de 12 expressions numériques.
Ces chiffres spécifient les éléments d'une matrice de 4*4, avec les quatre colonnes remplies implicitement par <0, 0, 0, 1>. Un point P, P = <px, py, pz>, est transformé en Q, Q = <qx, qy, qz> par
qx = Val00 * px + Val10 * py + Val20 * pz + Val30
qy = Val01 * px + Val11 * py + Val21 * pz + Val31
qz = Val02 * px + Val12 * py + Val22 * pz + Val32
Normalement, vous ne voudrez pas utiliser le mot clé matrix, car c'est moins descriptif que les commandes de transformation, et plus difficile à visualiser. Toutefois, la commande matrix autorise plus de transformations, comme le découpage. La matrice suivante découpe un objet le long de l'axe y.
object { MyObject matrix <1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0> }
Parce que les rotations sont toujours relatives aux axes, et que le changement de taille est relatif à l'origine, vous voudrez, généralement, créer un objet à l'origine, et le retailler et le faire tourner d'abord. Alors, vous pourrez le déplacer à sa position définitive. C'est une erreur classique de placer précautionneusement un objet, puis de le faire tourner, car cela le fait bouger selon une orbite autour des axes. La position peut tellement changer, que l'objet peut sortir de la vue !
De même, le changement de taille après le déplacement déplace un objet de façon imprévisible. Cela multipliera la quantité de déplacement.
Par exemple
translate <5, 6, 7> scale 4
déplacera l'objet en <20, 24, 28> au lieu de <5, 6, 7>. Soyez vigilant à l'ordre des actions pour obtenir ce que vous recherchez.
transform {scale <20, 24, 28> translate y*3 inverse}
Une transformation inversée fait l'opposé de ce que devrait faire la transformation, et peut être utilisée pour défaire des tranformations sans se perdre dans une quantité de transformations. Pour faire la même chose que inverse, vous devez dupliquer chaque transformation, et la changer pour son effet opposé (par exemple translate -y*3 au lieu de translate y*3) et inverser leur ordre.
A certains moments, il est pratique de combiner plusieurs transformations, et de les appliquer en de multiples endroits. Un identificateur de transformation peut être utilisé dans cette optique. Ils sont déclarés comme suit :
TRANSFORM_DECLARATION: #declare IDENTIFIER = transform { TRANSFORMATION... } | #local IDENTIFIER = transform { TRANSFORMATION... }
Où IDENTIFIER est le nom de l'identificateur à déclarer, jusqu'à 40 caractères de long, et TRANSFORMATION est tout identificateur de transformation valide. Voir "#declare vs. #local" pour plus d'information sur les portées. Voici un exemple...
#declare MyTrans = transform { rotate THISWAY scale SOMUCH rotate -THISWAY scale BIGGER translate OVERTHERE rotate WAYAROUND }
Un identificateur de transformation est appelé par le mot clé transform, avec ou sans parenthèses, comme ceci :
object { MyObject // Fait une copie de MyObject transform MyTrans // Applique la transformation translate -x*5 // Puis déplace de 5 unités vers la gauche } object { MyObject // Fait une autre copie de MyObject transform {MyTrans} // Applique la même transformation translate x*5 // Puis déplace de 5 unités vers la droite }
Sur des objets CSG extrêmement complexes, avec beaucoup de composants, cela peut réduire le temps d'analyse si vous appliquez une transformation déclarée, plutôt que des modifications individuelles. Le transform est attaché seulement une fois à chacun des composants. L'application de modifications individuelles prendra plus de temps. Cela n'affecte que l'analyse, car le rendu fonctionnera de la même manière.
Quand un objet est transformé, toutes les textures qui lui sont attachées à ce moment sont également transformées. Cela signifie que si vous faites vos transformations avant d'appliquer la texture, cette dernière ne sera pas concernée. Sinon, elle sera transformée avec l'objet. Si la transformation est à l'intérieur de texture, elle seule sera affectée. La forme restera identique. Par exemple :
sphere {0, 1 texture {Jade} // Identificateur de texture de TEXTURES.INC scale 3 // Cela affecte à la fois la forme et la texture } sphere {0, 1 scale 3 // Cela n'affecte que la forme texture {Jade} } sphere {0, 1 texture { Jade scale 3 // Cela n'affecte que la texture } }
Les transformations peuvent également être appliquées indépendamment aux modèles de pigments et de normales de surface.
Note : le changement de taille d'un modèle de normale n'affecte pas seulement sa largeur et son espacement. Il affecte aussi la hauteur ou la profondeur des bosses, pour les explications, voir Le dimensionnement des normales.
Par exemple:
box {<0, 0, 0>, <1, 1, 1> texture { pigment { checker Red, White scale 0.25 // Cela n'affecte que le spectre de couleur } normal { bumps 0.3 // Cela spécifie la hauteur apparente des bosses scale 0.2 // Dimensionne le diamètre et les espaces entre les bosses // et aussi la hauteur. N'a aucun effet sur le spectre de couleur. } rotate y*45 // Cela affecte la texture dans son ensemble mais } // pas l'objet. }
| 2.2.8 Paramétrage des options de POV-Ray |