initiation à java 3d - java : supports de cours
TRANSCRIPT
Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis
Initiation à Java 3DInitiation à Java 3D
2 Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis
Introduction à JAVA 3D
• Java 3D API : ensemble de classes pour affichage en 3 dimensions et un rendu sonore amélioré
• Traitement en parallèle des figures
• Scène 3D organisée en graphe arborescent
• Utilisable pour application ou applet
3 Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis
Introduction à JAVA 3D
• Possibilités d’afficher des objets 3D prédéfinis (cubes, sphères, cônes, cylindres)
• Ou de créer ses propres objets géométriques
• Possibilités d’animations interactives ou non• Possibilités d’ajouter des textures• Possibilités d’éclairages
4 Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis
L’API JAVA 3D
• Univers virtuels : collection d’objets 3D à traiter• Classes de bas niveau : javax.media.j3d• Classes utiles : com.sun.j3d.utils
– Chargeur de contenu,– Aide à la construction de scène,– Géométrie,– Utilitaires
• Utilisation de java.awt et de javax.vectmath (pour les vecteurs, matrices, …)
5 Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis
Construire un graphe de scène
• Nœud = instance de classes Java 3D
• Arcs = relation parent-enfant
• Relation association possible entre nœuds et composant de nœuds (géométrie, apparence des noeuds)
• Chemin de graphe de scène décrit totalement les états d’un objet 3D (position, taille, …)
6 Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis
Construire un graphe de scène
VirtualUniverse
Locale
Group
Leaf
NodeComponent
autre objet
Relation parent-enfant
Relation de référence
7 Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis
Construire un graphe de scène
VirtualUniverse
BranchGroup
SShape3D
Apparence
View
Locale
BG BG
Géométrie
TG TransformGroup
Plateforme vue Canvas3D Screen3D
PhysicalBodyContenu
Vue
Lien entre l’univers et les objets
Position, orientationShape3D, Light,
Sound, Behavior…
PhysicalEnvironment
8 Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis
Recette pour programmes Java 3D1. Créer un objet Canvas3D2. Créer un objet VirtualUniverse3. Créer un objet Locale, le lier à l’objet
VirtualUniverse4. Construire une branche vue
1. Créer un objet View2. Créer un objet ViewPlatform3. Créer un objet PhysicalBody4. Créer un objet PhysicalEnvironment5. Lier les objets ViewPlatform, PhysicalBody, PhysicalEnvironment,
et Canvas3D à l’objet View5. Construire le contenu des branches6. Compiler les branches7. Insérer les sous-graphes à l’objet Locale
9 Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis
Recette Simplifiée
• Utilisation de la classe SimpleUniverse– Soulage des points 2, 3 et 4 de la recette– Dans le package com.sun.j3d.utils.universe
1. Créer un objet Canvas3D2. Créer un objet SimpleUniverse lié à l’objet Canvas3D
1. Personnaliser l’objet SimpleUniverse
3. Construire le contenu des branches4. Compiler les branches5. Insérer les sous-graphes à l’objet Locale de l’objet
SimpleUniverse
10 Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis
Construire un graphe simplifié
VirtualUniverse
BranchGroup
SShape3D
Apparence
View
Locale
BG BG
Géométrie
TG TransformGroup
Plateforme vue Canvas3D Screen3D
PhysicalBodyContenu
Vue
PhysicalEnvironment
11 Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis
La branche Vue
• Constructeur d’ « Univers Simple »• SimpleUniverse()
• SimpleUniverse(Canvas3D canvas3D)
– Crée une branche vue par défaut
• La branche vue contient une image plate
• L’image plate est le rectangle où le contenu est projeté
12 Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis
L’Image Plate
oeilImage plate
projecteurs
Objet 3D
13 Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis
L’Image Plate
oeil
2,41 m
Objet 3D
x
y
z
Image plate
14 Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis
L’image plate (suite)
• SimpleUniverse contient un objet ViewingPlatform– ViewingPlatform getViewingPlatform()
retourne l’objet ViewingPlatform
• void setNominalViewingTransform() de la classe ViewingPlatform place la distance de vue à 2.41 m de l’objet
15 Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis
Ajout de contenu et compilation
• Pas de recette pour le contenu !• Dans la classe SimpleUniverse
– void addBranchGraph(BranchGroup bg) permet d’ajouter la branche de contenu
– La branche est alors vivante ainsi que tous ses objets
– Les objets vivants ne peuvent être modifiés sauf s’ils possèdent des capacités de modification
16 Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis
Ajout de contenu et compilation
• void compile() de la classe BranchGroup converti les objets en une forme adaptée au « rendu »
• SceneGraphObject est la classe parente de Group, Leaf, et NodeComponent.
Elle contient les méthodes :– boolean isCompiled()– boolean isLive()
17 Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis
Exemple de programme type : Hello3D
• La classe principale doit posséder une méthode construisant la branche de contenu
public class Hello3D extends JFrame{
public Hello3D(String _nom, int _largeur, int _hauteur) { super(_nom);
Container content = getContentPane(); setBounds(10, 10, _largeur, _hauteur); content.setLayout(new BorderLayout());
GraphicsConfiguration config =SimpleUniverse.getPreferredConfiguration();
Canvas3D canvas3D = new Canvas3D(config); content.add("Center", canvas3D);
18 Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis
Exemple de programme type : Hello3D
// création de la scène (les objets 3D, …) BranchGroup scene = creerScene(); scene.compile();
// création de l’univers SimpleUniverse simpleU = new SimpleUniverse(canvas3D);
// fait passer la ViewPlatform en arrière pour que les // objets puissent s’afficher
simpleU.getViewingPlatform().setNominalViewingTransform();
// ajout de la scène compiléesimpleU.addBranchGraph(scene);
setDefaultCloseOperation(EXIT_ON_CLOSE);
} // fin du constructeur
19 Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis
Exemple de programme type : Hello3D
• Ajout d’un cube coloré, situé à l’origine du monde virtuel, orienté face à la vue.Il apparaît donc comme un carré.
public BranchGroup creerScene() {
// Crée la racine de la brancheBranchGroup objRoot = new BranchGroup();// Crée un nœud feuille simple, l’ajoute à la branche// ici un cube de 80 cm de côtéobjRoot.addChild(new ColorCube(0.4));return objRoot;
}
20 Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis
Exemple de programme type : Hello3D• Il reste l’appel de la fenêtre :
public static void main(String[] args) {
Hello3D frame = new Hello3D("Hello3D", 256, 256);frame.show();
}}// fin de la classe Hello3D
• Et les importations de packages et classes :import java.awt.BorderLayout;import java.awt.Container;import javax.swing.JFrame;import java.awt.event.*;import com.sun.j3d.utils.universe.*;import com.sun.j3d.utils.geometry.ColorCube;import javax.media.j3d.*;import javax.vecmath.*;
21 Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis
Exemple de programme type : Hello3D
VirtualUniverse
Locale
BG
ColorCube
Branche de vue
22 Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis
Rotation et Transformation du cube
• La classe Transform3D permet de créer des objets rotation, translation, redimension.
• Ces objets peuvent être combinés et sont utilisés dans un groupe (TransformGroup)
23 Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis
Rotation et Transformation du cube
• Quelques méthodes de Transform3D :– void rotX(double angle)– void rotY(double angle)– void rotZ(double angle)
• Les angles sont en radians (l’utilisation de Math.PI est recommandée)
– void set(Vector3f translate)
24 Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis
Rotation et Transformation du cube
• Les objets de type javax.vecmath.Vector3f sont utilisés pour les translations.
• Constructeurs : – Vector3f()– Vector3f(float x, float y, float z)
25 Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis
Rotation et Transformation du cube
• Un obet de type TransformGroup contient un objet Transform3D, combinaison d’objets Transform3D
• Constructeurs :– TransformGroup()– TransformGroup(Transform3D t)
• Il est possible d’utiliser la méthode – void setTransform(Transform3D t)
26 Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis
Exemple de rotation du cube
public BranchGroup creerScene() {
BranchGroup objRoot = new BranchGroup();// création d’un objet Transform3DTransform3D rotate = new Transform3D();// déclaration d’une rotation sur l’axe des x de 45°rotate.rotX(Math.PI/4.0d);// création du groupe des transformationsTransformGroup objRotate = new TransformGroup(rotate);// application de la transformation au cubeobjRotate.addChild(new ColorCube(0.4));// ajout du groupe de tranformation à la scèneobjRoot.addChild(objRotate);return objRoot;
}
27 Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis
Exemple de rotation du cube
VirtualUniverse
Locale
BG
ColorCube
Branche de vue
TG
x
28 Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis
Exemple de rotations du cubepublic BranchGroup creerScene() {
BranchGroup objRoot = new BranchGroup();Transform3D rotateX = new Transform3D();Transform3D rotateY = new Transform3D();rotateX.rotX(Math.PI/4.0d);rotateY.rotY(Math.PI/5.0d);// combinaison des transformationsrotateX.mul(rotateY);// création du groupe des transformationsTransformGroup objRotate = new TransformGroup(rotateX);// application de la transformation au cubeobjRotate.addChild(new ColorCube(0.4));// ajout du groupe de tranformation à la scèneobjRoot.addChild(objRotate);return objRoot;
}
29 Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis
Exemple de rotations du cube
VirtualUniverse
Locale
BG
ColorCube
Branche de vue
TG
x
y
30 Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis
Compilation
• La compilation de la scène permet un affichage plus élaboré
• Elle optimise le graphe. Exemple :
BG
ColorCube
Branche de vue
TG
BGBranche de vue
TG
ColorCube
TG
compilation
31 Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis
Capacités dynamiques
• La compilation fixe les propriétés• Mais les objets peuvent avoir la capacité de
se modifier (pour les animations, …)• Utilisation des méthodes de la super classe
SceneGraphObject pour déterminer les bits de capacité :– void clearCapability(int bit)– boolean getCapability(int bit)– void setCapability(int bit)
32 Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis
Capacités dynamique
• Bits de capacité de transformation :– ALLOW_TRANSFORM_READ : le nœud de transformation
peut lire les informations sur ses objets– ALLOW_TRANSFORM_WRITE : le nœud de
transformation peut modifier les informations sur ses objets
• Bits de capacité de groupe :– ALLOW_CHILDREN_EXTEND : permet d’ajouter des
enfants au groupe– ALLOW_CHILDREN_READ : permet de lire les
informations sur les enfants– ALLOW_CHILDREN_WRITE : permet de modifier les
information sur les enfants
33 Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis
Ajout de comportement
• Un comportement (classe Behavior) permet d’animer ou d’interagir avec des objets 3D
• Chaque objet possède son comportement
• Des comportements complexes peuvent dégrader l’affichage :– Définition d’une région de comportement– Un comportement n’est actif que lorsque sa région croise le
volume d’activation de la ViewPlatform lorsqu’il peut être vu…
34 Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis
Animation temporisée
• La classe Interpolator est une des nombreuses classes de comportement
• Elle est basée sur le temps,• Un comportement peut être lié :
– à la position (PositionInterpolator), – à l’orientation (RotationInterpolator), – à la taille (ScaleInterpolator), – à la couleur (ColorInterpolator), – à la transparence (TransparencyInterpolator)
d’un objet visuel.
35 Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis
Recette d’une Animation temporisée• Pour ajouter un comportement avec un objet
Interpolator, il faut :– Créer un groupe TransformGroup– Mettre en place la capacité ALLOW_TRANSFORM_WRITE– Créer un objet Alpha (classe pour fonctions liées au temps)– Définir les paramètres temporels pour l’objet Alpha– Créer l’objet Interpolator
• Le lier aux objets Alpha et TransformGroup• Personnaliser le paramètres de comportement
– Définir une région de comportement• La mettre en place autour du comportement
– Lier ce comportement au groupe
36 Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis
Associer un comportement au temps
• La classe Alpha fournit un nombre n compris entre 0 et 1 : n ∈ [0,1]
• n est dépendant du temps et des paramètres de l’objet Alpha
• Il existe 10 paramètres• Un objet Alpha est associé à un comportement
pour décrire :– des mouvements de rotation, – de balancier, – des événements ponctuels (ouverture de porte, …)
37 Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis
Associer un comportement au temps
• La classe Alpha possède deux constructeurs :• Alpha()
– Créé une boucle continue d’une période de 1 seconde
• Alpha(int nbBoucles, int duree)– Créé nbBoucles de temps de 0 à 1, de durée
millisecondes.– Si nbBoucles = -1 alors l’objet boucle
continuellement
38 Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis
Créer la zone de comportement
• La classe BoundingSphere permet de créer une zone sphérique délimitant un comportement
• En général, la sphère est centrée en (0,0,0)• Son rayon doit couvrir les objets• Constructeurs:
– BoundingSphere()• Sphère centrée en (0,0,0), de rayon 1
– BoundingSphere(Point3d centre, double rayon)• Sphère centrée en centre, de rayon rayon
• La méthode void setSchedulingBounds(Bounds region) de la classe Behavior permet d’associer une zone de comportement à un comportement
39 Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis
Exemple d’animation du cubepublic BranchGroup creerScene() {
BranchGroup objRoot = new BranchGroup();TransformGroup objCycle = new TransformGroup();objCycle.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);objRoot.addChild(objCycle);objCycle.addChild(new ColorCube(0.4)); // création de la fonction temporelle, boucles de 4 secondesAlpha rotationAlpha = new Alpha(-1, 4000); // création du comportement, rotation sur l’axe des y par défautRotationInterpolator rotateur = new RotationInterpolator(rotationAlpha, objCycle); // création de la sphère de comportementBoundingSphere zone = new BoundingSphere();rotateur.setSchedulingBounds(zone);objCycle.addChild(rotateur);return objRoot;
}
40 Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis
Exemple d’animation du cube
VirtualUniverse
Locale
BG
ColorCube
Branche de vue
TG
B
y
41 Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis
Changement de l'axe de rotationpublic BranchGroup creerScene() {
BranchGroup objRoot = new BranchGroup();TransformGroup objCycle = new TransformGroup();objCycle.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);objRoot.addChild(objCycle);objCycle.addChild(new ColorCube(0.4)); // création de la fonction temporelle, boucles de 4 secondesAlpha rotationAlpha = new Alpha(-1, 4000); // création du comportement, rotation sur l’axe des y par défautRotationInterpolator rotateur = new RotationInterpolator(rotationAlpha, objCycle);
// définition d'une rotation sur l'axe des xTransform3D rotationSurX = new Transform3D();rotationSurX.rotX(Math.PI/2);rotateur.setTransformAxis(rotationSurX);// création de la sphère de comportementBoundingSphere zone = new BoundingSphere();rotateur.setSchedulingBounds(zone);objCycle.addChild(rotateur);return objRoot;
}
42 Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis
Changement de l'axe de rotation
y
xy'
43 Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis
Rotation et animation du cubepublic BranchGroup creerScene() {BranchGroup objRoot = new BranchGroup(); Transform3D rotateX = new Transform3D(); Transform3D rotateY = new Transform3D();rotateX.rotX(Math.PI/4.0d); rotateY.rotY(Math.PI/5.0d); rotateX.mul(rotateY);TransformGroup groupRotate = new TransformGroup(rotateX);
TransformGroup groupCycle = new TransformGroup();groupCycle.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);objRoot.addChild(groupRotate); groupRotate.addChild(groupCycle);groupCycle.addChild(new ColorCube(0.4));
Alpha rotationAlpha = new Alpha(-1, 4000);RotationInterpolator rotateur = new RotationInterpolator(rotationAlpha, groupCycle);BoundingSphere zone = new BoundingSphere();rotateur.setSchedulingBounds(zone);groupCycle.addChild(rotateur);
return objRoot;}
44 Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis
Exemple de rotation et d'animation du cube
Locale
BG
ColorCube
Branche de vue
TG
B
y
objRoot
groupRotate TG
groupCycle
x
45 Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis
Combinaison d'animations
Locale
BG
Branche de vue
TG
objRoot
TG
rayon de rotation
B
rotation
ColorCube
TGB
oscillation
y
x
46 Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis
Combinaison d'une rotation et d'une oscillationpublic BranchGroup creerScene() {
// nœud racineBranchGroup objRoot = new BranchGroup(); // ** début nœud rotationTransformGroup tgRotation =new TransformGroup();// autoriser la modificationtgRotation.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);// rotation continuelle sur 4 secondesAlpha rotationAlpha=new Alpha(-1,4000);// création du comportementRotationInterpolator rotator=new RotationInterpolator(rotationAlpha, tgRotation);// zone d'application du comportementBoundingSphere zone1=new BoundingSphere();rotator.setSchedulingBounds(zone1);// ajout du comportement au groupe rotationtgRotation.addChild(rotator);// ajout du groupe rotation à la racineobjRoot.addChild(tgRotation);// ** fin nœud rotation
…
47 Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis
Combinaison d'une rotation et d'une oscillation
// ** début rayon de rotation de 0.5 m sur l'axe des xTransform3D rayon=new Transform3D();rayon.set(new Vector3f(0.5f, 0.0f, 0.0f));TransformGroup tgRayon=new TransformGroup(rayon);// ajout du nœud rayon au nœud rotationtgRotation.addChild(tgRayon);// ** fin rayon de rotation
// ** début de l'oscillation sinusoïdale et verticale// description de l'oscillationTransform3D oscil=new Transform3D();// noeud oscillationTransformGroup tgOscil=new TransformGroup();// autoriser la modificationtgOscil.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);// oscillation continue sur 2 secondesAlpha oscilAlpha = new Alpha(-1,2000);
…
48 Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis
Combinaison d'une rotation et d'une oscillation
// création du chemin que doit parcourir l'objet, ici sur 3 points : départ, arrivée, départPoint3f[] chemin=new Point3f[3];chemin[0]=new Point3f(0.0f, 0.15f, 0.0f);chemin[1]=new Point3f(0.0f, -0.15f, 0.0f);chemin[2]=new Point3f(0.0f, 0.15f, 0.0f);// pour une période de 1 seconde, le premier point est atteint au temps 0, // le second au temps 0.5 et le dernier au temps 1float[] activationPoints ={0.0f, 0.5f, 1.0f};// création du comportementPositionPathInterpolator oscillator =
new PositionPathInterpolator(oscilAlpha, tgOscil, oscil, activationPoints, chemin);// zone d'application du comportementBoundingSphere zone2 = new BoundingSphere();oscillator.setSchedulingBounds(zone2);// ajout de l'oscillateur au nœud d'oscillationtgOscil.addChild(oscillator);// ajout du nœud oscillation au nœud rayontgRayon.addChild(tgOscil);// ** fin de l'oscillation sinusoïdale et verticale// ajout du cube de 40 cm au nœud oscillationtgOscil.addChild(new ColorCube(0.2));
return objRoot;}
49 Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis
Combinaison de rotations
LocaleBG
Branche de vue
TG
objRoot
TG
rayon de rotation
B
rotation
ColorCube
TGB
rotation
y
y'
TG rotation axe x 90°
50 Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis
Combinaison de rotationspublic BranchGroup creerScene() {
// nœud racineBranchGroup objRoot = new BranchGroup(); // ** début nœud rotationTransformGroup tgRotation1 = new TransformGroup();tgRotation1.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);// rotation sur une période de 4 secondesAlpha rotationAlpha1 = new Alpha(-1,4000);RotationInterpolator rotator1=new RotationInterpolator(rotationAlpha1, tgRotation1);// zone d'application du comportementBoundingSphere zone1 = new BoundingSphere();rotator1.setSchedulingBounds(zone1);// ajout du comportement au groupe rotationtgRotation1.addChild(rotator1);// ajout du groupe rotation à la racineobjRoot.addChild(tgRotation1);// ** fin nœud rotation
…
51 Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis
Combinaison de rotations// ** début rayon de rotation de 0.5 m sur l'axe des xTransform3D rayon=new Transform3D();rayon.set(new Vector3f(0.5f, 0.0f, 0.0f));TransformGroup tgRayon=new TransformGroup(rayon);// ajout du nœud rayon au nœud rotationtgRotation1.addChild(tgRayon);// ** fin rayon de rotation
// ** début rotation fixe de 90° sur l'axe xTransform3D rotationFixe = new Transform3D();rotationFixe.rotX(Math.PI/2);TransformGroup tgRotationFixe=new TransformGroup(rotationFixe);// ajout du nœud rayon au nœud rotationtgRayon.addChild(tgRotationFixe);// ** fin rayon de rotation
…
52 Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis
Combinaison de rotations// ** début nœud rotationTransformGroup tgRotation2 = new TransformGroup();tgRotation2.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);// rotation sur une période de 2 secondesAlpha rotationAlpha2 = new Alpha(-1,2000);RotationInterpolator rotator2=new RotationInterpolator(rotationAlpha2, tgRotation2);// zone d'application du comportementBoundingSphere zone2 = new BoundingSphere();rotator2.setSchedulingBounds(zone2);// ajout du comportement au groupe rotationtgRotation2.addChild(rotator2);// ajout du groupe rotation à la racinetgRotationFixe.addChild(tgRotation2);// ** fin nœud rotation// ajout du cube de 40 cm au nœud oscillationtgRotation2.addChild(new ColorCube(0.2));
return objRoot;}
Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis
Exercices
54 Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis
Exercice 1. Ordre de rotation
• Dans l’exemple n°2 (page 29),que se passe t il si on intervertit les rotations ?
55 Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis
Exercice 1. Ordre de rotation
• Dans l’exemple n°2 (page 29),que se passe t il si on intervertit les rotations ?
56 Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis
Exercice 2. Ordre de transformation
• Dans l’exemple n°6 (page 44)que se passe t il si on intervertit les transformations ?
57 Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis
Exercice 2. Ordre de transformation
• Dans l’exemple n°6 (page 44)que se passe t il si on intervertit les transformations ?
58 Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis
Exercice 3. Combinaison de comportements
• En se basant sur le code de la page 47, créer le graphe de scène correspondant
y
x
59 Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis
Exercice 4. Combinaison de rotations
• En se basant sur graphe de la page 50, donner le code correspondant
y
y'
60 Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis
Exercice 5. Planètes cubiques
• Donner le graphe et le code correspondant au fonctionnement de la figure ci dessous