(retour à Tutoriel JAVA-VRML)

Java et VRML 2 : Un exemple de A à Z


L'installation et l'utilisation de VRML en interaction avec Java tient à l'heure actuelle du miracle. Il a donc semblé nécessaire de produire une procédure standard, clés en mains, pour que vous puissiez avancer hors des ténèbres de l'informatique.
Pour trouver des informations utiles :

  • sur l'installation de Java, cliquer ici.
  • sur l'installation d'un visualiseur VRML 2, cliquer ici.
  • sur la programmation en Java, cliquer ici.
  • sur l'utilisation conjointe de Java et de VRML 2, cliquer ici.

  • 1 Installation :

    Avant toute chose, vous devez disposer de l'environnement matériel et logiciel nécessaire. Trois composantes sont requises pour programmer et visualiser du VRML 2.0 sous votre système d'exploitation préféré :

  • Un navigateur (par exemple Netscape)
  • Un visualiseur VRML 2.0 (par exemple Cosmo Player)
  • Un compilateur Java (par exemple le Java Development Kit de Sun)
  • Nous indiquons ci-dessous la procédure pour installer Netscape, Cosmo Player et JDK sur PC. La procédure d'installation pour Mac est similaire (voire plus simple) et nous ne la détaillerons pas.

    Pour le navigateur, il vous faut décharger le fichier n32e404.exe puis double-cliquer le fichier obtenu. Une fois la procédure d'installation complétée, vous devez alors décharger le fichier 404awt.zip qui permet de supporter la version 1.1 des évenements en Java. Enregistrez le sur votre disque dur et dézippez le dans un répertoire temporaire en utilisant winzip. Vous obtenez 6 fichiers (jrt3240.dll, awt3240.dll, jit3240.dll, ifc11.jar, java40.jar et jio40.jar). En supposant que vous avez installé Netscape dans "C:\Program Files\Netscape", vous devez déplacer les 6 fichiers de la manière suivante en remplacant les anciennes versions :

    jrt3240.dll : C:\Program Files\Netscape\Communicator\Program\jrt3240.dll
    awt3240.dll : C:\Program Files\Netscape\Communicator\Program\java\bin\awt3240.dll
    jit3240.dll : C:\Program Files\Netscape\Communicator\Program\java\bin\jit3240.dll
    ifc11.jar : C:\Program Files\Netscape\Communicator\Program\java\classes\ifc11.jar
    java40.jar : C:\Program Files\Netscape\Communicator\Program\java\classes\java40.jar
    jio40.jar : C:\Program Files\Netscape\Communicator\Program\java\classes\jio40.jar
    

    Vous pouvez supprimer le repertoire temporaire et le fichier zip de votre disque dur si vous souhaitez récupérer de l'espace disque.

    Enfin, vous devez décharger le fichier cp20setup.exe puis double-cliquer le fichier obtenu. Attention car Cosmo Player ne supporte que certaines versions de Netscape.

    Une fois la procédure d'installation du navigateur VRML complétée, vous devez alors installer le JDK. Pour cela, charger le fichier jdk115-win32.exe et double-cliquez sur le fichier obtenu. Nous vous conseillons de l'installer dans c:\Program Files\jdk1.1.5

    Pour faciliter l'éxécution du compilateur java, on vous conseille d'éditer le fichier "autoexec.bat" et d'y insérer à la fin le chemin où se trouve "javac" (le compilateur Java) par exemple en ajoutant à la fin de l'"autoexec.bat" les lignes :

    SET PATH=c:\Program Files\jdk1.1.5\bin;"%PATH%"
    set Classpath=C:\Progra~1\jdk1.1.5\lib\classes.zip;%Classpath%
    

    Il faut redemarrer pour que ces changements soient pris en compte.

    Vous pouvez effacer de votre disque dur les fichiers n32e404.exe, cp20setup.exe et jdk115-win32.exe si vous souhaitez récupérer de l'espace disque.

    Notez que des redemarrages de la machine peuvent vous être demandés au cours des différentes opérations. Vous y conformer.

    2 Mise en route :

    Nous allons voir maintenant comment écrire et compiler un programme contenant à la fois du Java et du VRML 2.0. Dans un premier temps, nous allons voir le cas de l'interface interne, puis le cas de l'interface externe.

    Nous allons traiter les exemples pour le cas d'un PC. Le principe est exactement le même dans le cas du Mac.

    Cas de l'interface interne (scripting)

    Nous présentons un exemple très simple, repris de Lea & al. (1996).

    Ouvrez un bloc-notes (ou tout autre éditeur de texte) et tapez ce qui suit :

    #VRML V2.0 utf8
    Transform {
       children [
         DEF TS TouchSensor {} # TouchSensor
         Shape {
           appearance Appearance {
             material DEF SphereColor Material { diffuseColor 1 0 0 } # red
           }
           geometry Sphere {}
         }
       ]
    }
    
    DEF ColorScript Script {
       url "ChangeColor.class"
       eventIn SFBool clicked
       eventOut SFColor newColor
       field SFBool on FALSE
    }
    # Routing
    ROUTE TS.isActive TO ColorScript.clicked
    ROUTE ColorScript.newColor TO SphereColor.set_diffuseColor
    

    Une copie de ce fichier est disponible ici (source).

    Enregistrez ce fichier sous le nom "ChangeColor.wrl" (le troisième programme que vous avez du installer sur votre machine).

    Ouvrez un bloc-notes (ou tout autre éditeur de texte) et tapez ce qui suit :

    import vrml.*;
    import vrml.field.*;
    import vrml.node.*;
    
    public class ChangeColor extends Script {
    
      private SFBool on;      // status of on-off
      float red[] =  { 1, 0, 0 };      // RGB(Red)
      float blue[] = { 0, 0, 1 };      // RGB(Blue)
      private SFColor newColor ;
    
      public void initialize() {   
    
        newColor = (SFColor) getEventOut("newColor");
        on = (SFBool) getField("on");
      }
    
      public void processEvent(Event e) {
        ConstSFBool v = (ConstSFBool)e.getValue();
    
        if(v.getValue()){
          if (on.getValue()) {
            newColor.setValue(red);     // set red to 'newColor'
          } else {
            newColor.setValue(blue);    // set blue to 'newColor'
          }
          on.setValue(!on.getValue());  // = !on.getValue();
        }
      }
    }
    

    Une copie de ce fichier est disponible ici.

    Enregistrez ce fichier sous le nom "ChangeColor.java" dans le répertoire "bin" du JDK.

    Ouvrez une boite MS-DOS (menu démarrer, programmes, Commandes MS-DOS) et déplacez vous (par la commande "cd" suivie du nom du répertoire) pour arriver dans le répertoire "bin" du JDK. Tapez la commande :

    javac ChangeColor.java
    

    Après une seconde d'attente, l'ordinateur devrait vous rendre la main sans rien avoir affiché. Dans le cas contraire, il y a probablement eu une erreur. Verifiez alors :

  • que vos fichiers ont bien le nom correct.
  • que vous avec bien respecté les majuscules et minuscules pour vos noms de fichiers.
  • la valeur de la variable "Classpath" dans votre "autoexec.bat". Un exemple sur ce que vous devriez y trouver est présenté ici.
  • Vous venez de compiler votre premier programme Java, ce qui a créé le fichier "ChangeColor.class" dans le même répertoire.

    Une copie du fichier *.java est disponible ici.

    La présence dans le même repertoire du fichier ChangeColor.wrl n'était pas requise pour cette opération, mais la classe Java obtenue (fichier "ChangeColor.class") et le fichier VRML doivent se trouver dans le même répertoire pour la visualisation. De même, le fichier à compiler ("ChangeColor.java") peut se trouver dans un répertoire différent de celui du compilateur, mais il faut alors parametrer la commande pour la compilation. De l'aide est disponible d'une manière générale pour le JDK sous la forme de fichiers html. Pour cela, ouvrir le fichier index.html qui se trouve dans le répertoire "java" (repertoire de plus haut niveau) dans le JDK.

    Pour visualiser le résultat, il ne vous reste plus qu'à double cliquer le fichier "ChangeColor.wrl". Après quelques secondes, une sphère rouge doit apparaitre. Un clic sur la sphère modifie sa couleur.

    Vous pouvez visualiser le résultat en cliquant ici (La source est disponible ici).

    Cas de l'interface externe (applet)

    Nous présentons un exemple très simple, copié chez SGI (ici).

    Ouvrez un bloc-notes (ou tout autre éditeur de texte) et tapez ce qui suit :

    <html>
    <head>
    <title> RGB Applet Test </title>
    </head>
    
    <center>
    <embed src="sphere.wrl" border=0 height="250" width="375">
    </center>
    
    This is a test of the RGB Applet System. <br>
    This is only a test. <br>
    
    <applet code="RGBTest.class" mayscript>
    </applet>
    
    </html>
    

    Une copie de ce fichier est disponible ici.

    Enregistrez ce fichier sous le nom "RGBTest.html" dans le répertoire "bin" du JDK (le troisième programme que vous avez du installer sur votre machine).

    Ouvrez un bloc-notes (ou tout autre éditeur de texte) et tapez ce qui suit :

    #VRML V2.0 utf8
    
    Group {
            children [
                    Shape {
                            appearance Appearance {
                                    material DEF MAT Material {
                                            diffuseColor 0.8 0.2 0.2
                                    }
                            }
                    geometry Sphere {}
                    },
                    DEF TOUCH TouchSensor {
                    }
            ]
    }
    

    Vous pouvez visualiser ce fichier ici (VRML) (la source est ici).

    Enregistrez ce fichier sous le nom "sphere.wrl".

    Ouvrez un bloc-notes (ou tout autre éditeur de texte) et tapez ce qui suit :

    // Example applet illustrating sending/receiving of events and registering
    // of callbacks on EventOuts.
    
    import java.awt.*;
    import java.applet.*;
    import java.awt.event.*;
    import vrml.external.field.EventOut;
    import vrml.external.field.EventInSFColor;
    import vrml.external.field.EventOutSFColor;
    import vrml.external.field.EventOutSFTime;
    import vrml.external.field.EventOutObserver;
    import vrml.external.Node;
    import vrml.external.Browser;
    import vrml.external.exception.*;
    import netscape.javascript.JSObject;
    
    public class RGBTest extends Applet implements ActionListener, EventOutObserver {
      TextArea output = null;
      Browser browser = null;
      Node material = null;
      EventInSFColor diffuseColor = null;
      EventOutSFColor outputColor = null;
      EventOutSFTime touchTime = null;
      boolean error = false;
      Button buttonRed;
      Button buttonGreen;
      Button buttonBlue;
    
      public void start() {
        super.start();
        add(buttonRed = new Button("Red"));
        buttonRed.addActionListener(this);
        add(buttonGreen = new Button("Green"));
        buttonGreen.addActionListener(this);
        add(buttonBlue = new Button("Blue"));
        buttonBlue.addActionListener(this);
        output = new TextArea(5, 40);
        add(output);
    
        JSObject win = JSObject.getWindow(this);
        JSObject doc = (JSObject) win.getMember("document");
        JSObject embeds = (JSObject) doc.getMember("embeds");
        browser = (Browser) embeds.getSlot(0);
    
        // Now we've got the handle to the VRML Browser.
        try {
          // Get the material node...
          material = browser.getNode("MAT");
          // Get the diffuseColor EventIn
          diffuseColor = (EventInSFColor) material.getEventIn("set_diffuseColor");
          // Get the Touch Sensor
          Node sensor = browser.getNode("TOUCH");
          // Get its touchTime EventOut
          touchTime = (EventOutSFTime) sensor.getEventOut("touchTime");
          // Set up the callback
          touchTime.advise(this, new Integer(1));
          // Get its diffuseColor EventOut
          outputColor = (EventOutSFColor) material.getEventOut("diffuseColor");
          // Set up its callback
          outputColor.advise(this, new Integer(2));
        }
        catch (InvalidNodeException ne) {
          add(new TextField("Failed to get node:" + ne));
          error = true;
        }
        catch (InvalidEventInException ee) {
          add(new TextField("Failed to get EventIn:" + ee));
          error = true;
        }
        catch (InvalidEventOutException ee) {
          add(new TextField("Failed to get EventOut:" + ee));
          error = true;
        }
      }
      
      public void callback(EventOut who, double when, Object which) {
        Integer whichNum = (Integer) which;
        if (whichNum.intValue() == 1) {
          // Make the timestamp and new time show up in the textarea.
          double val = touchTime.getValue();
          output.append("Got time " + val + " at time " + when + "\n");
        }
        if (whichNum.intValue() == 2) {
          // Make the new color of the sphere and timestamp
          // show up in the textarea.
          float[] val = outputColor.getValue();
          output.append("Got color " + val[0] + ", " + val[1] + ", " +
    			val[2] + " at time " + when + "\n");
        }
      }
    
      public void actionPerformed(ActionEvent event) {
        if (error)
          {
    	showStatus("Problems! Had an error during initialization");
          }
        if (event.getSource() instanceof Button)
          {
            Button b = (Button) event.getSource();
            if (b.getLabel() == "Red")
    	  {
    	    showStatus ("Red!");
    	    float[] val = new float[3];
    	    val[0] = 0.8f;
    	    val[1] = 0.2f;
    	    val[2] = 0.2f;
    	    diffuseColor.setValue(val);
    	  }
            else if (b.getLabel() == "Green")
    	  {
    	    showStatus("Green!");
    	    float[] val = new float[3];
    	    val[0] = 0.2f;
    	    val[1] = 0.8f;
    	    val[2] = 0.2f;
    	    diffuseColor.setValue(val);
    	  }
            else if (b.getLabel() == "Blue")
    	  {
    	    showStatus("Blue!");
    	    float[] val = new float[3];
    	    val[0] = 0.2f;
    	    val[1] = 0.2f;
    	    val[2] = 0.8f;
    	    diffuseColor.setValue(val);
    	  }
          }
      }
    }
    

    Une copie de ce fichier est disponible ici sous forme *.java et ici sous forme compilée.

    Enregistrez ce fichier sous le nom "RGBTest.java"

    Nous devons maintenant configurer le compilateur Java pour qu'il dispose des classes Java offertes par Netscape et par le CosmoPlayer.

    Deux méthodes existent :

  • rajouter deux lignes "Classpath" à la fin de votre "autoexec.bat" qui devrait contenir après coup :
  • set Classpath=C:\Progra~1\netscape\commun~1\program\java\classes\java40.jar;%Classpath%
    set Classpath=C:\Progra~1\cosmos~1\cosmop~1\npcosmop.zip;%Classpath%
    
  • ouvrir une boite MS-DOS (menu démarrer, programmes, Commandes MS-DOS) et taper la commande :
  • set Classpath=C:\Progra~1\cosmos~1\cosmop~1\npcosmop.zip;C:\Progra~1\netscape\commun~1\program\java\classes\java40.jar;%Classpath%
    

    Faites cependant attention car la première méthode nécéssite de redémarrer la machine et la seconde méthode ne reste valable que pour la boite MS-DOS ouverte (vous pouvez vous en rendre compte en ouvrant une autre boite MS-DOS et en tapant la commande "set", qui affiche la valeur de votre variable "Classpath").

    Si vous avez choisi la première méthode, ouvrez une boite MS-DOS (menu démarrer, programmes, Commandes MS-DOS). Si vous avez choisi la seconde méthode, utilisez la boite MS-DOS déja ouverte pour la suite des instructions.

    Déplacez vous (par la commande "cd" suivie du nom du répertoire) pour arriver dans le répertoire "bin" du JDK et tapez la commande :

    javac RGBTest.java

    Après une seconde d'attente, l'ordinateur devrait vous rendre la main sans rien avoir affiché. Dans le cas contraire, il y a probablement eu une erreur. Verifiez alors :

  • que vos fichiers ont bien le nom correct.
  • que vous avec bien respecté les majuscules et minuscules pour vos noms de fichiers.
  • la valeur de la variable "Classpath" dans votre "autoexec.bat". Un exemple sur ce que vous devriez y trouver est présenté ici.
  • Vous venez de compiler votre premier programme Java, ce qui a créé le fichier "RGBTest.class" dans le même répertoire.

    Une copie de ce fichier est disponible ici (source).

    La présence dans le même repertoire du fichier sphere.wrl n'était pas requise pour cette opération, mais la classe Java obtenue (fichier "RGBTest.class") et le fichier VRML doivent se trouver dans le même répertoire pour la visualisation. De même, le fichier à compiler ("RGBTest.java") peut se trouver dans un répertoire différent de celui du compilateur, mais il faut alors parametrer la commande pour la compilation. De l'aide est disponible d'une manière générale pour le JDK sous la forme de fichiers html. Pour cela, ouvrir le fichier index.html qui se trouve dans le répertoire "java" (repertoire de plus haut niveau) dans le JDK.

    Pour visualiser le résultat, il ne vous reste plus qu'à double cliquer le fichier "RGBTest.html". Après quelques secondes, une sphère rouge doit apparaitre ainsi qu'une série de boutons. Un clic sur les boutons modifie la couleur de la sphère et écrit un message.

    Une copie du résultat est disponible ici.


    (retour à Tutoriel JAVA-VRML)

    S.M.M.