initiation à java 3d - java : supports de cours

Post on 20-Jun-2022

10 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

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

top related