Java 3D DESS TNI 2000-2001 Université MONTPELLIER II Xavier ANDREANI
Plan Introduction Objets pour la 3D Transformations Méchanisme interne Scène 3D Univers virtuel Transformations Méchanisme interne Affichage Compilation Animations Interactions Structure d’un objet 3D Apparence Textures Lumières Material Géométrie Créer ses propres objets Retour sur les lumières Conclusion Bibliographie
Introduction Java 3D est destiné à l’affichage 3D sous java. Conçu dans le but de faciliter la programmation. Très bon modèle de hiérarchie objet générique pour représenter un univers 3D. Justifié par la portabilité de java: Java 3D est disponible sous Windows, Solaris, SPARC, Linux, HP-UX, SGI Irix.
Objets Pour La 3D Univers virtuel VirtualUniverse Scène 3D à afficher BranchGroup Oeil de l’observateur ViewPlatForm Ecran sur lequel est projeté la scène canvas3d Les autres objets
Scène 3D Représentée sous la forme d’un arbre (graphe) d’objets. Les feuilles de l’arbre sont les objets à afficher. Les autres noeuds définissent des regroupements d’objets (pour y appliquer des transformations...). Le groupe englobant (BranchGroup pour la racine) est à passer en référence à l’univers virtuel.
Univers Virtuel Définit la partie view du graphe de la scène L’oeil de l’observateur ViewPlatform L’écran de projection canvas3d
Transformations Tous les objets du graphe scénique sont crées à l’origine du repère (0,0,0), d’où l’utilité des transformations pour les positionner. On associe à chaque noeud TransformGroup, une transformation: transform3d. Les transformations élémentaires disponibles sont: Rotations. Rotation selon l’axe X. Rotation selon l’axe Y. Rotation selon l’axe Z. Translation. Retaillage (zoom). Autres transformations obtenues par composition par la méthode mul de Transform3d. Attention à l’ordre du produit!!! Pour 1 objet, équivalence entre une transformation appliqué à cet objet, et une transformation appliqué à l’objet ViewPlatform (déplacement de l’observateur dans le monde).
Affichage L’affichage effectue un parcours de graphe, de bas en haut, des feuilles vers la racine. Chaque branche de l’arbre détermine entièrement les propriétés de sa feuille. Pour chaque feuille, Java 3D parcours donc les parents jusqu’à la racine.
Compilation Possibilité d’accélérer l’affichage grâce à la méthode compile de BranchGroup. C’est une transformation du graphe scénique en une structure interne rapidement manipulable. Les propriétés des noeuds doivent donc être précisées avant la compilation: accessible en lecture, écriture (animation...)... La compilation peut effectuer des optimisations (non documentées) dans le graphe scénique (composition de plusieurs transformations, regroupement d’objets qui subissent la même transformation, ...).
Animations Il s’agit d’appliquer en boucle une transformation, une fois l’affichage effectué. Pour celà, il suffit d’ajouter à l’objet TransformGroup en question un enfant Interpolator qui contient: Une fonction de rotation au cours du temps alpha (nombre de répétitions de la transformation ou -1 si infini, et intervalle de temps entre 2 transformations). Le comportement à appliquer périodiquement. Une zone d’influence BoundingSphere, en dehors de laquelle l’animation ne sera plus effectuée. Les Interpolator correspondant aux 3 transformations élémentaires sont fournis (RotationInterpolator, PositionPathInterpolator, ScaleInterpolator). Attention: ne pas oublier avant la compilation de donner le droit en écriture au noeud de la transformation!!!
Interactions Il s’agit de provoquer un effet de bord (modification) sur graphe scénique, en fonction d’un événement (clavier, souris...). L’objet qui sert à ça est Behavior, toujours à ajouter comme enfant du TransformGroup associé, et contient: Les événements à détecter (définis dans initialize par des wakeupOn(AWTEvent)). L’action à effectuer. Une zone d’influence BoundingSphere à l’intérieur de laquelle est récupéré l’événement. Attention: rappellez initialize pour réenregistrer les événements à détecter après l’exécution de l’action.
Structure D’un Objet 3D Un objet 3D (Shape3d) se compose de 2 parties distinctes: Son apparence qui précise comment il doit être affiché Appearance Sa géométrie qui détaille sa forme Geometry
Apparence Pour rendre nos objets visibles, il faut leur associer une Appearence qui définit plusieurs choses: La couleur de l’objet La texture de l’objet (la couleur est ignorée) Sa transparence (couche alpha, cf TP Photoshop) Le type de rendu (plein, filaire...) Le comportement de l’objet quand il est éclairé (la couleur ci-dessus est alors ignorée) …
Textures Il s’agit d’habiller un objet en lui appliquant une image sur chacune de ces faces. Pour cela, sur chaque face il faut définir un repère (qui par défaut sera le repère unitaire).
Lumières Il existe différents types de lumières pour éclairer vos objets: Lumières ambiantes éclairant indifféremment toute la scène (éclairage global ne donnant pas d’effet de volume) AmbiantLight Lumière directionnelle selon un vecteur (éclairage calculé en fonction des normales aux surfaces, une surface orthogonale à ce vecteur sera uniforméménet éclairée) DirectionalLight Lumière ponctuelle, émettant à partir d’une source (vecteurs directionnels concentriques) PointLight La même, réduite à un cône d’émission SpotLight Les lumières ont une couleur, que l’on choisit blanche pour reproduire la lumière naturelle (celle du soleil) ou la lumière d’une lampe
Material Afin qu’un objet soit sensible aux rayons lumineux, il faut fournir à son Appearance, un objet Material qui décrit: La couleur renvoyée par l’objet lorsqu’il est éclairé par une lumière ambiante blanche ambiantColor La couleur émise par l’objet (utile pour une lampe, noir sinon) emissiveColor La teinte de l’objet éclairé (proche de notre définition « naturelle » de la couleur d’un objet) diffuseColor La couleur des tâches de lumières (brillance sur un métal par exemple: c’est le reflet de la source lumineuse) specularColor La brillance de l’objet shininess
Géométrie Les primitives de Java3D sont toutes définies à partir de triangles 2D rassemblés pour former un volume. En effet, le calcul 3D au niveau d’un processeur se fait sur des triangles. Il n’y a donc pas au préalable à décomposer l’objet en triangles. Plus généralement, la géométrie d’un objet 3D, se compose d’objets points, lignes, triangles, quadrilatères, et constructions géométriques utiles: LineStripArray, TriangleStripArray, TriangleFanArray
Créer Ses Propres Objets Comme expliqué précédemment, il s’agit donc d’assembler des objets 2D représentant les faces de notre objet 3D. Le principe de placage des textures sur ces nouvelles formes reste strictement le même.
Retour sur les lumières Les calculs pour l’éclairage d’un objet se font par rapport aux vecteurs normaux des faces, et aux vecteurs incidents des rayons lumineux. Pour les primitives de Java3D, il suffisait de préciser un paramètre pour que les normales soient calculées. Ici, il va falloir définir chacun de ces vecteurs. (un pour chaque sommet de chaque face)
Conclusion Grâce à son modèle objet, Java3D permet de développer rapidement et efficacement, la plupart des fonctionnalités étant automatisées. Niveau rapidité, le Java 1.3 qui est sorti a corrigé la lenteur du Java 1.2 sous Linux (la version Windows était beaucoup plus rapide), et en ajoutant à ça l’utilisation des optimisations pour DirectX et OpenGL, Java3d est crédible. La grande généricité du modèle objet de Java3D lui permet d’ajouter tous types d’objets à notre monde, comme par exemple des sons 3D. Je n’ai trouvé aucune doc, à part les classes abstraites dans l’api. Ce document avait pour but de vous introduire les bases de l’utilisation de Java3D dans les domaines les plus importants, maintenant c’est à vous de « continuer l’aventure »…
Bibliographie En français: En anglais: Mon site web Java3d http://charon/~xandrean/java3d (intranet Université Montpellier 2 / LIRMM uniquement, non maintenu à jour) http://xandrean.free.fr/java3d Le tutoriel de l‘API Java 3D, traduction en français (incomplet: 3 chapitres sur 7) http://www.latelier-virtuel.com/2armel/tutj3d/ jCosmos http://www.jcosmos.claranet.fr/ En anglais: Java 3D API tutorial http://developer.java.sun.com/developer/onlineTraining/java3d/ Java 3D API documentation http://java.sun.com/products/java-media/3D/forDevelopers/J3D_1_2_API/j3dapi/index.html Java 3D API Specification http://java.sun.com/products/java-media/3D/forDevelopers/J3D_1_2_API/j3dguide/index.html The java 3D Community http://www.j3D.org