Java 3D |
||
INTRODUCTION GRAPHE DE SCÈNE PÉRIPHÉRIQUES DE SAISIE
ET CLASSES MATHÉMATIQUES EXEMPLES LES CLASSES
|
API Java de Sun destinée à l'affichage 3D sous Java. Java 3D destiné à l'écriture d'applications et d'Applets. Conçu dans le but de faciliter la programmation. Justifié par la portabilité de Java qui permet la portabilité des applications Java 3D sur toute plate-forme où Java3D existe (actuellement Solaris et Windows). Modélisation et affichage 3D de scènes (moteur de rendu: Z-Buffer + ombrage de Gouraud étendu). Évolutivité par dérivation de classes. Notion de "Behaviors": Possibilité d'implanter des comportements spécifiques programmés. Notion d'"Interpolator": Possibilité de "brancher" l'heure du système sur les variables définissant une scène -> animations. Détection des collisions entre objets. Sélection d'objets et gestion de périphériques de saisie. Fonctionnalités de l'informatique graphique classique:
Gestion des sons dans un environnement 3D. Graphe de scène (Scene graph) -> Description complète de la scène (ou univers virtuel). Programmation orientée objet. Modèles de rendu
Extensibilité Possibilité de créer ses propres classes par dérivation de classes existantes. Programmation simplifiée d'applications gérant concurremment des tâches du type:
Support natif de OpenGL, Direct 3D et QuickDraw 3D. Optimisations. La hiérarchie de classes Java3D Le package Java 3D est constitué d'une partie du package javax.media sous le nom javax.media.j3d. Ses classes sont (non exhaustivement):
Exemple de structure d'un programme Java 3D Deux composants superstructures: un objet VirtualUniverse et un objet Locale. Un ensemble de graphes branches dont les racines individuelles sont des objets BranchGroup. VirtualUniverse: Racine d'un graphe de scène. Une application peut contenir plusieurs "Univers Virtuels". Locale: Définit l'origine (repère) de tous les graphes branches. BranchGroup: Nud racine d'un graphe branche. Les graphes branche prennent en charge les diverses fonctionnalités liées à l'affichage 3D: construction de la scène, définition des paramètres de visualisation, ... Source correspondant au schéma ci-dessus |
|
/* Copyright (c) 1996-1998 * Sun Microsystems, Inc. * All Rights Reserved. * * Sun grants ("Licensee") a non-exclusive, * royalty free, license to use, modify * and redistribute this software in source * and binary code form, provided that * i) this copyright notice and license appear * on all copies of the software; and * ii) Licensee does not utilize the software * in a manner which is disparaging to Sun. * * This software is provided "AS IS," without * a warranty of any kind. ALL EXPRESS OR * IMPLIED CONDITIONS, REPRESENTATIONS * AND WARRANTIES, INCLUDING ANY IMPLIED * WARRANTY OF MERCHANTABILITY, FITNESS * FOR A PARTICULAR PURPOSE OR * NON-INFRINGEMENT, ARE HEREBY * EXCLUDED. SUN AND ITS LICENSORS SHALL NOT * BE LIABLE FOR ANY DAMAGES SUFFERED * BY LICENSEE AS A RESULT OF USING, * MODIFYING OR DISTRIBUTING THE SOFTWARE * OR ITS DERIVATIVES. IN NO EVENT * WILL SUN OR ITS LICENSORS BE LIABLE * FOR ANY LOST REVENUE, PROFIT OR DATA, * OR FOR DIRECT, INDIRECT, SPECIAL, * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE * DAMAGES, HOWEVER CAUSED AND REGARDLESS * OF THE THEORY OF LIABILITY, ARISING * OUT OF THE USE OF OR INABILITY TO USE * SOFTWARE, EVEN IF SUN HAS BEEN ADVISED * OF THE POSSIBILITY OF SUCH DAMAGES. * * This software is not designed or intended * for use in on-line control of aircraft, * air traffic, aircraft navigation * or aircraft communications; or in the * design, construction, * operation or maintenance of any nuclear * facility. Licensee represents and warrants * that it will not use or redistribute * the Software for such purposes. */ import java.applet.Applet; import java.awt.BorderLayout; import java.awt.event.*; import java.awt.GraphicsConfiguration; import com.sun.j3d.utils.applet.MainFrame; import com.sun.j3d.utils.geometry.ColorCube; import com.sun.j3d.utils.universe.*; import javax.media.j3d.*; import javax.vecmath.*; public class Hello extends Applet { public BranchGroup createSceneGraph() { // Cree la racine du graphe branche. BranchGroup objRoot = new BranchGroup(); // Cree le noeud transform group // et l'initialise a l'identité. // Autorise le flag TRANSFORM_WRITE // pour que notre programme behavior // puisse le modifier. // l'ajoute a la racine du sous-graphe. TransformGroup objTrans = new TransformGroup(); objTrans.setCapability( TransformGroup.ALLOW_TRANSFORM_WRITE); objRoot.addChild(objTrans); // Cree un noeud feuille forme simple, // et l'ajoute au graphe de scene. objTrans.addChild(new ColorCube(0.4)); // Cree un nouvel objet Behavior // qui realisera les operations desirees // sur l'objet transform specifie // et l'ajoute dans le graphe de scene. Transform3D yAxis = new Transform3D(); Alpha rotationAlpha = new Alpha(-1, Alpha.INCREASING_ENABLE, 0,0, 4000,0,0, 0,0,0); RotationInterpolator rotator = new RotationInterpolator( rotationAlpha, objTrans,yAxis, 0.0f, (float) Math.PI*2.0f); BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0); rotator.setSchedulingBounds(bounds); objTrans.addChild(rotator); // Compilation pour de meilleures // performances. objRoot.compile(); return objRoot; } public Hello() { setLayout(new BorderLayout()); GraphicsConfiguration config ; config = SimpleUniverse .getPreferredConfiguration(); Canvas3D c = new Canvas3D(config); add("Center",c); // Cree une scene simple et l'attache // a l'univers virtuel. BranchGroup scene = createSceneGraph(); SimpleUniverse u = new SimpleUniverse(c); // ceci deplace le ViewPlatform // un peu en arriere pour que les // objets de la scene soient visibles. u.getViewingPlatform() .setNominalViewingTransform(); u.addBranchGraph(scene); } // // HelloUniverse peut etre utilise comme // une application ou comme une applet // public static void main(String[] args) { System.out.println("Go") ; new MainFrame(new Hello(),256,256); } } |
||
Résultat à l'exécution (Plugin Java nécessaire) Container de plus haut niveau pour les graphes de scène. Contient un ensemble d'objets Locale, chacun d'eux ayant une position "haute-résolution" dans cet univers virtuel définissant ainsi un repère. Définition des méthodes pour énumérer ses objets Locale et les gérer.
Définition d'un environnement utilisateur minimum pour créer facilement un programme Java3D. Création des objets nécessaires à la gestion de la partie "view" du graphe de scène. Partie "géométrie" initialisée à vide.
Définit d'une position en haute-résolution dans un VirtualUniverse. Container pour un ensemble de sous-graphes enracinés en cette position. Objets dans un objet Locale définis en utilisant des coordonnées double-précision relativement à l'origine de cet objet (définition du système de coordonnées du monde virtuel pour cet objet Locale). Méthodes set et get nécessaires à la configuration des coordonnées haute-résolution. Méthodes pour ajouter, retirer et énumérer les graphes branches contenus.
Constitués de nuds organisés en arbre au moyen de relations père <-> fils. Constituants: Super-classe SceneGraphObject dérivée vers Node, elle-même dérivée en deux sous-classes:
Important: Graphe de scène parcouru sans notion d'ordre
de parcours horizontal. Héritage: Un nud fils hérite de l'ensemble des
paramètres d'état de son père. S'il possède un frère, un nud n'hérite pas de
ses paramètres d'état (une seule exception, les nuds lumière et brouillard). Les nuds Construits par instanciation de la classe souhaitée. Accédés via les méthodes get et set existantes et autorisées (pour permettre des optimisations à l'exécution). La super-classe SceneGraphObject
Deux classes dérivées de SceneGraphObject:
Classe Node dérivée en deux classes: Classe pour l'instanciation de nuds permettant de grouper d'autres nuds. Support des relations père<->fils. Un seul nud parent et un nombre arbitraire de nuds fils Group ou non rendus dans un ordre non spécifié ("en parallèle"). Fils Null autorisés. Méthodes pour l'ajout, la suppression et l'énumération des fils.
Toutes les autres classes nud de groupe héritent de Group:
Jamais de fils. Représentation des lumières, nuds géométriques et sons. Réalisation de liaisons et instanciation pour le partage de graphes de scène. Apport d'une plate-forme de visualisation pour placer et orienter une vue. Toutes les classes feuille héritent de Leaf:
La classe NodeComponent est la super-classe commune à certains objets composant de graphe de scène:
Les nuds behaviors et interpolator Rôle:
Contenu:
Rôle du code Java:
Le nud feuille Behavior Une scheduling region définissant le volume servant à l'activation de la
gestion du Behavior.
Deux méthodes abstraites initialize et processStimulus.
Les classes filles de Behavior
Interpolator classe fille abstraite de Behavior. Interpolation lisse entre deux valeurs extrêmes. Interpolation basée sur le temps de la machine hôte au moyen d'une instance de la classe Alpha.
Conversion automatique d'une valeur temporelle en une valeur comprise
entre 0 et 1.
Paramètres croissants Alpha:
Paramètres décroissants Alpha:
Sous-classes de Interpolator
Les périphériques de saisie et la sélection Utilisation de l'API Java standard pour gérer le clavier et la souris. Implantation possible de la gestion de périphériques de type tracker à 6 degrés de liberté (position et orientation) et joysticks. Utilisation de l'interface InputDevice et de la classe Sensor. Gestion des sons dans un environnement 3D. Modèle de visualisation puissant mais complexe non décrit ici totalement. Environnement minimum nécessaire à Java 3D Utilisation d'un objet Canvas3D comme zone de dessin pour l'application ou l'applet. Création d'un objet View pour définir tous les paramètres nécessaires au rendu d'une scène depuis un point de vue arbitraire. Création des éléments du graphe de scène suivants:
Classes mathématiques pour l'Infographie Définies dans le package java.vecmath. Stockage des valeurs caractéristiques des objets. Implantation des fonctions membres pour les opérations mathématiques classiques sur ces objets de l'Infographie. Utilisées directement ou de préférence par leurs classes dérivées.
Convention de notation W = M.V.
|