VRML::Base.pm - Basis-Methoden fuer die VRML 1 und 2 Module
use VRML::Base;
Folgende Methoden stehen zur Verfuegung.
erzeugt ein neues VRML-Szenen-Objekt. Diese Methode muss vor der Verwendung einer weiteren Methode aufgerufen werden.
vrml SFString "" html SFString ""
Die Implementierung der VRML-Spezifikationen in den Browsern und Plug-ins ist je nach Entwicklungsstand und Hersteller unterschiedlich. Um einige allgemeine Besonderheiten beruecksichtigen zu koennen und Anzeigefehler zu verhindern, sollte deshalb der browser-Methode der Name des VRML- und HTML-Browsers mitgegeben werden. Leere Parameter oder das Weglassen der Methode bewirken die Verwendung des kleinsten vertretbaren Implementationsstandes aller unterstuetzten VRML-Browser.
Beispiele fuer VRML-Browser:
Cosmo Player 1.0 Cosmo Player 2.0 Cosmo Player 2.1 libcosmoplayer.so GLview Live3D 1.0 Live3D 2.0 VRweb WorldView 2.0 Plugin
Gebraeuchliche HTML-Browser:
Mozilla (Netscape) Mosaic MSIE (Microsoft Internet Explorer)
Prinzipiell ist es auch moeglich ueber das API eines VRML-2.0-Browsers, den Namen und die Version zu ermitteln. Dieses Verfahren besitzt jedoch einen entscheidenden Nachteil: Bevor ueber das API die Informationen abgefragt werden koennen, muss die Szenenquelle bereits erstellt und erfolgreich geladen worden sein. Dann ist es aber fuer syntaktische Aenderungen bereits zu spaet.
Ein Beispiel fuer das unterschiedliche Verhalten der VRML-Browser ist die Interpretation eines escapten doppelten Anfuehrungszeichens innerhalb einer Zeichenkette. Waehrend einige Browser es, wie in der Spezifikation beschrieben, darstellen koennen, beenden andere Browser die Zeichenkette vorzeitig und erzeugen somit weitere Syntaxfehler. Ein weiteres Problem ist die unterstuetzte Sprache im Script-Knoten. Hier muss bei einigen Browsern 'vrmlscript' angegeben werden.
Beispiel:
$vrml->browser("Cosmo Player 2.0","Mozilla");
string MFString []
fuegt an der aktuellen Szenenposition einen Kommentar ein. Jeder Zeichenkette aus dem Parameter string wird ein Doppelkreuz vorangestellt und ein Zeilenvorschub angefuegt.
string SFString ""
fuegt vorhandenen VRML-Code in die Szene ein. Dieser kann als skalare Variable oder als konstante Zeichenkette dem Parameter string uebergeben werden.
Beispiel:
$vrml ->begin ->insert("Shape { geometry Box {} }") ->end ->print;
Befinden sich im vorhandenen VRML-Code doppelte Anfuehrungszeichen, so sollte die Perl-Funktion qq verwendet werden, um den Code unveraendert uebernehmen zu koennen. Alternativ dazu besteht die Moeglichkeit, die Anfuehrungszeichen durch einen Backslash zu maskieren (\`` ).
$vrml ->begin ->insert(qq(WorldInfo { title "Meine Welt" } )) ->end ->print;
Der Szenenaufbau kann schnell unuebersichtlich werden, wenn der VRML-Code
einige Zeilen ueberschreitet. Fuer das Einfuegen groesserer Programmteile ist die
Methode insert__DATA__
besser geeignet.
macht sich die Perl-Syntax zu nutze, in der alle folgenden Zeilen nach der Zeichenkette __DATA__ als Daten behandelt werden. Diese liest die Methode insert__DATA__ ein und fuegt sie an der betreffenden Stelle in die Szene ein. Beachte die fuehrenden und abschliessenden ZWEI Unterstriche.
Beispiel:
use VRML; new VRML(2) ->begin ->insert__DATA__ ->end ->print;
__DATA__ Shape { geometry Sphere {} appearance Appearance { material Material { diffuseColor 0 0.5 0 } } }
Hinweis: Der __DATA__-Abschnitt in Perl-Skripten wird derzeit nicht von
modperl
auf dem Apache-Server unterstuetzt. D.h. insert__DATA__
funktioniert dort nicht wie erwartet.
files MFString []
fuegt vorhandene VRML-Dateien in die aktuelle Szene ein. Der Parameter files kann eine Liste von Dateinamen enthalten, die der Reihenfolge nach eingebunden werden.
Beispiel:
$vrml->include("c:/vrml/cubes.wrl");
mime SFBool 0 pipe SFString ""
uebergibt den Inhalt des Szenenobjekts an STDOUT. Das bedeutet im Normalfall, dass die VRML-Quelle auf dem Bildschirm erscheint. Wird das Skript von einem WWW-Server ueber CGI gestartet, so benoetigt der Client (Browser) einen MIME-Typ, um die korrekte Wiedergabeart zu ermitteln. Der MIME-Typ muss im Header vor der eigentlichen Szene gesendet werden. Ueber den Parameter mime kann diese Option aktiviert werden.
Um die Uebertragungs- bzw. Ladezeiten virtueller Welten zu verkuerzen, besteht
die Moeglichkeit, VRML-Quellen zu komprimieren. Zu diesem Zweck wird ein
Programm benoetigt, welches das GNU-ZIP-Verfahren realisiert. Ueber den
Parameter pipe muessen der Pfad, Name und die Programmparameter der
ausfuehrbaren Datei spezifiziert werden. Befindet sich die Datei im aktuellen
Pfad, genuegt nur der Name und die Parameter (meistens gzip -f
). Der
Parameter pipe ist jedoch nicht nur auf das Komprimieren der VRML-Skripte
beschraenkt. Prinzipiell kann hier jeder Filter angewendet werden.
Beispiel 1:
$vrml->print;
Beispiel 2 (UNIX gzip):
$vrml->print(1,"/usr/local/bin/gzip -f");
Beispiel 3 (MS-DOS gzip.exe):
$vrml->print(1,"c:\\Perl\\bin\\gzip.exe -f");
oder fuer alle Plattformen, wenn sich das Programm gzip
im Suchpfad
befindet:
$vrml->print(1,"gzip -f");
filename SFString "" pipe SFString ""
speichert den Inhalt des Szenenobjekts in einer Datei. Wird kein Dateiname
angegeben, so wird die Erweiterung des gerade abgearbeiteten Skripts (z. B.
.pl) gegen die Erweiterung '.wrl' ausgetauscht. Um bei grossen Welten
Speicherplatz zu sparen, besteht auch hier die Moeglichkeit, die VRML-Datei zu
komprimieren. Zu diesem Zweck wird ein Programm benoetigt, das ein beliebiges
Pack-Verfahren realisiert. Besonders gut eignet sich dafuer das
GNU-ZIP-Verfahren, da es vom VRML-Browser selbst entpackt werden kann. Ueber
den Parameter pipe muss der Name und Pfad der ausfuehrbaren Datei
spezifiziert werden. Die Funktionsweise von pipe ist analog der in der
Methodenbeschreibung von print
.
Beispiel 1:
$vrml->save;
Beispiel 2:
$vrml->save("world.wrl");
Beispiel 3:
$vrml->save(undef,"gzip");
gibt die komplette VRML-Quelle als Zeichenkette zurueck. Sie wird jedoch nur
in seltenen Faellen benoetigt und ist die einzige Methode, welche nicht eine
Referenz auf das Szenenobjekt zurueckliefert. Fuer die Ausgabe oder Speicherung
einer VRML-Quelle sollten im allgemeinen die Methoden print
oder save
benutzt werden. Diese Methoden sind wesentlich effizienter und schonen die
Ressourcen des Rechners.
$vrml ->begin ->box("1 2 1") ->end; $scene = $vrml->as_string;
transformiert alle Umlaute in ae, oe, ue und sz. Weiterhin enfernt die Methode alle Steuerzeichen.
$vrml->text($vrml->ascii("umlaute"), ' yellow')
Folgende Methoden sollten nicht verwendet werden. Sie sind normalerweise nicht notwendig. Besteht dennoch Bedarf, so sende mir bitte eine E-Mail und ich werde sie in den naechsten Versionen beschreiben.
Hartmut Palm <palm@gfz-potsdam.de>