Aller au menu - Aller au contenu

Icône Les transformations d'objets

Mise à jour : 01/07/2010
525 visites depuis 7 jours, dont 25 sur ce chapitre classé 218/786
Vous aimeriez faire une espèce d'ovale, une sphère allongée ? Vous voulez ENFIN bouger votre torus ?? Vous voulez mettre vos boîtes comme vous le voulez ? No problemo ! Translate, rotate et scale n'attendent que ça !
Sommaire du chapitre :
Icône du chapitre
Chapitre précédent Sommaire Chapitre suivant

Translate

Tout d'abord, attaquons-nous au problème de l'anneau. On ne peut pas choisir sa position, qui est par défault <0,0,0>. Mais on va apprendre à le bouger !

D'abord, voyons un code habituel d'anneau :

Code : C
1
2
3
4
5
torus {
  1.2
  0.2
  pigment { rgb <1,0,0> }
}

Cela nous donne un anneau, positionné en <0,0,0>.
Maintenant, on va ajouter, à la fin (après la zone pigment mais avant le "}" de la fin de l'anneau) le mot-clé translate suivit d'un vecteur, par exemple <0,1,0> :

Code : C
1
2
3
4
5
6
torus {
  1.2
  0.2
  pigment { rgb <1,0,0> }
  translate <0,1,0>
}


Qu'est-ce que ça va nous faire ?
Ca va d'abord créer l'anneau, lui donner sa couleur, puis ça va le bouger de <0,1,0> !! Puisque le centre était à la base de <0,0,0>, le nouveau centre sera de <0,0,0> + <0,1,0> = <0,1,0> !
Il suffit donc de mettre dans le translate la position du torus pour le mettre où l'on veut !

Encore un exemple : pour placer le torus en <-1,1,3>, quel sera le code ?...

Secret (cliquez pour afficher)
Code : C
1
2
3
4
5
6
torus {
   1.2
   0.2
   pigment { rgb <1,0,0> }
   translate <-1,1,3>
}


Et voilà !

Evidement, cela marche aussi avec les autres objets, que ce soient des boîtes, des sphères, ...

Par exemple, bouger un cône se fera comme ça :

Code : C
1
2
3
4
5
6
7
8
cone {
  <0,0,0>
  1
  <0,1,0.5>
  0.2
  pigment { rgb <0.2,1,0.4> }
  translate <1,-2,-1>
}


revient à faire


Code : C
1
2
3
4
5
6
7
8
cone {
  <1,-2,-1>
  1
  <1,-1,-0.5>
  0.2
  pigment { rgb <0.2,1,0.4> }
  
}


C'est tout pour translate ! Amusez-vous, entraînez-vous... c'est le meilleur moyen de progresser !

Rotate

Maintenant qu'on a vu comment bouger un objet, on va voir comment le tourner.
Voilà un petit problème :
Image utilisateur
Comment pourrait-on faire quelque chose comme ça ? La barre bleue du milieu ne pose pas trop de problème, mais comment faire une barre qui soit inclinée comme la rouge ?...
C'est là qu'on a besoin de rotate ! Ce mot-clé s'emploie exactement comme translate, mais rotate fait tourner l'objet au lieu de simplement le déplacer. Il est suivit d'un vecteur, mais ce n'est pas ici un vecteur de position, comme pour translate, mais un vecteur d'angle (en degrés). Vous pouvez ainsi faire tourner votre objet autour d'un axe de l'angle de votre choix...

Ca veut dire quoi, concrètement ?

On a une boîte, dont voici le code :

Code : C
1
2
3
4
5
box {
  <-0.1,-0.1,-1>
  <0.1,0.1,1>
  pigment { rgb <0,0,1> }
}


Maintenant, on va la tourner autour de l'axe des y de 30° comme sur le schéma :
Image utilisateur
Attention à ne pas se tromper dans le sens ! Pour tourner la barre de 30° vers la droite, il faudrait la faire tourner de -30° !
Il peut ête difficile de se souvenir du sens, savoir s'il faut un angle positif ou négatif, etc... Un bon moyen de retenir est la méthode main gauche. Pointez votre pouce dans la direction de l'axe, les autres doigts pointent le sens DIRECT, c'est à dire le sens dans lequel tournera l'objet avec un angle positif.

On fait donc tourner la boîte de 30° autour de l'axe des y. Le vecteur angle sera donc <0,30,0> !

Code : C
1
2
3
4
5
6
box {
  <-0.1,-0.1,-1>
  <0.1,0.1,1>
  pigment { rgb <1,0,0> }
  rotate <0,30,0>
}

Et le tour est joué !

Attention ! Il faut faire attention au centre de la rotation !

Qu'est-ce que ça veut dire ? Regardez ce schéma :
Image utilisateur
Voilà le code de la boîte :
Code : C
1
2
3
4
5
6
7
8
box {
    <-0.85,0.55,-0.01>
    <-0.55,0.45,0.01>
    
    pigment {        
        rgb <0,1,0>
    }
}

J'aimerai faire tourner cette boîte verte... (comment ça c'est pas une bonne idée ? :p ) ... de 45° autour de l'axe des z...

Code : C
1
2
3
4
5
6
7
8
9
box {
    <-0.85,0.55,-0.01>
    <-0.55,0.45,0.01>
    
    pigment {        
        rgb <0,1,0>
    }
    rotate <0,0,45>
}

Et voilà ce que ça donne :
Image utilisateur

C'est n'importe quoi ! La boîte part n'importe où !

Bah non, c'est normal ! En effet, la rotation a pour centre <0,0,0>. Voilà donc comment s'est passée la rotation :
Image utilisateur
Ca explique tout !

Mais alors, comment peut-on tourner la boîte sans la déplacer ??

Souvenez-vous, quand nous avons fait tourner la barre bleue sans changer son centre... Vous savez pourquoi ? Parce que son centre était <0,0,0> ! Et que ce point ne bouge jamais lors d'une rotation.
C'est donc ça la solution ! Pour faire tourner un objet sans le déplacer, il faut qu'il soit centré en 0...

Et si l'on veut qu'il soit ailleurs ?...
On n'a qu'à le bouger après la rotation ! Avec un translate situé après le rotate !

Voici donc ce qu'il aurait fallu faire pour tourner la boîte en la laissant où elle est :

Code : C
1
2
3
4
5
6
7
box {
  <-0.15,-0.05,-0.01>
  <0.15,0.05,0.01>
  pigment { rgb <0,1,0> }
  rotate <0,0,45>
  translate <-0.7,0.5,0>
}

Et voilà le résultat :
Image utilisateur

Scale (1/2)

Rotate et translate permettent de positionner un objet comme on le veut, en le déplaçant ou en le tournant.
Scale est un petit peu différent : il multiplie les distances. Il est suivit d'un vecteur de rapport.

Qu'est-ce que ça veut dire ?

Prenons une boîte cubique de 1 de côté, centrée sur 0. Le code est tout simple :

Code : C
1
2
3
4
box {
  <-0.5,-0.5,-0.5>
  <0.5,0.5,0.5>
}


A présent, utilisons scale, avec le vecteur <2,2,2>, c'est à dire un rapport de 2 dans les 3 axes.

Code : C
1
2
3
4
5
box {
  <-0.5,-0.5,-0.5>
  <0.5,0.5,0.5>
  scale <2,2,2>
}


Qu'est-ce que ça change ? :o
A gauche, la boîte normale. A droite, la boîte avec scale.
Image utilisateur
Vous voyez la différence ? scale a aggrandit la boîte en multipliant par le rapport (qui est ici 2) toutes les longueurs.

Tout comme rotate, scale a pour centre <0,0,0>. Il faut donc faire attention !

Pourquoi faut-il faire attention ?
Voilà un exemple : on retrouve notre chère boîte verte, que l'on veut cette fois aggrandir :
Image utilisateur
On ajoute un scale <2,2,2> à la boîte... et voilà le résultat :
Image utilisateur
o_O Mince, la boîte est partie en haut à gauche...
Normal ! C'est le même problème qu'avec rotate : scale multiplie TOUTES les distances, y comprit la distance origine - objet ! Notre scale <2,2,2> a donc doublé la distance qui séparait notre boîte de l'origine, en plus de l'avoir aggrandit !

Sacré problème ! Mais comment y remédier ? Exactement comme avec rotate ! Avec scale tout comme avec rotate, l'origine (le point <0,0,0>) est un point fixe : c'est à dire qu'il ne bouge pas. Pour ne pas déplacer l'objet, il suffit donc de placer son centre en <0,0,0>, d'utiliser scale, puis de le bouger avec translate !!

Et voilà le travail :

Code : C
1
2
3
4
5
6
7
box {
  <-0.15,0.05,-0.01>
  <0.15,-0.05,0.01>
  pigment { rgb <0,1,0> }
  scale 2   
  translate <-0.7,0.5,0>
}


et le résultat :
Image utilisateur

Scale (2/2)

Bon, jusque là, scale n'a pas été vraiment très utile : on aurait pu agrandir la boîte dès le départ...

Cette fois-ci, on va l'utiliser un peu différement...

Voici d'abord un code d'une simple sphère de rayon 1, que l'on étire avec scale :

Code : C
1
2
3
4
5
sphere {
  <0,0,0>
  1
  scale <2,2,2>
}


Le résultat est une sphère de rayon 2 ; le centre ne bouge pas puisque c'est <0,0,0>.

Voilà ce que ça donne :
Image utilisateur
Ca, on aurait pu le faire tout simplement en donnant un rayon de 2 au début, au lieu de 1... scale est donc un peu inutile.

Mais on va changer le vecteur de rapport : on va mettre <1,2,1>. Vous voyez ce que ça va faire ?... Ca va multiplier par 2 la hauteur de la sphère, et par 1 la largeur et la profondeur...
Et voilà le résultat :
Image utilisateur
Marrant, non ? :D scale permet d'étirer les objets de manière non uniforme, c'est à dire différement suivant les axes. Essayons avec un torus :
Image utilisateur
Ca nous donne une espèce de bague... ^^ Essayez avec les cylindres, les cônes, ... en variant le vecteur de rapport, on peut arriver à des choses plutôt sympa !

Surtout, n'oubliez pas que scale multiplie TOUTES les distances. C'est un peu comme si tout ce que vous avez mis dans la description de l'objet, que ce soit des vecteurs ou des rayons, est multiplié par le rapport.

Ici, nous avons seulement utilisé des rapports entiers et positifs. Mais il est parfaitement possible d'utiliser des nombres décimaux comme 2.3 ou 0.06, des fractions comme 2/7, ou même des nombres négatifs. Dans ce cas là, l'objet subira une espèce de symétrie par rapport à <0,0,0>... essayez pour voir !

Q.C.M.

Que fait translate ?
Que faut-il mettre après rotate ?
Que fait scale <1,1,1> ?
A quoi faut-il faire attention en utilisant scale et rotate ?

Statistiques de réponses au QCM

C'est tout pour translate, rotate et scale !
Translate est très simple à utiliser, mais rotate et scale néscessitent une attention supplémentaire, du fait de leur centre... Aussi, il est toujours plus pratique de travailler avec des objets centrés en 0 dès leur création, puis de les positionner avec translate.

Grâce à ce chapitre, vous savez à présent comment combler beaucoup de ce qui vous manquait jusqu'alors...
Dans le chapitre suivant, vous allez apprendre les dernières bases néscessaires pour faire de vraies scènes !
Chapitre précédent Sommaire Chapitre suivant

Partager

2 commentaires pour "Les transformations d'objets"
Note moyenne : 3.96 / 4 (24 votes)
Pseudo Commentaire
Hors ligne Knacki # Posté le 27/08/2006 à 17:11:13

Exellent ^^

Ces transformations géométriques sont d'un réel secours.

En revanche, pour placer précisément les objets faudra sûrement dans certains cas un peu de maths.

Bien expliqué et clair.

18/20

PS: Dans la conclusion y'a "combler beaucoup de ce qui vous manquez ait jusqu'alors... "
Hors ligne titi.be # Posté le 23/11/2006 à 21:13:35
Avatar

Ca donne vraiment envie de lire la suite 19

Voir tous les commentaires