(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 n32301p.exe puis double-cliquer le fichier obtenu. Une fois la procédure d'installation complétée, vous devez alors décharger le fichier cpsetup_beta3a.exe puis double-cliquer le fichier obtenu.

    Une fois la procédure d'installation du navigateur VRML complétée, vous devez alors installer le JDK. Créez d'abord un répertoire, par exemple c:\Program Files\jdk\. Ensuite charger le fichier jdk-1_0_2-win32-x86.exe et mettez le dans ce nouveau répertoire. Ensuite double-cliquez sur le fichier obtenu. Une boite MS-DOS s'ouvre alors et montre l'avancement de la décompression des fichiers sur votre disque dur. Lorsque l'ordinateur a fini, vous pouvez refermer la boite MS-DOS. A l'endroit ou se trouve votre fichier jdk-1_0_2-win32-x86.exe, il existe maintenant un répertoire Java à l'endroit voulu. Sinon vous pouvez déplacer ce répertoire pour le mettre à un endroit qui vous convient mieux, si vous le souhaitez.

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

    SET PATH=c:\Program Files\jdk\bin;"%PATH%"
    
    Vous pouvez effacer de votre disque dur les fichiers n32e301p.exe, cpsetup_beta3a.exe et jdk-1_0_2-win32-x86.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 ") 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 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 EventOutObserver {
      TextArea output = null;
      Browser browser = null;
      Node material = null;
      EventInSFColor diffuseColor = null;
      EventOutSFColor outputColor = null;
      EventOutSFTime touchTime = null;
      boolean error = false;
    
      public void init() {
        add(new Button("Red"));
        add(new Button("Green"));
        add(new Button("Blue"));
        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.appendText("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.appendText("Got color " + val[0] + ", " + val[1] + ", " +
                            val[2] + " at time " + when + "\n");
        }
      }
    
      public boolean action(Event event, Object what) {
        if (error)
          {
            showStatus("Problems! Had an error during initialization");
            return true;  // Uh oh...
          }
        if (event.target instanceof Button)
          {
            Button b = (Button) event.target;
            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);
            }
          }
        return true;
      }
    }
    
    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. Pour une raison que je ne m'explique toujours pas, il faut dezziper les classes. Pour cela, allez avec l'explorateur de Windows dans le repertoire où sont vos classes Java de Netscape (sans doute dans le répertoire C:\Program Files\Netscape\Navigator\Program\Java\classes\"). Double-cliquez le fichier de classes qui s'y trouve (sans doute "java_30") ou si c'est impossible, ouvrez Winzip et ouvrez l'archive par le menu "File/Open". Dezzipez le fichier (commande "Extract") dans un nouveau répertoire (par exemple c:\Classes Netscape) en vérifiant bien que vous avez coché la case "Use Folder Names" (ce qui signifie qu'il ne va pas tout extraire au même endroit).

    Vous devez maintenant dire au compilateur où trouver les nouvelles classes. Deux méthodes existent :

  • rajouter une ligne "Classpath" a votre "autoexec.bat" qui devrait contenir après coup :
    SET CLASSPATH=C:\Program Files\Java\classes\vrml;%CLASSPATH%
    SET CLASSPATH=.;%CLASSPATH%
    SET CLASSPATH==c:\Classes Netscape;%classpath%
    
  • ouvrir une boite MS-DOS (menu démarrer, programmes, Commandes MS-DOS) et taper la commande :
    SET CLASSPATH==c:\Classes Netscape;%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 ") 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.