Aller au menu - Aller au contenu

Icône Animez-vous !

Mise à jour : 01/07/2010
525 visites depuis 7 jours, dont 1 sur ce chapitre classé 218/786
POV-Ray ne peut pas créer d'animation tout seul, c'est vrai.
Mais au fond, qu'est-ce que c'est, une animation ? Tout simplement une suite d'images ! ^^
Et POV-Ray peut justement être configuré pour créer une suite d'images... Parfait ! :D Il ne restera plus alors qu'à les assembler, ce qui est assez facile ;)
Sommaire du chapitre :
Icône du chapitre
Chapitre précédent Sommaire Chapitre suivant

Le principe

Le principe est assez simple : POV-Ray crée plein d'images presque identiques, à un détail près : une variable, clock, varie au cours de l'animation, et permet donc de modifier la scène en fonction.
Par exemple, déplacer un bloc d'une valeur de clock vers la droite donnera, au final, l'impression que le bloc avance tout seul...
Avec des conditions plus complexes, il est possible de créer des animations très variées, pour faire à peu près tout ce que vous voulez.

Les options

Paramétrer l'animation est très simple. En effet, sur les quatre paramètres à donner, trois ont une valeur par défaut tout à fait satisfaisante. :D

Le nécessaire



La seule option obligatoire est le nombre d'images total de l'animation, que l'on peut donner avec Code : Autre
1
Final_Frame=x

ou
Code : Autre
1
+KFFx

x est un entier.
Ce code est à mettre en ligne de commande (ou dans votre fichier .ini).

Et c'est tout. ^^

Les extras



Parlons maintenant des paramètres par défaut.

Initial_Frame


Le premier est le numéro de l'image de départ. Généralement, on commencera par 1, mais certains préfèrent parfois mettre 0...
Pour changer ce paramètre, il suffit d'ajouter l'option
Code : Autre
1
Initlal_Frame=x

ou
Code : Autre
1
+KFIx

x est un entier.
Ce paramètre n'est pas utilisé pour ne rendre qu'une partie d'une animation ! Même si vous mettez 100, toute votre animation sera simplement compressée entre les images 100 et 120. Pour ne rendre que la fin de l'animation, il faudra utiliser une autre option, décrite plus bas.

Initial_Clock et Final_Clock


Par défaut, la valeur de clock passe de 0 (début de l'animation) à 1 (fin de l'animation). Il est conseillé de garder ces valeurs, mais il est quand même possible de les modifier :
Code : Autre
1
Initial_Clock=x
ouCode : Autre
1
+KIx

fera commencer l'animation avec une valeur de clock de x , et
Code : Autre
1
Final_Clock=x
ouCode : Autre
1
+KFx

la fera terminer avec une valeur de clock de x.

Par exemple, en ligne de commande,
Code : Autre
1
+KI1 +KF2.5 +KFI1 +KFF2

donnera deux images : l'une (la première) avec une valeur de clock de 1, et l'autre avec une valeur de clock de 2.5.

Lorsqu'il y a plus de deux images, les valeurs de clock des images intermédiaires sont données proportionnellement. Par exemple, en mettant dans votre fichier .ini ceci :
Code : Autre
1
2
3
4
Initial_Frame=1
Final_Frame=3
Initial_Clock=0
Final_Clock=1

(j'ai remis les valeurs par défaut pour que ce soit clair)
La première image utilisera ici une valeur de clock de 0, la dernière une valeur de clock de 1, et l'image intermédiaire aura une valeur de clock de 0.5.

Ce système, qui sépare les valeurs de clock du nombre d'images, est très pratique car quel que soit le nombre d'images que vous utilisiez dans votre animation, clock variera toujours de la même manière.


Une animation en boucle



Si jamais vous faites un jour une animation qui sera destinée à tourner en boucle, vous aurez vite un petit soucis : généralement, la première et la dernière image sont identiques, ce qui peut caser une pause dans l'animation.
Pour résoudre ce problème, une option simple existe :
Code : Autre
1
Cyclic_Animation=on

ou
Code : Autre
1
+KC

activera le mode cyclique, qui ajustera automatiquement la valeur de clock pour que la dernière et la première image se suivent bien.

Rendre une partie de l'animation



Ces options sont relativement moins utilisée, mais je vous les met quand même au cas où.
Il est possible de ne rendre qu'une partie d'une animation (par exemple uniquement la première moitié, ...). Cela devient utile lorsque vous faites une énorme animation mais que vous ne voulez en voir qu'un bout pour tester.
Code : Autre
1
Subset_Start_Frame=x

ou
Code : Autre
1
+SFx

permettra de commencer à l'image x, et
Code : Autre
1
Subset_End_Frame=x

ou
Code : Autre
1
+EFx

finira à l'image x.

Bien entendu, il faut que ces deux valeurs soient comprises entre les valeurs "normales" de Initial_Frame et Final_Frame.

Utilisation

Utilisation simple



Maintenant que vous avez vu toutes les options disponibles, on va pouvoir les oublier. :D
En général, comme je vous l'ai dit, une seule option est nécessaire : le nombre total d'image.

On va donc commencer avec le strict minimum, c'est à dire l'option +KFF30 en ligne de commande, pour dire qu'on veut au total 30 images.
Ensuite, on crée notre scène, sans oublier que la variable clock variera de 0 à 1...

Code : Autre
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
camera {
  location <0,2,-3>
  look_at <0,0,0>
}

light_source {
  <5,15,-10>
  rgb <1,1,1>
}

difference {
  sphere {
    <0,0,0>
    1
    pigment { rgb <0,1,0> }
  }
  box {
    <10,10,10>
    <-10,1-2*clock, -10>
    pigment { rgb <1,0,0> }
  }
}


Et si vous lancez le rendu... Magique ! POV-Ray enchaîne les rendus, et vous pouvez voir votre pastèque se faire gracieusement découper...
Ou alors vous voyez des images apparaître lentement devant vous, donnant une mauvaise impression d'animation trop saccadée. :(
Et oui, POV-Ray ne fait que créer les images, il ne les anime pas tout seul.
Pour cela, n'importe quel programme d'animation fera l'affaire (Ulead Gif Animator, Windows Movie Maker, ...).
Je vous conseille ImageMagick, qui est très léger, et compatible Windows, Linux ou Mac. Bon, il fonctionne en ligne de commande, donc certains pourront ne pas apprécier, mais au moins il marche bien.
Je ne vais pas vous faire un cours sur ImageMagick, ce serait un peu trop long ; je vais juste vous dire quelle commande utiliser pour convertir vos images en une animation.
Code : Autre
1
convert monimage*.png -delay 4 monanimation.gif

Vous devez écrire cette ligne dans la console windows, depuis le répertoire où se trouvent les images.
Si vous ne savez pas ce que c'est ou comment l'utiliser, voici un lien pour vous aider.

Le -delay 4 indique que chaque image de l'animation apparaitra 4 centièmes de seconde, soit 25 images par seconde en tout. C'est relativement élevé, et permet d'avoir une animation assez fluide ; mais parfois, 25 images par seconde peut être trop, car cela alourdi l'animation. Vous pouvez alors mettre une valeur plus élevée, comme 10, ce qui donnera 10 images par seconde...

Cette commande transformera toutes les images .png dont le nom commence par monimage. Vous pouvez remplacer le .png par l'extension de vos images, si celles-ci sont dans un autre format.
En principe, voici le résultat (cliquez pour voir l'animation) :
Image utilisateur


Utilisation complexe



Bon, rassurez-vous, complexe est un bien grand mot pour ce que nous allons faire...
Voici l'animation finale que vous devriez obtenir (ici encore, cliquez pour voir l'anmation) :
Image utilisateur
Même si l'image en elle-même n'est pas particulièrement jolie, le point essentiel est que l'animation n'est pas aussi simple que la précédente : il se déroule en 3 phases (première chute, seconde chute, troisième chute). Il va donc falloir découper notre animation en trois...

Code : Autre
1
#declare time = clock * 3;

On utilisera time au lieu de clock, plus adapté à nos besoins.
On aurait aussi bien pu utiliser clock directement en le réglant avec +KF3, mais il est conseillé de prendre une variable intermédiaire.

Ensuite, on va créer nos 6 carrés, avec des polygones (j'espère que vous vous souvenez du passage sur la 2D :p ).
Tout d'abord, le carré du bas reste immobile tout au long de l'animation :
Code : Autre
1
2
3
4
5
6
7
8
polygon { // bas
    5
    <0,0,0>
    <1,0,0>
    <1,0,1>
    <0,0,1>
    <0,0,0>  
  }

Ensuite, le carré de face commence par tourner autour de l'axe x, puis s'arrête :
Code : Autre
1
2
3
4
5
6
7
8
9
10
11
12
13
14
polygon { // face
    5
    <0,0,0>
    <1,0,0>
    <1,1,0>
    <0,1,0>
    <0,0,0>    
    #if (time < 1)
      // Phase 1
      rotate <-90*time*time, 0, 0>    
    #else
      rotate <-90, 0, 0>
    #end
  }

La rotation est proportionnelle à time*time et non simplement à time, ce qui permet de donner l'impression que le cube tombe à cause de la gravité.

Le carré situé sur le haut effectue une rotation, puis une autre et enfin s'arrête au sol.

Mais voilà, si on continue simplement à tout faire tourner autour de l'axe x, le carré passera sous le sol ! :(
Il va donc falloir ruser... ^^ Nous avons déjà fait quelque chose qui ressemblait, il y a longtemps : translater l'objet vers l'origine, le tourner, puis le re-translater comme si de rien n'était. :-°
Voici donc la suite :
Code : Autre
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
polygon { // haut
    5
    <0,1,0>
    <1,1,0>
    <1,1,1>
    <0,1,1>
    <0,1,0>  
    #if (time < 1)
      // Phase 1
      rotate <-90*time*time, 0, 0>    
    #else
      rotate <-90,0,0>
      #if (time < 2)
        // Phase 2
        translate <0,0,1>
        rotate <-90*(time-1)*(time-1), 0, 0>
        translate <0,0,-1>      
      #else
        // Phase 3      
        translate <0,0,1>
        rotate <-90,0,0>
        translate <0,0,-1>
      #end    
    #end
  }


Les trois derniers polygones sont donc simplement une répétition de cela :
Code : Autre
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
polygon { // dos
    5
    <0,0,1>
    <1,0,1>
    <1,1,1>
    <0,1,1>
    <0,0,1>
    #if (time < 1)
      // Phase 1
      rotate <-90*time*time, 0, 0>    
    #else
      rotate <-90,0,0>
      #if (time < 2)
        // Phase 2
        translate <0,0,1>
        rotate <-90*(time-1)*(time-1), 0, 0>
        translate <0,0,-1>      
      #else
        // Phase 3      
        translate <0,0,1>
        rotate <-90,0,0>
        translate <0,0,1>
        rotate <-90*(time-2)*(time-2), 0, 0>
        translate <0,0,-2>
      #end    
    #end
  }
  polygon { // côté gauche
    5
    <0,0,0>
    <0,0,1>
    <0,1,1>
    <0,1,0>
    <0,0,0>  
    #if (time < 1)
      // Phase 1
      rotate <-90*time*time, 0, 0>    
    #else
      rotate <-90,0,0>
      #if (time < 2)
        // Phase 2
        translate <0,0,1>
        rotate <-90*(time-1)*(time-1), 0, 0>
        translate <0,0,-1>      
      #else
        // Phase 3      
        translate <0,0,1>
        rotate <-90,0,0>
        translate <0,0,-1>
        rotate <0,0,90*(time-2)*(time-2)>
      #end    
    #end
  }
  polygon { // côté droit
    5
    <0,0,0>
    <0,0,1>
    <0,1,1>
    <0,1,0>
    <0,0,0>  
    #if (time < 1)
      // Phase 1
      rotate <-90*time*time, 0, 0>    
    #else
      rotate <-90,0,0>
      #if (time < 2)
        // Phase 2
        translate <0,0,1>
        rotate <-90*(time-1)*(time-1), 0, 0>
        translate <0,0,-1>      
      #else
        // Phase 3      
        translate <0,0,1>
        rotate <-90,0,0>
        translate <0,0,-1>
        rotate <0,0,-90*(time-2)*(time-2)>
      #end    
    #end
    translate <1,0,0>
  }


Mettez le tout dans une union à laquelle vous donnez la couleur rouge, ajoutez une source de lumière quelque part et voilà !
Bien entendu, il faudra encore indiquer, en ligne de commande ou dans un fichier .ini, le nombre d'images : +KFF30 par exemple.

Bon, le positionnement des polygones n'était pas toujours évident, je vous l'accorde (surtout pour les trois derniers... :-° ). Mais l'important est que vous compreniez comment on peut séparer des phases dans une animation.
Lorsque vous ferez des animation bien plus complexes, comme un homme qui marche ou une caméra qui explore un monde, vous serez vite obligé de faire comme cela...

Q.C.M.

Quelle est l'option à mettre en ligne de commande pour faire une animation de 20 images ?
Quelle sera la valeur de clock à la 3e image créée avec les options suivantes ?

Code : Autre
1
2
3
4
Initial_Frame=5
Final_Frame=9
Initial_Clock=50
Final_Clock=90

Statistiques de réponses au QCM

Ainsi se finit ce chapitre sur l'animation !
Vous allez très bientôt pouvoir créer votre premier long-métrage et devenir enfin le milliardaire dont vous avez tant rêvé ! :D
Mais pour cela, il faut continuer à suivre mes cours... :-°
Chapitre précédent Sommaire Chapitre suivant

Partager

3 commentaires pour "Animez-vous !"
Note moyenne : 3.96 / 4 (24 votes)
Pseudo Commentaire
Hors ligne bestben # Posté le 06/06/2008 à 20:42:18

Ville : La chaussée
Pays : France métropolitaine

Merci pour ce tuto,
par contre lorsque je fait +KFFx (x entant un nombre entier) mon pov-ray ne répond plus :(
pour infos je suis sous vista avec pov-ray V3.6
Hors ligne Parlemoi2toi # Posté le 17/11/2010 à 15:01:50

J'ai découvert cette partie du site très récemment, BRAVO pour ce tutoriel ! Je m'intéresse à l'animation, mais je n'arrive pas a faire une animation sur les couleurs... Par exemple, du bleu vers le noir sur une sphère ou autre... La chose est-elle possible ?
Cordialement.
Connecté Gyscos # Posté le 17/11/2010 à 15:21:56
Better burn out than fade away
Avatar

Ville : Palaiseau
Pays : France métropolitaine
Études : Polytechnique

Code : Autre
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include "colors.inc"


camera {
  location  -z*3
  look_at   0
}

light_source {
  <0, 0, 0>
  color rgb 1
  translate <-30, 30, -30>
}

// ----------------------------------------
#declare rad = 0.3; 
 
 
union { 
    cylinder {
        -x-y,x+y,rad
    }
    cylinder {
        x-y,-x+y,rad
    }
    sphere { -x-y, rad }
    sphere { x-y, rad }
    sphere { -x+y, rad }
    sphere { x+y, rad }
    
    pigment { Blue * (1 - clock) }
    finish { specular 1 }
}


Avec +KFF3 par exemple en ligne de commande, ça ne marche pas ?

Three Wise Droids
Currently working on Spirits Of Heaven, a T-RPG for Android (check the git page) :
http://www.spirits-of-heaven.com
 

Voir tous les commentaires