initiation à java 3d - java : supports de cours

60
Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis Initiation à Java 3D Initiation à Java 3D

Upload: others

Post on 20-Jun-2022

10 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Initiation à Java 3D - Java : Supports de cours

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

Page 2: Initiation à Java 3D - Java : Supports de cours

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

Page 3: Initiation à Java 3D - Java : Supports de cours

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

Page 4: Initiation à Java 3D - Java : Supports de cours

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, …)

Page 5: Initiation à Java 3D - Java : Supports de cours

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, …)

Page 6: Initiation à Java 3D - Java : Supports de cours

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

Page 7: Initiation à Java 3D - Java : Supports de cours

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

Page 8: Initiation à Java 3D - Java : Supports de cours

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

Page 9: Initiation à Java 3D - Java : Supports de cours

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

Page 10: Initiation à Java 3D - Java : Supports de cours

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

Page 11: Initiation à Java 3D - Java : Supports de cours

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é

Page 12: Initiation à Java 3D - Java : Supports de cours

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

Page 13: Initiation à Java 3D - Java : Supports de cours

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

Page 14: Initiation à Java 3D - Java : Supports de cours

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

Page 15: Initiation à Java 3D - Java : Supports de cours

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

Page 16: Initiation à Java 3D - Java : Supports de cours

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()

Page 17: Initiation à Java 3D - Java : Supports de cours

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);

Page 18: Initiation à Java 3D - Java : Supports de cours

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

Page 19: Initiation à Java 3D - Java : Supports de cours

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;

}

Page 20: Initiation à Java 3D - Java : Supports de cours

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.*;

Page 21: Initiation à Java 3D - Java : Supports de cours

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

Page 22: Initiation à Java 3D - Java : Supports de cours

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)

Page 23: Initiation à Java 3D - Java : Supports de cours

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)

Page 24: Initiation à Java 3D - Java : Supports de cours

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)

Page 25: Initiation à Java 3D - Java : Supports de cours

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)

Page 26: Initiation à Java 3D - Java : Supports de cours

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;

}

Page 27: Initiation à Java 3D - Java : Supports de cours

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

Page 28: Initiation à Java 3D - Java : Supports de cours

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;

}

Page 29: Initiation à Java 3D - Java : Supports de cours

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

Page 30: Initiation à Java 3D - Java : Supports de cours

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

Page 31: Initiation à Java 3D - Java : Supports de cours

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)

Page 32: Initiation à Java 3D - Java : Supports de cours

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

Page 33: Initiation à Java 3D - Java : Supports de cours

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…

Page 34: Initiation à Java 3D - Java : Supports de cours

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.

Page 35: Initiation à Java 3D - Java : Supports de cours

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

Page 36: Initiation à Java 3D - Java : Supports de cours

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, …)

Page 37: Initiation à Java 3D - Java : Supports de cours

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

Page 38: Initiation à Java 3D - Java : Supports de cours

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

Page 39: Initiation à Java 3D - Java : Supports de cours

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;

}

Page 40: Initiation à Java 3D - Java : Supports de cours

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

Page 41: Initiation à Java 3D - Java : Supports de cours

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;

}

Page 42: Initiation à Java 3D - Java : Supports de cours

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'

Page 43: Initiation à Java 3D - Java : Supports de cours

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;}

Page 44: Initiation à Java 3D - Java : Supports de cours

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

Page 45: Initiation à Java 3D - Java : Supports de cours

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

Page 46: Initiation à Java 3D - Java : Supports de cours

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

Page 47: Initiation à Java 3D - Java : Supports de cours

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);

Page 48: Initiation à Java 3D - Java : Supports de cours

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;}

Page 49: Initiation à Java 3D - Java : Supports de cours

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°

Page 50: Initiation à Java 3D - Java : Supports de cours

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

Page 51: Initiation à Java 3D - Java : Supports de cours

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

Page 52: Initiation à Java 3D - Java : Supports de cours

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;}

Page 53: Initiation à Java 3D - Java : Supports de cours

Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis Emmanuel ADAM – Université de Valenciennes et du Hainaut-Cambrésis

Exercices

Page 54: Initiation à Java 3D - Java : Supports de cours

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 ?

Page 55: Initiation à Java 3D - Java : Supports de cours

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 ?

Page 56: Initiation à Java 3D - Java : Supports de cours

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 ?

Page 57: Initiation à Java 3D - Java : Supports de cours

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 ?

Page 58: Initiation à Java 3D - Java : Supports de cours

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

Page 59: Initiation à Java 3D - Java : Supports de cours

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'

Page 60: Initiation à Java 3D - Java : Supports de cours

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