Pré-requis: Chapitre 1: théorie
et primitives
Nous contacter
Nous allons découvrir l'utilisation des différentes classes "interpolator" qui s'appliquent aux "TransformGroup" (TG ) et permettent d'animer tous nos objets. Nous n'utiliserons ici que le objets les plus simples possibles pour fixer notre attention sur l'animation. Vous pourrez bien sûr utiliser des objets plus complexes comme ceux des chapitres 1 et 2.
Tout d'abord, de manière générale, lorsque
vous construisez chacun de vos TG vous devez spécifier s'il va ou non
bouger dans votre monde. Si c'est le cas vous devez lui en donner la capacité
avec la méthode "setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
".
Puis vous avez besoin d'un fonction du temps, c'est là qu'intervient
la classe Alpha dont les paramètres du constructeur utilisés
sont le nombre de tours avant l'arrêt de la rotation, et la vitesse
de rotation. Ici nous voulons que le cube tourne indéfiniment, il faut
alors mettre -1 et nous réglons la vitesse de rotation à 4000
qui est une fréquence (augmenter ce nombre pour ralentir la rotation).
Nous allons faire connaissance avec l'animation la plus simple à mettre
en oeuvre: la rotation.
Pour faire varier la rotation du TG en fonction du Alpha que
nous avons défini, il convient d'utiliser la classe "RotationInterpolator
"
qui lie ( par référence) l'Apha à notre TG (d'où
les arguments du constructeur ) et définit l'axe ainsi que les angles
maximun et minimum de la rotation. Par défaut, la rotation se fait
autour de l'axe Y, l'angle minimal est 0, l'angle maximal est 2PI. Ensuite
il faut définir une zone d'infuence de cet "interpolator"
pour notre TG au delà de laquelle la rotation n'agira plus. Cette zone
d'influence correspond à la classe "BoundingSphere"
définie par défaut par le contructeur par une sphère
de rayon 1 (donc suffisant pour notre cube de 0.5). La méthode "setSchedulingBounds
()"
permet de lier cette zone avec l'interpolator. Enfin il faut lier parentalement
le TG à l'interpolator comme d'habitude.
Dans les exemples de ce chapitre nous ne décrirons que
les extraits de codes concernant la construction du BG principal. Vous pourrez
bien évidemment télécharger les codes sources complets
de tous ces exemples.
Télécharger la source
|
|
PositionPathInterpolator
" qui permet à un TG
de se déplacer au cours du temps en passant par différents points.PositionPathInterpolator
"
a besoin de ces 2 tableaux, d'une fontion du temps ( toujours la classe Alpha),
du TG auquel l'interpolator sera relié (par référence),
et e fin un Transform3D qui sera manipulé par la classe au cours du temps.
|
|
|
|
PositionPathInterpolator
", et l'autre à
un "RotationInterpolator
", le dernier servant à
définir un rayon de rotation pour notre cube. Le mouvement sera composé
d'une rotation globale appliquée à un vecteur servant de rayon,
enfin un mouvement d'oscillation sera associé au cube. Le plus simple
pour comprendre est de regarder le schéma d'organisation générale.
|
|
Nous allons commencer par constuire une classe qui lors de la touche du clavier
fera tourner un objet "box". L'évènement à détecter
est donc "KeyEvent.KEY_PRESSED". On utilise la méthode "wakeupOn()"
héritée de la classe "Behavior" avec un évènement
pour spécifier quel évènement doit être détecté
par notre classe.
Télécharger les sources behavior1.java
et box.java.
|
Création de l'interaction permettant la rotation d'un TG suite à la pression d'un touche/ Fichier behavior1.java |
|
Pour ajouter une interaction il faut donc définir le TG à manipuler comme pouvant être modifiable, puis céer une instance de votre classe behavior1 référençant (lien par référence) ce même TG, lui définir une zone d'influence, puis faire hériter le TG de ce behavior ( lien parental). Extrait du fichier box.java |
|
|
Pour cela, il y a très peu de modification à faire au fichier box.java. Il suffit juste de spécifier que le TG que l'on va manipuler sera disponible non seulement en écriture, mais également en lecture pour, à tout instant, pouvoir récupérer l'orientation de la porte et la modifier. Extrait du fichier box2.java |
|
Les changements sont par contre plus importants concernant le fichier behavior2.java. Les évènements détectées sont toujours "touche préssée ?" représentée par la constante " KeyEvent.KEY_PRESSED " et la méthode "
initialize() " reste inchangée. La méthode "
processStimulus " détermine les actions en réponse
aux différents stimulis. La méthode "getAWTEvent() "
permet de déterminer quel type de "KeyEvent.KEY_PRESSED ",
quelle touche à été enfoncée et nous stockons
les évènements dans un tableau d'évènements
"AWTEvent events[] ". On initialise une matrice à
la matrice d'identité "rot " ( la matrice identité
est un facteur neutre pour la multiplication ). Puis on affecte une rotation
de 0.1 selon l'axe voulu à cette matrice. La matrice "rot "
est maintenant prête à être multipliée avec la
matrice contenant l'orientation du TG. On récupère cette derniere
à l'aide de la méthode "getTransform(rotation) "
et on la stocke dans la matrice "rotation ", puis
on les multiplie et on réaffecte la matrice résultant: "rotation"
à l'aide de la méthode "setTransform(rotation) "
au TG.Enfin il ne faut pas oublier de réactiver le mode d'attente d'évènements grâce à la méthode " wakeupOn(keyEvent) ".Extrait du fichier behavior2.java |
|
getViewingPlatform()
" de l'univers utilisé, puis
on récupere le TG de la caméra grâce à la méthode
"getViewPlatformTransform()
". Pour que vous puissiez aller
partout dans votre monde il faut également que vous définissiez
une zone d'influence le entièrement, c'est pour cela que nous n'utilisons
plus le constructeur par défaut. La classe de comportement ne nécessite
que peu de transformation, il faut juste remplacer certaines des rotations en
translations.
|
Extrait du fichier world.java |
|