Classe Mappemonde3D:
import javax.media.j3d.*;
import javax.vecmath.*;
import java.awt.*;
import java.awt.event.*;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.universe.SimpleUniverse;
import java.applet.Applet;
import com.sun.j3d.utils.geometry.Sphere;
import com.sun.j3d.utils.image.TextureLoader;
/**
* Test mappemonde 3D pour Java
*
* @author Philippe Laneres
* @version 1.1, 20/06/2003
* @since Mappemonde3D1.1
*
* exemple complet : la classe Mappemonde3D
* anime en rotation une sphère
* avec placage de texture (image de la terre)
* et le texte "Java 3D" en orbite (géostationnaire).
* Une source lumineuse venant du côté gauche du canvas
* simule le soleil.
*/
public class Mappemonde3D extends Applet implements ActionListener {
RotationInterpolator rotator;
Button stopButton;
Button startButton;
/** createSceneGraph retourne une reference
* à la branche de contenu du graphe
*/
public BranchGroup createSceneGraph() {
// incline la terre pour correspondre à une vue en été
// et l'éloigne de l'observateur de 12 unités
BranchGroup contentRoot = new BranchGroup();
Transform3D sceneTrans = new Transform3D();
sceneTrans.rotX(Math.PI/8.0);
sceneTrans.setTranslation(new Vector3d(0.0,0.0,-12.0));
TransformGroup contentTransGroup = new TransformGroup(sceneTrans);
contentRoot.addChild(contentTransGroup);
// ajoute une source de lumière ambiante et
// une source directionelle à l'infini
Color3f lgtColor1 = new Color3f(1.0f, 1.0f, 1.0f);
Vector3f lgtDir = new Vector3f(1.0f, -1.0f, -1.0f);
Color3f lgtColor2 = new Color3f(0.2f, 0.2f, 0.2f);
BoundingSphere bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0),
100.0);
AmbientLight ambLgt = new AmbientLight(lgtColor2);
ambLgt.setInfluencingBounds(bounds);
DirectionalLight dirLgt = new DirectionalLight(lgtColor1, lgtDir);
dirLgt.setInfluencingBounds(bounds);
contentTransGroup.addChild(ambLgt);
contentTransGroup.addChild(dirLgt);
// crée la sphère représentant la terre et
// lui applique une texture provenant d'une image jpeg
Appearance mappemondeApp = new Appearance();
TextureLoader texture = new TextureLoader("mappemonde.jpg", this);
mappemondeApp.setTexture(texture.getTexture());
Color3f black = new Color3f(0.0f, 0.0f, 0.0f);
Color3f white = new Color3f(1.0f, 1.0f, 1.0f);
mappemondeApp.setMaterial(new Material(white, black, white, black, 1.0f));
Sphere mappemonde = new Sphere(1.75f,
Sphere.GENERATE_TEXTURE_COORDS | Sphere.GENERATE_NORMALS,
mappemondeApp);
TransformGroup mappemondeTransGroup = new TransformGroup();
mappemondeTransGroup.addChild(mappemonde);
contentTransGroup.addChild(mappemondeTransGroup);
// ajoute un interpolateur pour gérer la rotation de la terre et du texte
Alpha rotationAlpha = new Alpha(-1, 8000);
rotator = new RotationInterpolator(rotationAlpha, mappemondeTransGroup);
BoundingSphere rotatorBounds = new BoundingSphere(new Point3d(0.0,0.0,0.0),
100.0);
rotator.setSchedulingBounds(rotatorBounds);
mappemondeTransGroup.addChild(rotator);
mappemondeTransGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
// crée le texte "Java 3D", fixe par rapport à la terre
Font3D f3d = new Font3D(new Font("TestFont", Font.PLAIN, 1),
new FontExtrusion());
Text3D textGeom = new Text3D(f3d, new String("Java 3D"));
Appearance textApp = new Appearance();
Color3f textColor = new Color3f(0.0f, 0.6f, 1.0f);
textApp.setMaterial(new Material(white, black, textColor, white, 120.0f));
Shape3D text = new Shape3D(textGeom, textApp);
Transform3D textTrans = new Transform3D();
textTrans.setTranslation(new Vector3d(1.5, 1.0, 0.0));
TransformGroup textTransGroup = new TransformGroup(textTrans);
textTransGroup.addChild(text);
mappemondeTransGroup.addChild(textTransGroup);
// optimise le graphe de scène
contentRoot.compile();
return contentRoot;
}
/* actionPerformed est une action a executer lorsqu'un bouton est pressé;
active ou désactive l'interpolateur */
public void actionPerformed (ActionEvent event) {
Object source = event.getSource();
if (source == stopButton) {
rotator.setEnable(false);
} else {
rotator.setEnable(true);
}
}
/** Constructeur de Mappemonde3D
* Java 3D effectue son affichage dans un objet
* de type Canvas3D, qui est une sous-classe
* de la classe Canvas d'AWT.
* Le constructeur de Canvas3D requiert un objet
* GraphicsConfiguration qui décrit les caractéristiques
* de l'environnement graphique qui peut s'obtenir
* simplement en utilisant la méthode statique
* getPreferedConfiguration de SimpleUniverse.
* Cette configuration adéquate va permettre à Java 3D
* de tirer parti des possibilités du matériel d'accélération
* graphique telles que le double-buffer et offre aussi
* les caractéristiques requises pour l'indépendance
* de la plate-forme du système de fenêtrage.
*/
public Mappemonde3D() {
// initialise le Canvas3D dans lequel ce programme
// va effectuer l'affichage
GraphicsConfiguration gConfig = SimpleUniverse.getPreferredConfiguration();
Canvas3D c = new Canvas3D(gConfig);
// SimpleUniverse est un utilitaire de construction
// de graphe de scène agréable car il s'occupe de
// quasiment tous les aspects de la branche de point de vue,
// laissant tout le loisir au programmeur de se concentrer
// sur la branche de contenu géométrique.
// La méthode setNominalViewTransform initialise
// une transformation de visualisation canonique.
// Dans le système de coordonnées du monde virtuel
// cette transformation de visualisation place
// l'observateur de la scène sur l'axe Z positif,
// éloigné de l'origine de quelques unités regardant
// vers l'origine. Les axes positifs X et Y sont
// dirigés comme usuellement, c'est-à-dire vers la
// droite et vers le haut parallèlement aux bords de l'écran.
// Utilisation de SimpleUniverse pour créer un graphe
// par défaut avec une branche de vue complète
SimpleUniverse u = new SimpleUniverse(c);
u.getViewingPlatform().setNominalViewingTransform();
// La méthode createSceneGraph retourne une référence
// à un objet BranchGroup correspondant à la branche
// de contenu géométrique. Cette branche est ajoutée
// au graphe de scène par la méthode addBranchGraph.
BranchGroup scene = createSceneGraph();
// Finalement, la branche de contenu géométrique de
// Mappemonde est ajoutée au graphe de scène qu'a créé
// SimpleUniverse.
u.addBranchGraph(scene);
// Regardons maintenant en détail la méthode createSceneGraph,
// qui créée la branche de contenu géométrique.
// La scène comporte un éclairage reproduisant
// l'illumination du soleil sur la Terre.
// construit la disposition des éléments
// de cet applet et ajoute le Canvas3D
this.setLayout(new BorderLayout());
this.add("Center", c);
// ajoute les boutons de contrôle de l'activation de la rotation
Panel panel = new Panel(new FlowLayout());
stopButton = new Button("stop rotation");
panel.add(stopButton);
startButton = new Button("rotate");
panel.add(startButton);
add("South",panel);
stopButton.addActionListener(this);
startButton.addActionListener(this);
}
/** Main est appelé lorsque Mappemonde3D
* est exécuté comme une application.
* MainFrame ajoute l'applet à une Frame.
* Ceci permet d'utiliser ce programme
* soit comme un applet soit comme une application
*/
public static void main(String[] args) {
new MainFrame(new Mappemonde3D(), 500, 500);
}
}
Documentation