VRML & Java | |
Mittels des EAI ist es möglich den Inhalt eines VRML-Browsers innerhalb einer HTML-Seite über ein in dieselbe Seite eingebettetes Applet zu steuern, d.h. man verändert die VRML-Welt durch ein externes Interface. So kann die Welt dynamisch von außen zur Laufzeit erweitert / verändert werden (Erschaffung neuer Knoten / Ereignisse etc.).
Das EAI ist durch eine Plug-In-Architektur des WWW-Browsers mit dem VRML-Browser verbunden.
<HTML>
<BODY>
<APPLET CODE="test.class" MAYSCRIPT>
</APPLET>
<EMBED SRC="simple.wrl" WIDTH="300"
HEIGHT="200">
</BODY>
<HTML>
Um das externe Applet von Java aus realisieren zu können, werden folgende Klassen benötigt.
Die in den Paketen verfügbaren Klassen bilden eine Erweiterung der Applet-Klasse. Um Events aus der VRML-Welt zu erhalten, kann zusätzlich das EventOutObserver-Interface implementiert werden.
Zu allererst muß eine Instanz vom Browser erschaffen werden.
Browser b = Browser.getBrowser();
Nachdem diese Verbindung aufgebaut ist, kann die VRML-Welt verändert werden. Es ist möglich auf Knoten über die Methode getNode(...) (durch Angabe des mit DEF definierten Knoten-Namens) zuzugreifen (falls der Knoten nicht gefunden wird, wird NULL zurückgeliefert).
Node TransformKnoten = b.getNode("TN"); // DEF TN Transform { translation ....}
Existiert eine Referenz auf einen Knoten, so kann auf die Felder eventIn, eventOut und exposedField über die Methoden getEventIn(...) und getEventOut(...) zugegriffen werden (ebenfalls über den Namen). Da die Rückgabewerte jedoch für jeden Knoten unterschiedlich sind, muß das Feld vorher per cast in den richtigen Typ umgewandelt werden, bevor der Inhalt mit getValue() gelesen oder mit setValue(...) verändert werden kann.
EventInSFVec3f TR =
(EventInSFVec3f)TransformKnoten.getEventIn("translation");
float neuePosition[] = { 0 , 1 , 1 };
TR.setValue(neuePosition);
Um kontinuierlich Events empfangen zu können, muß folgendes getan werden:
class X implements EventOutObserver {
public void callback (EventOut value, double timeStamp, Object data) { ... }
}
class Y {
Y ( ) {
Browser b =
Browser.getBrowser();
Node TouchSensorKnoten =
b.getNode("TSK");
X observe = new X();
TouchSensorKnoten.getEventOut ( isOver ).advise (observe, null);
}
}