prev up inhalt next


8.7 Scripts

Manchmal reichen die in VRML angebotenen Funktionen wie Sensoren und Interpolatoren nicht aus, um ein spezielles situationsbedingtes Interaktionsverhalten zu erzeugen. Abhilfe schafft hier der sogenannte Script-Knoten, welcher Input empfangen, Daten verarbeiten und Output verschicken kann. Z.B. kann eine vom Touch-Sensor geschickte Nachricht eine Berechnung anstoßen, deren Ergebnis in Form einer Translations-Nachricht an ein bestimmtes Objekt geschickt und dort zur Neupositionierung genutzt wird.

Die Formulierung des Berechnungsalgorithmus geschieht entweder durch ein Javascript-Programm, inline gelistet im Script-Knoten, oder durch eine assoziierte Java-Klasse, welche in übersetzter Form mit Dateiendung *.class lokal oder im Netz liegt. Zum Übersetzen der Java-Quelle ist das EAI (External Authoring Interface) erforderlich, welches in Form einiger Packages aus dem Verzeichnis importiert wird, in welches sie das VRML-Plugin bei der Installation deponiert hatte.

Beispiel 7 zeigt die Pyramide zusammen mit einem Java-Script, welches bei jedem Aufruf den Drehwinkel bzgl. der y-Achse um weitere 10 Grad erhöht.

 
#VRML V2.0 utf8 
# javascript.wrl: 
# Rotation eines Objekts wird ueber Javascript manipuliert 
   
Group {                                 # gruppiere 
     children [                         # folgende Objekte 
       DEF Taste TouchSensor{}          # Beruehrungssensor Taste 
       DEF Pyramide Transform {         # Objekt Pyramide 
         children[                      # bestehend aus 
           Inline {url "pyramide.wrl"}  # VRML-Welt pyramide.wrl 
         ] 
       } 
     ] 
   } 
   
   DEF Aktion Script {                     # Script mit Namen Aktion 
     eventIn  SFBool     isActive          # Input-Parameter 
     eventOut SFRotation drehung           # Output-Parameter 
     url [                                 # gespeist 
        "javascript:                      //  von inline-Javascript 
        function isActive(eventValue) {   // fuer den Event-In zustaendig 
          if (eventValue == true) {       // falls isActive den Wert wahr hat 
            drehung[0] += 0.3;            // drehe weiter bzgl. x-Achse 
            drehung[1] += 0.2;            // drehe weiter bzgl. y-Achse 
            drehung[2] += 0.1;            // drehe weiter bzgl. z-Achse
            drehung[3] += 0.174444;       // erhoehe Drehwinkel um 10 Grad 
          } 
        } " 
     ] 
   } 
   
   ROUTE Taste.isActive               # bei Beruehren der Pyramide 
      TO Aktion.isActive              # sende Nachricht an das Script Aktion 
   
   ROUTE Aktion.drehung               # vom Script Aktion erzeugter Dreh-Vektor 
      TO Pyramide.set_rotation        # wird an die Pyramide geschickt




prev up inhalt next