graphe de scene.
Transcription
graphe de scene.
Java3D Généralités sur la synthèse d'images temps réel Généralités sur Java3D d 'après P.Reignier, UJF Généralités sur la 3D Pourquoi utiliser une représentation en 3D ? Réalisme Compréhension accrue d'un modèle à 3 dimensions => travail du système perceptif humain plutôt que du système cognitif Représentations des molécules en chimie Mouvement des astres en astronomie Topographies de terrains en cartographie Représentation d'organes en médecine Interactions riches et intuitives avec de multiples données Synthèses d'images : API bas niveau Aspect matériel : facultatif mais fortement conseillé Stations spécialisées : SGI, Sun, HP, IBM Cartes accélératrices : PC, Mac (dans une moindre mesure) Aspect logiciel APIs API bas niveau Interface avec le matériel Emule le matériel inexistant Très bas niveau d'abstraction : Sommets, faces Processus de rendu Exemples : OpenGL : standard multi OS, multi machines Direct3D IM : Windows API haut niveau S'appuient sur les APIs bas niveau Haut niveau d'abstraction : Objets par opposition à sommets Contenu par oppostion à processus de rendu Graphe de scènes Exemples : Open Inventor, Performer, OpenGL Optimizer, Java 3D Direct3D RM Construction avion : graphe de scène Scène 3D : hiérarchie d'objets => notion de graphe de scène Exemple : éléments constituant la scène Construction avion : graphe de scène On commence à regrouper les éléments Construction avion : graphe de scène On finit l'avion Construction avion : graphe de scène Le graphe de scène Graphe de scène : plusieurs objets Java3D ? API destinée à l'affichage 3D sous Java : développée par SUN en 1998 Java 3D destinée à l'écriture d'applications et d'Applets. Conçue dans le but de faciliter la programmation : Classes pour la création de scènes 3D Classes pour la manipulation de ces scènes Justifiée par la portabilité de Java qui permet la portabilité des applications Java 3D sur toute plate forme où Java existe (Solaris, Windows) : accès à tous les packages Java Rendu3D Rendu haute performance Utilisation de l'accélération 3D matérielle si possible Basé sur : OpenGL Direct3D Applications Visualisation scientifique Visualisation d'informations Entraînement médical Système d'information géographique CAO etc Visualisation scientifique Visualisation médicale Conception Assistée par Ordinateur Java3D Introduction Organisation d'une scène : Graphe de scène Ecrire un programme Java3D Les classes principales Un peu d'animation API Java3D Chaque programme Java3D est assemblé à partir d'objets provenant des classes Java3D : − Plus de 100 classes et des centaines de méthodes et champs présents dans le package javax.media.j3d appelé aussi core package − D'autres packages sont utilisés : Classes d'objets fonctionnels : com.sun.j3d.utils Classes d'outils de fenêtrage (AWT) : java.awt Classes d'objets mathématiques : javax.vecmath Cette collection d'objets décrit un univers virtuel « virtual universe » qui représente ce qui est rendu Graphe de scène (Scene Graph) L'« univers virtuel » java3D est créé à partir d'un graphe de scènes : − Feuilles : formes 3D, lumières, sons, comportements, .. − Parents : groupe d'enfants, transformation 3D, .. 2 points de vue : − Développeur : construction et mise à jour d'un graphe à l'aide des classes et des méthodes Java3D − Java3D : rendu à l'écran du contenu du graphe (moteur de rendu : ZBuffer + ombrage de Gouraud) Rendu du graphe Ordre du parcours du graphe : choisi par Java3D Rendu via des threads indépendants et asynchrones: − Graphique (objets) − Fonctionnalités classiques : brouillard, antialiassage, ... − Son − Comportement (« behaviors ») − Animation (« interpolators ») − Périphériques d'entréesortie − Événements (détection de collision) Graphe de scènes Représentation et terminologie Graphe de scènes Représentation et terminologie Graphe de scènes Représentation et terminologie Univers Virtuel (virtual universe) : Collection de graphes de scènes Un par application (possibilité d'en avoir 2, mais aucune com) C'est le sommet du graphe Repère (Locale) : généralement un par univers Graphe de scènes : généralement plusieurs par repère Noeuds (nodes) − Groupe (group) : peut avoir plusieurs enfants mais un seul parent (ex: BranchGroup, TransformGroup) − Feuille (Leaf) : un seul parent et aucun enfant (ex : Shape3D, Light, Behavior, Sound) Graphe de scènes Représentation et terminologie Graphe de scènes Représentation et terminologie Composant du Noeud (NodeComponent) − Définit les attributs géométriques et d'apparence utilisés pour le rendu des objets décrits par le noeud du graphe qui lui est associé (ex : texture, matériel, géométrie) − Ne fait pas partie du graphe de scènes 2 types d'arcs : − « parentenfant » : lie les noeuds de l'arbre du graphe − « référence » : lie un noeud de l'arbre à un objet NodeComponent N'appartient pas à l'arbre du graphe de scènes Graphe de scènes Représentation et terminologie BranchGroup : racine d'un sousgraphe ou graphe de branches 2 types de branches (Branch Graph) : − Branche de scènes (content branch graph) : Spécifie les contenus de l'univers virtuel (Node et NodeComponent) : géométrie, apparence, comportement, emplacement dans la scène, son, lumières Plusieurs par univers − Branche de visualisation (view branch graph) : Spécifie les paramètres de visualisation : emplacement de vision, direction de vision Généralement une par univers Aperçu de la hiérarchie de classes class java.lang.Object − class javax.media.j3d.VirtualUniverse − class javax.media.j3d.SceneGraphObject class javax.media.j3d.Node − − class javax.media.j3d.NodeComponent − − − class javax.media.j3d.Group class javax.media.j3d.BranchGroup class javax.media.j3d.Switch class javax.media.j3d.Leaf class javax.media.j3d.Background class javax.media.j3d.Behavior class javax.media.j3d.Geometry class javax.media.j3d.Appearance class javax.media.j3d.View Ecrire un programme Java3D Créer un objet Canvas3D (fournit une image dans la fenêtre d'affichage) Créer un objet VirtualUniverse Créer un objet Locale, l'attacher à l'objet VirtualUniverse 4. Construire un graphe de branche de visualisation : − Créer un objet View, ViewPlatform, PhysicalBody, PhysicalEnvironment − Attacher les objets ViewPlatform, PhysicalBody, PhysicalEnvironment, Canvas3D à l'objet View 5. Construire le(s) graphe(s) de branche de scène 6. Compiler les graphes de branche Insérer les sousgraphes dans le repère Locale Programme simple la classe SimpleUniverse la classe SimpleUniverse (com.sun.j3d.utils.universe) va permettre de décrire les points 2, 3, et 4 Le constructeur de l'objet SimpleUniverse crée un graphe de scène incluant : les objets VirtualUniverse et Locale un graphe de branche de visualisation complet On rattache le Canvas3D à l'objet View en passant Canvas3D en paramètre au constructeur. Le graphe de branche de visualisation créé inclut un plaqué de l'image (« image plate ») SimpleUniverse y z x Programme simple la classe ViewingPlatform La classe SimpleUniverse a un objet appartenant à la classe ViewingPlatform La classe ViewingPlatform a une méthode setNominalViewingTransform() qui positionne les yeux à (0,0,2.41). A cette distance et dans un champ de vue par défaut, les objets de hauteur et largeur de 2m « tiennent » dans le plaqué. On récupère l'objet ViewingPlatform créé par le SimpleUniverse grâce à la méthode de la classe SimpleUniverse : − ViewingPlatform getViewingPlatform() Programme facile graphe de branche de scènes La régularité de structure n'existe pas pour les graphes de branche de scènes On crée un BranchGroup par branche de scène qui est ajouté au graphe comme fils de l'objet Locale (créé par le SimpleUniverse) : − void addBranchGroup(BranchGroup bg) − Lorsque l'objet est ajouté, on dit qu'il est « vivant » Les objets BranchGroup peuvent être compilés afin de convertir l'objet et tous ses ancêtres en une forme plus efficace pour le renderer : − void compile() Exemple Programme simple 1/3 Public class Hello extends Applet { public Hello() { setLayout(new BorderLayout()); //permet de créer la fenêtre de vision 1. GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration(); Canvas3D canvas3D = new Canvas3D(config); add("Center",canvas3D); 2/3/4. SimpleUniverse simpleU = new SimpleUniverse(canvas3D); //on place les objets pour qu'ils soient vus simpleU.getViewingPlatform().setNominalViewingTransform(); 5. BranchGroup scene = createSceneGraph(); 6. scene.compile(); 7. simpleU.addBranchGraph(scene); } Programme simple 2/3 construction d'un graphe de scene public BranchGroup createSceneGraph() { BranchGroup objRoot = new BranchGroup(); //crée la racine du graphe objRoot.addChild(new ColorCube(0.4)); //création d'un objet simple return objRoot; } public static void main(String[] args) { //permet de fournir un cadre pour une applet (ici : « Hello() ») pour pouvoir l'exécuter comme une application 3D (dans une fenêtre) Frame frame = new MainFrame(new Hello(), 256, 256); } } Programme simple 3/3 packages utilisés La plupart des classes utilisées en Java3D se trouvent dans les packages : javax.media.j3d javax.vecmath Dans la plupart des programmes Java3D on retrouvera les packages suivants : import java.applet.Applet; import com.sun.j3d.utils.universe.*; import java.awt.BorderLayout; import com.sun.j3d.utils.geometry; import java.awt.Frame; import javax.media.j3d.*; import java.awt.event.*; import javax.vecmath.*; import com.sun.j3d.utils.applet.MainFrame; http://download.java.net/media/java3d/javadoc/1.3.2/overviewsummary.html Transformations des objets classe Transform3D 1/2 Les objets Transform3D représentent des transformations de géométrie 3D (rotation, ...) Ces objets ne sont utilisables que dans le cadre d'une création d'un objet TransformGroup Les objets Transform3D peuvent être combinés Ces objets sont représentés en interne comme des matrices 4x4 de flottants en double précision ligne par ligne Le constructeur Transform3D() construit la matrice identité Transformations des objets classe Transform3D 2/2 Transformations de base : − rotX(double angle), rotY(angle), rotZ(angle) où l'angle est spécifié en radians La rotation autour des axes se fait dans le sens des aiguilles La valeur de pi est donnée par la constante Math.PI − set (params) où params peut être par exemple : Vector3f translate : alors seuls les composants de la matrice identité correspondant à la translation sont modifiés double scale : met les valeurs de la transformée à une échelle uniforme ; toutes les valeurs de la matrice sont modifiées Transformations des objets classe TransformGroup La classe TransformGroup permet d'appliquer des transformations sur tous les objets de son sousgraphe. On passe l'objet Transform3D : − à la création : TransformGroup(Transform3D t) − ou en utilisant la méthode set(Transform3D t) après l'avoir construit par TransformGroup() Transformations des objets exemple : rotations d'un cube 1/2 1. créer la transformation : une rotation « tmpRotate » par rapport à Oy, précédée d'une rotation « rotate » par rapport à Ox, la combinaison finale étant représentée par « rotate » Transform3D rotate = new Transform3D(); rotate.rotX(math.PI/4.0d); Transform3D tmpRotate = new Transform3D(); tmpRotate.rotY(math.PI/5.0d); rotate.mul(tmpRotate); 2. Rattacher la transformation au TransformGroup TransformGroup objRotate = new TransformGroup(rotate); Transformations des objets exemple : rotations d'un cube 2/2 3. Rattacher l'objet « ColorCube » (sur lequel la transformation va être appliquée) comme fils du TransformGroup objRotate.addChild(new ColorCube(0.4)); 4. Rattacher le TransformGroup à son parent le BranchGroup BranchGroup objRoot = new BranchGroup(); objRoot.addChild(objRotate); Exemple représentation du graphe de scène BG objRoot TG objRotate Objet ColorCube T3D rotate Performances Le graphe de scène construit par un programme Java3D pourrait être utilisé directement en rendu, mais la représentation n'est pas très efficace => utilisation d'une représentation interne pour l'univers virtuel qui est obtenue par : − Compilation du graphe de la branche avec compile() − Insertion du graphe de la branche dans l'univers virtuel pour le rendre « vivant » A chacune de ces actions correspond une méthode dans la classe SceneGraphObject renvoyant un booléen : isCompiled(), isLive() Capacités (« capabilities ») Les effets de la transformation du graphe en représentation interne sont de : Fixer les valeurs des transformations et d'autres objets Mais il y a des cas où on a besoin de changer les valeurs dans le graphe de scène de l'objet après qu'il soit devenu « vivant » (exemple : pour réaliser des animations un objet TransformGroup doit avoir des valeurs différentes) On appelle la liste des paramètres ayant des valeurs modifiables les capacités de l'objet (varie en fonction de la classe) Chaque graphe de scène a un ensemble de bits de capacité dont les valeurs déterminent quelles capacités existent pour l'objet « vivant » Exemples de capacités Capacités de la classe TransformGroup : − 2 et seulement 2 qui spécifient que le TransformGroup permet d'accéder/modifier les informations de transformations de cet objet ALLOW_TRANSFORM_READ : accès ALLOW_TRANSFORM_WRITE : modifier − TransformGroup hérite des capacités de ses parents Capacités de la classe Group : ALLOW_CHILDREN_EXTEND : les enfants peuvent être ajoutés au noeud après qu'il ait été compilé ALLOW_CHILDREN_READ : permet de lire les références aux enfants de ce noeud Un peu d'animation ... la classe Behavior Behavior permet de spécifier : − des animations d'objets visuels (réponses au temps qui passe) − ou des interactions entre ces objets (réponses aux activités de l'utilisateur) Le behavior peut changer virtuellement tout attribut d'un objet visuel : − Plusieurs behavior prédéfinis existent − On peut créer son propre behavior Une fois que le behavior est spécifié, le système Java3D met à jour les position, couleur, ... Un objet visuel peut avoir plusieurs behavior Un peu d'animation ... Behavior comment ? Pour spécifier un behavior pour un objet visuel : − Créer les objets que spécifie le behavior − Ajouter l'objet visuel au graphe de scène − Faire les références appropriées parmi les objets du graphe et les objets du behavior − Exemple de behavior : Interpolator basée sur le temps Pour éviter la surcharge de calculs, un behavior aura une zone d'action (« scheduling region») et il sera actif seulement lorsque sa zone d'action intersectera le volume d'activation de la zone de vision ViewPlatform Un peu d'animation les étapes Créer un TransformGroup cible mettre la capacité ALLOW_TRANSFORM_WRITE Créer un objet Alpha spécifier les paramètres de temps pour alpha Créer un objet Interpolator lui faire référencer les objets Alpha et TransformGroup adapter les paramètres du behavior Spécifier une zone d'action la rattacher au behavior 5.Lier le behavior comme enfant du TransformGroup Un peu d'animation ... Exemple : RotationInterpolator Interpolator permet de réaliser différentes actions, on parle de ixInterpolator où ix est remplacé par : Position (position), Rotation (orientation), Scale (taille), Color (couleur), Transparency (transparence) RotationInterpolator : − change un objet TransformGroup en une rotation spécifique en réponse à la valeur d'un objet Alpha − Peut spécifier l'axe de rotation, l'angle de départ, l'angle d'arrivée − Constructeur RotationInterpolator(Alpha alpha, TransformGroup target) Un peu d'animation ... le temps et la zone d'action Classe Alpha fournit des objets pour convertir le temps en une valeur alpha (valeur entre 0 et 1) : la fonction f(t) et les caractéristiques de l'objet Alpha peuvent être données par l'utilisateur via les méthodes de la classe : − Constructeur Alpha() : boucle continue pendant 1s − Constructeur Alpha(int loopCount, long alphaDuration) : ceci est répété autant de fois que la valeur de loopCount (si=1=> infini) avec une durée de alphaDuration (en ms) entre le début et la fin Pour définir la zone d'action on utilise la méthode setSchedulingBounds (de la classe Behavior) avec en paramètre le type de zone : on utilise souvent l'objet BoundingSphere (constructeur BoundingSphere() de rayon 1) dont on peut spécifier le centre et le rayon Exemple : rotation du cube coloré HelloUniverse3Dc.java Un peu d'animation ... les étapes : exemple de fonction public BranchGroup createSceneGraph() { BranchGroup objRoot = new BranchGroup(); 1. TransformGroup objSpin = new TransformGroup(); objSpin.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); objRoot.addChild(objSpin); objSpin.addChild(ColorCube(0.4)); 2. Alpha rotationAlpha = new Alpha(1, 4000); 3. RotationInterpolator rotator = new RotationInterpolator(Alpha, objSpin); 4. rotator.setSchedulingBounds(new BoudingSphere()); 5. objSpin.addChild(rotator); return objRoot; } Exemple représentation du graphe de scène