use VRML;
$vrml = new VRML(2); $vrml->browser('Cosmo Player 2.0','Netscape'); $vrml->at('-15 0 20'); $vrml->box('5 3 1','yellow'); $vrml->back; $vrml->print; $vrml->save;
ODER mit dem gleichen Ergebnis
use VRML;
VRML->new(2) ->browser('Cosmo Player 2.0','Netscape') ->at('-15 0 20')->box('5 3 1','yellow')->back ->print->save;
Dieses Modul fällt möglicherweise in der nächsten Version weg. Die Erzeugung der VRML-Knoten übernimmt dann VRML::Base.
Enthält beispielsweise $in{VRML}
'1' oder '2' (z.B. über CGI), so muß nur die folgende Zeile am Anfang des
Perl-Skripts eingefügt werden.
new VRML($in{'VRML'})
Dieses Modul fällt möglicherweise in der nächsten Version weg. Die Erzeugung der VRML-Knoten übernimmt dann VRML::Base.
new
, print
oder save
sind im Modul VRML::Base beschrieben.
Die Methoden begin und end stellen die äußere Klammer der VRML-Szene dar. Die Methode begin führt einige Initialisierungen und die Methode end abschließende Berechnungen durch. Jedes VRML-Skript sollte stets nach dem Erzeugen des Szenenobjekts ein begin aufrufen und vor dem Ausgeben bzw. Speichern die Methode end ausführen.
Beispiel:
new VRML ->begin ->at('0 0.1 -0.3') ->sphere(1,'red') ->back ->end ->print;
Diese Methode beendet die Ausdehnungs- und Viewpoint-Berechnungen. Nach end sollte keine Geometrie positioniert oder Transformation durchgeführt werden.
url MFString [] description SFString "" parameter MFString [] bboxSize SFVec3f undef bboxCenter SFVec3f '0 0 0'
Die Methoden anchor_begin und anchor_end umschließen eine Gruppe von Objekten, die wie ein Hyperlink arbeitet. Diese lädt den Inhalt einer URL, sobald der Betrachter die Geometrien, die diese Methode enthält, aktiviert (z. B. anklickt). Wenn die URL auf eine gültige VRML-Datei zeigt, wird die aktuelle Szene durch eine neue ersetzt (ausgenommen der parameter-Parameter wird wie unten beschrieben eingesetzt). Werden Nicht-VRML-Daten empfangen, so sollte der Browser ermitteln, wie diese Daten zu behandeln sind; üblicherweise werden sie an einen entsprechenden Nicht-VRML-Browser weitergereicht.
Eine Anchor-Methode mit einem leeren url-Parameter führt keine Aktion aus, auch wenn ihr Geometrieinhalt aktiviert wird.
Der description-Parameter in der Anchor-Methode spezifiziert eine sprachliche Beschreibung dieser Methode. Sie kann durch ein Browser-spezifisches Benutzer-Interface verwendet werden, um zusätzliche Informationen zum Anchor zu liefern.
Der parameter-Parameter kann auch eingesetzt werden, um dem VRML- oder HTML-Browser zusätzliche Informationen zu übermitteln. Jede Zeichenkette muß den Aufbau Schlüssel=Wert besitzen. Beispielsweise, erlauben einige Browser die Angabe eines 'target' für einen Link, um ihn in einem anderen Teil des HTML-Dokuments zu laden. Der parameter-Parameter lautet dann:
$vrml ->anchor_begin('http://www.yourdomain.de', 'Neue Seite', 'target=name_des_frames') ->cylinder('2 4','red') ->anchor_end
Die Methode anchor_begin kann auch benutzt werden, um den Eingangs-Viewpoint einer Welt zu bestimmen, indem ein auf #ViewpointName endender URL spezifiziert wird. Dabei ist ViewpointName der Name eines Viewpoints einer VRML-Szene.
Beispiel:
$vrml ->anchor_begin('http://www.gfz-potsdam.de/~palm/vrml/index.wrl#Eingang') ->box('1 2 3','green') ->anchor_end
Wird der obige Quader aktiviert, so lädt dieser die Datei index.wrl
und positioniert den Betrachter auf einen Viewpoint mit dem Namen Eingang.
Ist der benannte Viewpoint nicht vorhanden, dann wird der
Standard-Viewpoint der Szene verwendet.
Wenn der url-Parameter nur den #ViewpointName enthält (d. h. ohne Dateinamen), wird der Viewpoint mit dem Namen ViewpointName in der aktuellen Welt eingestellt. Zum Beispiel binden die folgenden Programmzeilen:
$vrml ->anchor_begin('#Start') ->sphere(1,'blue') ->anchor_end
den Browser an die Kameraposition, die durch den Viewpoint Start in der aktuellen Welt definiert ist, sobald die Kugel aktiviert wird. Im Fall, daß der Viewpoint nicht gefunden werden kann, führt der Browser keine Aktion aus.
Die bboxCenter- und bboxSize-Parameter spezifizieren ein Begrenzungsvolumen, der alle anchor-Kinder einschließt. Diese Information ist für den Browser nur ein Hinweis und kann von ihm für Optimierungszwecke benutzt werden. Wenn das spezifizierte Begrenzungsvolumen kleiner als das wirkliche Begrenzungsvolumen der Kinder ist, kann das zu unerwünschten Ergebnissen führen. Der Standardwert für bboxSize, (-1 -1 -1), steht für ein undefiniertes Begrenzungsvolumen. Wird es benötigt, so muß es vom Browser selbst berechnet werden.
Das folgende Beispiel lädt die HTML-Startseite des VRML-Moduls in ein neues Fenster:
$vrml ->anchor_begin('http://www.gfz-potsdam.de/~palm/vrmlperl/', 'VRML-Perl Module', 'target=_blank') ->sphere(1,'blue') ->anchor_end;
axisOfRotation SFVec3f '0 1 0' bboxSize SFVec3f undef bboxCenter SFVec3f '0 0 0'
Die Methode billboard_begin richtet das lokale Koordinatensystem so aus, daß die z-Achse dem Betrachter zugewandt ist. Dadurch werden alle sichtbaren Objekte gewissermaßen auf die Kamera ausgerichtet. Der axisOfRotation-Parameter spezifiziert, um welche Achse die Rotation ausgeführt werden soll. Diese Achse befindet sich innerhalb des lokalen Koordinatensystems.
Ein Spezialfall ist die vollständige Betrachterausrichtung. In diesem Fall wird die lokale y-Achse des Objekts mit der des Betrachters parallel gehalten. Das läßt sich erreichen, indem man den Parameter axisOfRotation auf den Wert (0 0 0) setzt.
In einigen anderen Fällen kann es zu unerwarteten Ergebnissen kommen. Setzt man zum Beispiel die axisOfRotation auf (0 1 0), d. h. auf die y-Achse, und der Betrachter fliegt über diese und schaut darauf, so entsteht ein undefinierter Zustand.
Die bboxCenter- und bboxSize-Parameter spezifizieren ein Begrenzungsvolumen, das alle Billboard-Kinder einschließt. Diese Information ist für den Browser nur ein Hinweis und kann von ihm für Optimierungszwecke benutzt werden. Wenn das spezifizierte Begrenzungsvolumen kleiner als das wirkliche Begrenzungsvolumen der Kinder ist, kann das zu unerwünschten Ergebnissen führen. Der Standardwert für bboxSize, (-1 -1 -1), steht für ein undefiniertes Begrenzungsvolumen. Wird es benötigt, so muß es vom Browser selbst berechnet werden. Die Methode billboard_end hebt die Betrachterausrichtung wieder auf.
collide SFBool 1 proxy SFNode NULL bboxSize SFVec3f undef bboxCenter SFVec3f '0 0 0'
Alle geometrischen Körper besitzen in VRML 2.0 grundsätzlich die Eigenschaft, mit dem Betrachter zu kollidieren, sowie er einen bestimmten Abstand unterschreitet. Diese Eigenschaft kann über den Parameter collide beeinflußt werden. Geometrische Strukturen, die sich innerhalb der Methoden collision_begin und collision_end befinden, gelten als durchdringbar, wenn collide auf 0 gesetzt wird. Die Methode kann auch bei besonders komplexen Strukturen verwendet werden, um einen Vertreter (engl. Proxy) als alternatives Objekt für die Kollisionsberechnung anzugeben, das eine ähnliche, aber einfachere Struktur besitzt.
Beispiel:
$vrml ->collision_begin(1, sub{$vrml->box('5 1 0.01')}) ->text('undurchdringbar','yellow',1,'MIDDLE') ->collision_end
Beispiel:
$vrml ->group_begin ->sphere(1,'red') ->group_end
range MFFloat [] center SFVec3f '0 0 0'
Die Methoden lod_begin und lod_end gestatten es dem VRML-Browser, zwischen unterschiedlich detaillierten und damit unterschiedlich aufwendigen Strukturen umzuschalten. Die Reihenfolge der Kindmethoden beginnt mit der komplexesten und endet mit der einfachsten. Die Entfernungen im Parameter range müssen aufsteigend sortiert sein und immer mindestens einen Wert weniger besitzen als Kindmethoden vorhanden sind. Werden keine Parameter angegeben, so kann der VRML-Browser unter Gesichtspunkten der Optimierung auswählen, welche Kindstruktur er darstellt. Der Parameter center bestimmt den Punkt, der für die Berechnung der Entfernung vom Betrachter aus verwendet wird.
Das folgende Beispiel bringt einen Text in der VRML-Szene unter, der nur bis zu einer bestimmten Entfernung gut lesbar ist und darüber hinaus verschwindet. Natürlich hängt die Lesbarkeit von der Schrift- und Bildschirmgröße ab. Diese Beziehung kann man im Bedarfsfall mit Variablen recht einfach realisieren. Die Methode lod_begin enthält in diesem Beispiel eine Entfernung und benötigt somit zwei Kinder.
$vrml ->lod_begin('30') ->text('gut lesbar') ->group_begin->group_end # leere Gruppe ->lod_end
whichChoice SFInt32 -1
Die Methoden switch_begin und switch_end umschließen mehrere Kinder, von denen über den Parameter whichChoice jeweils nur einer oder keiner wiedergegeben wird. Alle Kinder sind mit 0 beginnend durchnumeriert und können über ihren Index ausgewählt werden. Ist der Wert kleiner als 0 oder größer als die Anzahl der zur Verfügung stehenden Kinder, so erfolgt keine Wiedergabe. In VRML 1.0 wird dieses Verfahren hauptsächlich zum Umschalten der Kameras und zur Definition von noch nicht benötigten Knoten eingesetzt.
transformationsListe SFString ""
Die wichtigste und mächtigste Methode zum Gruppieren stellt transform_begin dar. Sie bietet die Möglichkeit Translationen (Verschiebungen), Rotationen (Drehungen) und Skalierungen (Vergrößerungen bzw. Verkleinerungen) durchzuführen. Dabei wird ein lokales Koordinatensystem relativ zum übergeordneten Koordinatensystem definiert. Alle durchgeführten Transformationen werden in dem lokalen Koordinatensystem ausgeführt. Um alle Transformationen zu beenden und zum übergeordneten Koordinatensystem zurückzukehren, muß die Methode transform_end aufgerufen werden. Sie benötigt keinen Parameter.
Die transformationsListe hat folgenden Aufbau:
'Param1=Wert1', 'Param2=Wert2', ...
Param* kann die Anfangsbuchstaben der folgenden Wort belegen. Die Kompatibilität zu VRML 1.0 ist nur bei Verwendung der Anfangsbuchstaben gewährleistet.
Beispiel:
$vrml ->transform_begin('t=0 1 0','r=180') ->cone('0.5 2','red') ->transform_end
Beispiel:
$vrml ->at('0 2 0') ->sphere(0.5,'red') ->back
url MFString [] bboxSize SFVec3f undef bboxCenter SFVec3f '0 0 0'
Die Methode inline kommt ohne _begin und _end aus, da ihre Kinder nur über URLs eingebunden werden. Als zusätzliche Informationen können dem Browser Angaben über Ausdehnung und Position der Szene in Form eines Begrenzungsvolumens mitgeteilt werden. Da es sich aber möglicherweise um Szenen eines anderen Servers handelt, bedarf es eines ausgeklügelten Kontrollmechanismus', den der Anwender selbst implementieren muß, um externe Änderungen in den lokalen bbox-Angaben nachzuführen.
frontUrl MFString [] leftUrl MFString [] rightUrl MFString [] backUrl MFString [] bottomUrl MFString [] topUrl MFString [] skyColor MFColor ['0 0 0'] skyAngle MFFloat [] groundColor MFColor [] groundAngle MFFloat []
Die background-Methode kann sowohl zum Erzeugen eines farbigen Himmels und Bodens, als auch einer Hintergrundtextur in Form eines Panoramas, das sich hinter der gesamten Geometrie befindet, verwendet werden. Hintergrundmotive werden in dem lokalen Koordinatensystem spezifiziert und nur durch Rotationen beeinflußt.
Der skyColor-Parameter spezifiziert die Farbe des Himmels in verschiedenen Winkeln auf der Himmelskugel. Der erste Wert des skyColor-Parameters gibt die Farbe des Himmels bei 0 Grad an. Der skyAngle-Parameter spezifiziert die Winkel vom Zenit, in denen die konzentrischen Kreise verlaufen sollen. Der Zenit der Kugel ist implizit definiert mit 0.0 Grad; der natürliche Horizont liegt bei 90 Grad und der Fußpunkt bei 180 Grad. Der Parameter skyAngle ist für aufsteigende Werte im Bereich [0, 180] definiert. Es muß immer ein skyColor-Wert mehr angegeben werden als skyAngle-Werte existieren. Der erste Farbwert bestimmt die Farbe des Zenits und benötigt keinen skyAngle-Wert. Ist der letzte skyAngle-Wert kleiner als 180, dann wird für die Farbe vom letzten skyAngle bis zum Fußpunkt der letzte skyColor-Wert verwendet. Die Himmelsfarbe wird zwischen den skyColor-Werten linear interpoliert.
Der groundColor-Parameter spezifiziert die Farbe des Bodens in verschiedenen Winkeln auf der Untergrundhalbkugel. Der erste Wert des groundColor-Parameters bestimmt die Farbe des Fußpunktes. Der groundAngle-Parameter gibt die Winkel an, in denen die Farbe in konzentrischen Kreisen verläuft. Der Fußpunkt ist implizit definiert mit 0.0 Radians. Der Parameter groundAngle ist für aufsteigende Werte im Bereich [0.0, p /2] definiert. Es muß immer ein groundColor-Wert mehr angegeben werden als groundAngle-Werte existieren. Ist der letzte groundAngle-Wert kleiner als p /2, so wird die Region zwischen dem letzten groundAngle-Wert und dem Äquator unsichtbar. Die Untergrundfarbe wird linear interpoliert zwischen den einzelnen groundColor-Werten.
Die backUrl-, bottomUrl-, frontUrl-, leftUrl-, rightUrl- und topUrl-Parameter spezifizieren einen Satz von Bildern, die ein Hintergrundpanorama zwischen den Geometrien und den Hintergrundfarben definieren. Das Panorama besteht aus sechs Bildern, von denen jedes auf eine Seite eines übergroßen Würfels im lokalen Koordinatensystem projiziert wird. Die Bilder werden individuell jeder Seite zugeordnet. Alpha-Werte in den Panoramabildern (d. h. Zwei- oder Vier-Komponentenbilder) machen bestimmte Regionen halb- oder transparent und ermöglichen das Durchscheinen der groundColor- und skyColor-Farben. Oftmals werden auch die bottomUrl- und topUrl-Bilder nicht angegeben, um den Himmel und Boden sichtbar zu lassen. Alle gängigen VRML-Browser unterstützen bisher die Bildformate JPEG und GIF. Hinzu kommt das Format PNG, welches ausdrücklich in der Spezifikation VRML 2.0 empfohlen wird. Panoramabilder können eine Komponente (Graustufen), zwei Komponenten (Graustufen mit Alphakanal), drei Komponenten (RGB), oder vier Komponenten (RGB mit Alphakanal) besitzen.
Der Betrachter kann sich nicht den Bildern nähern; er kann sich jedoch drehen, um das ganze Panorama zu erfassen.
Der Hintergrund wird nicht durch die fog
-Methode (Nebel) beeinflußt. Es ist Aufgabe des Szenenautors, die Farben
verblassen zu lassen und die Bilder entsprechend zu ändern, wenn sich der
Betrachter im Nebel befindet.
Für die Generierung von VRML 1.0 werden nur die Parameter frontUrl und skyColor berücksichtigt. Durch die Vielzahl der Parameter wurde bei der background-Methode die Übergabeform Parameter => Wert (Hash) gewählt. Dabei spielt die Reihenfolge der Parameter keine Rolle; nicht benötigte Parameter können weggelassen werden.
Beispiel:
$vrml->background(skyColor => 'lightblue', frontUrl => 'http://www.yourdomain.de/bg/berge.gif');
skyColor SFColor '0 0 0' groundColor SFColor '0 0 0'
Die backgroundcolor-Methode stellt eine stark vereinfachte Variante der background-Methode dar. Sie spezifiziert nur die Hintergrundfarben einer Szene. Bei der Generierung einer VRML-2.0-Quelle wird der Parameter skyColor für den Himmel und groundColor für den Boden verwendet. Für VRML-1.0-Quellen wird der zweite Parameter ignoriert.
Beispiel:
$vrml->backgroundcolor('lightblue');
url SFString ""
Über die Methode backgroundimage kann das Hintergrundbild einer Szene definiert werden. Dazu muß der Parameter url eine Grafikdatei enthalten. Die am häufigsten unterstützten Grafikformate sind GIF, JPEG und PNG. Neben diesen stellen einige VRML-Browser auch das BMP-Format dar. Aus Gründen der Kompatibilität zur UNIX- und Macintosh-Welt und wegen des übermäßigen Platzbedarfs sollte dieses Format nicht einsetzt werden. Die Methode backgroundimage belegt den kompletten Hintergrund in VRML 1.0 und alle sechs Panoramabilder in VRML 2.0 mit dem gleichen Bild. Für eine individuelle Zuweisung jedes Panoramateils muß die Methode background verwendet werden.
Beispiel:
$vrml->backgroundimage('http://www.yourdomain.de/bg/sterne.gif');
string SFString ""
Die Angabe eines Titels in der Methode title hat keine Auswirkung auf die darstellbare Szene. Sie kann lediglich vom Browser als Zusatzinformation verwendet werden und wird häufig in dessen Titelleiste angezeigt.
Beispiel:
$vrml->title('Meine virtuelle Welt');
string MFString []
Mit der Methode info können beliebige Informationen in einer VRML-Datei untergebracht werden.
Beispiel:
$vrml->info('letzte Änderung: 8.05.1997');
title SFString "" info MFString []
Die Methode worldinfo stellt Informationen über die aktuelle Szene zur Verfügung. Diese Methode ist nur für Dokumentationszwecke gedacht und hat keinen Einfluß auf die VRML-Welt. Im title-Parameter kann der Name oder Titel der Welt gespeichert werden, um ihn gegebenenfalls in der Titelleiste zu präsentieren. Andere Informationen über die Welt wie Autor, Copyright oder Nutzungshinweise können im info-Parameter abgelegt werden. Die Methode worldinfo kombiniert die Methoden title und info.
Beispiel:
$vrml->worldinfo('Sofies Welt', 'Jostein Gaarder');
type MFEnum ['WALK', 'ANY'] # ANY, WALK, FLY, EXAMINE, NONE speed SFFloat 1.0 headlight SFBool 1 visibilityLimit SFFloat 0.0 avatarSize MFFloat [0.25, 1.6, 0.75]
Mit der Methode navigationinfo können verschiedene Informationen für die Steuerung des VRML-Browsers festgelegt werden. Diese Informationen beschreiben Eigenschaften des Betrachters und die Art wie er durch die Szene navigiert. Die Bewegungsart wird über den Parameter type spezifiziert. Beim Gehen (WALK) wirkt die Schwerkraft auf den Betrachter, die ihn auf den Untergrund zieht. Dadurch wird es ihm auch möglich, einem Gelände zu folgen. Das Gehen erfordert eine aufrechte Haltung (parallel zur y-Achse), die durch den Browser realisiert wird. Das Fliegen (FLY) ähnelt dem Gehen, jedoch ohne die Wirkung einer Schwerkraft. Sowohl beim Gehen als auch beim Fliegen ist die Kollisionserkennung standardmäßig eingeschaltet. Der Mindestabstand zwischen dem Betrachter und geometrischen Objekten der Szene kann über den ersten Wert des Parameters avatarSize eingestellt werden (voreingestellt sind 25 cm). Wird dieser unterschritten, kollidiert man. Der zweite Wert des Parameters avatarSize bestimmt die Blickhöhe des Betrachters (voreingestellt sind 1,6 Meter). Besonders negativ machen sich Höhenunterschiede zwischen der aktuellen Blickhöhe und vordefinierten Aussichtspunkten (engl. Viewpoints) bemerkbar. Hierbei wird die Höhe angepaßt, sowie man sich von der Stelle bewegt, was zu einer Auf- bzw. Abwärtsbewegung führt. Der dritte Wert des Parameters avatarSize spezifiziert die Höhe eines Körpers den der Betrachter bei eingeschalteter Schwerkraft noch überwinden kann (voreingestellt sind 75 cm).
Die Geschwindigkeit, mit der man sich in der Welt bewegt, spezifiziert der Parameter speed. Sie wird in Metern pro Sekunde angegeben und beträgt standardmäßig 1,0 m/s (3,6 km/h). Von den Parametern der aktuellen Transformation beeinflußt nur der Skalierungsfaktor die Geschwindigkeit.
Viele VRML-Browser besitzen als zusätzliche Beleuchtung eine Helmlampe, deren Lichtstrahlen in Blickrichtung verlaufen. Die Helmlampe ist je nach Browser standardmäßig ein- oder ausgeschaltet. Erst in der Spezifikation VRML 2.0 wurde festgelegt, daß diese beim Start leuchtet, wenn sie nicht explizit durch den Parameter headlight ausgeschaltet wurde. Nach dem Laden der Szene hat der Betrachter die Möglichkeit, den aktuellen Zustand zu ändern.
Die Sichtweite des Betrachters kann über den Parameter visibilityLimit eingegrenzt werden. Abhängig vom jeweiligen Browser brechen einige die Darstellung an dieser Position ab, während andere nur komplette Geometrien weglassen.
Beispiel:
$vrml->navigationinfo('WALK', 1.5, 0, 1000);
description SFString "" position SFVec3f 0 0 10 orientation SFRotation/SFEnum 0 0 1 0 # FRONT, LEFT, BACK, RIGHT, TOP, BOTTOM fieldOfView SFFloat 45 # Grad jump SFBool 1
Die Methode viewpoint dient der individuellen Positionierung einer Kamera bzw. der Festlegung von bestimmten Aussichtspunkten. Der Parameter position spezifiziert die Position, an der sich die Kamera befinden soll. Für den Parameter orientation stehen neben der Angabe eines SFRotation-Werts auch Synonyme für die häufigsten Richtungen FRONT, LEFT, BACK, RIGHT, TOP, BOTTOM und ALL in Form von Zeichenketten zur Verfügung. Der Parameter description enthält die Bezeichnung des Aussichtspunktes. Er wird später vom VRML-Browser in einem Pulldown-Menü dargestellt und zur Auswahl angeboten. Nach jedem Hinzufügen eines neuen Aussichtspunktes wird dieser als aktuelle Benutzersicht übernommen. Um das zu verhindern, muß der Parameter jump auf 0 gesetzt werden. Den Blickwinkel bestimmt der Parameter fieldOfView. Kleine Winkel sind vergleichbar mit einem Teleobjektiv, große mit einem Weitwinkelobjektiv.
Beispiel:
$vrml->viewpoint('Start','0 0 0','0 0 -1 0',60);
ist identisch mit
$vrml->viewpoint('Start',undef,'FRONT',60);
center SFVec3f '0 0 0' distance SFFloat 10 fieldOfView SFFloat 45 # Grad avatarSize MFFloat [0.25, 1.6, 0.75]
Eine zeitraubende und ständig wiederkehrende Arbeit ist die Positionierung von Aussichtspunkten (engl. Viewpoints) für die Standardansichten von vorn, von rechts, von hinten, von links, von oben und von unten. Die Methode viewpoint_set soll helfen, diese undankbare Aufgabe zu erleichtern. Durch ihre Anwendung lassen sich alle Standardeinstellungen mit einer Anweisung definieren. Weitere Aussichtspunkte können über die Methode viewpoint hinzugefügt werden. Der Parameter avatarSize sichert, daß die Viewpoints in der gleichen Höhe angeordnet werden in der sich der Betrachter bewegt.
Das folgende Beispiel ordnet alle sechs Standardansichten im Abstand von fünf Metern um das Zentrum (4 3 0) an:
$vrml->viewpoint_set('4 3 0',5);
direction SFVec3f '0 0 -1' intensity SFFloat 1 ambientIntensity SFFloat 1 color SFColor '1 1 1' #weiß on SFBool 1
Die directionallight-Methode beleuchtet Objekte in einer Szene mit parallelem Licht gleicher Intensität. Der direction-Parameter spezifiziert die Richtung der Strahlen bezogen auf das lokale Koordinatensystem. Das Licht wird von einer unendlich weit entfernten Quelle ausgestrahlt und beleuchtet nur die Objekte der Gruppe, in der es sich befindet, bzw. deren untergeordnete Gruppen. Der intensity-Parameter spezifiziert die Intensität der Lichtquelle. Ein Wert von 1 bedeutet maximale Helligkeit. Die Farbe des ausgesendeten Lichtes bestimmt der color-Parameter. Über den Parameter on läßt sich der Grundzustand der Lichtquelle angeben.
Alle durchgeführten übergeordneten Transformationen wirken sich auch auf die Lichtquelle aus.
Beispiel:
$vrml->directionallight("0 0 -1", 0.3);
url MFString [] description SFString "" location SFVec3f '0 0 0' direction SFVec3f '0 0 1' intensity SFFloat 1.0 loop SFBool 0 pitch SFFloat 1.0
Die sound-Methode spezifiziert die räumliche Präsentation von Tönen in einer VRML-Szene.
Der url-Parameter spezifiziert die URL, von der der Klang geladen werden soll. Die unterstützen Typen sind meistens WAV im unkomprimierten PCM-Format und MPEG-1. Zusätzlich können viele VRML-Browser noch den MIDI-Dateityp 1 unter Verwendung des General MIDI Patch wiedergeben.
Der description-Parameter gibt eine sprachliche Beschreibung der Audio-Quelle an. Ein Browser muß den description-Parameter nicht anzeigen, kann es aber während der Wiedergabe des Klangs tun.
Der location-Parameter bestimmt den Ort im lokalen Koordinatensystem, von dem der Sound ausgestrahlt werden soll. Die sound-Methode gibt keine Töne ab, wenn sie nicht Teil der dargestellten Szene ist; d. h. wenn sie sich in einem Teil eines LOD- oder Switch- Knotens befindet der ausgeschaltet ist.
Der direction-Parameter spezifiziert die Richtung, in die der Sound ausgestrahlt werden soll.
Der intensity-Parameter spezifiziert die Wiedergabelautstärke. Der Wertebereich geht von 0.0 bis 1.0. Bei einer Intensität von 1.0 wird der Ton mit maximaler Lautstärke wiedergegeben; bei 0.0 hingegen herrscht Ruhe.
Der loop-Parameter bestimmt, ob das Musikstück einmal oder fortlaufend wiedergegeben werden soll.
Der pitch-Parameter spezifiziert ein Vielfaches der Wiedergabefrequenz. Es sind nur positive Werte gültig. Ein Wert von Null oder kleiner produziert undefinierte Ergebnisse. Die Änderung des pitch-Parameter erzeugt sowohl eine Tonhöhenänderung als auch eine Änderung der Wiedergabegeschwindigkeit. Ein Wert von 2.0 bedeutet, daß der Klang eine Oktave höher als normal gespielt wird und doppelt so schnell. Bei einem gesampelten Klang ändert der pitch-Parameter die Wiedergabefrequenz. Im Falle einer MIDI (oder eines anderen in Noten aufgezeichneten Musikstücks) wird das Tempo der Wiedergabe erhöht und die MIDI-Steuerung entsprechend angepaßt, um den gewünschten Effekt zu erzielen.
size SFVec3f '2 2 2' # Breite Höhe Tiefe appearance SFString "" # siehe Material & Farbe
Die Methode box definiert einen Quader mit dem Mittelpunkt (0 0 0) im lokalen Koordinatensystem. Standardmäßig hat der Quader die Größe von zwei Einheiten in jeder Richtung, jeweils von -1 bis +1. Der size-Parameter spezifiziert die Ausdehnung entlang der x-, y- und z-Achse und muß bei jeder Komponente größer als 0.0 sein. Sind alle drei Angaben gleich, so wird aus dem Quader ein Würfel. Der Parameter appearance spezifiziert die Farbe bzw. die Oberflächeneigenschaften. Texturen werden auf jede Fläche einzeln projiziert.
Ein Quader erfordert nur die Darstellung von Außenflächen. Die Betrachtung der Innenseiten führt zu undefinierten Ergebnissen.
bottomRadius height SFVec2f '1 2' appearance SFString "" # siehe Material & Farbe
Die Methode cone spezifiziert einen Kegel, dessen Mittelpunkt (0 0 0) im lokalen Koordinatensystem und dessen zentrale Achse auf der y-Achse liegt. Der bottomRadius-Parameter bestimmt den Radius des Kegelbodens und der height-Parameter die Höhe des Kegels. Standardmäßig hat der Kegel einen Radius von 1.0 und eine Höhe von 2.0 mit der Spitze bei y = height/2 und dem Boden bei y = -height/2. Beide, bottomRadius und height, müssen größer als 0.0 sein. Der Parameter appearance spezifiziert die Farbe bzw. die Oberflächeneigenschaften.
Ein Kegel erfordert nur die Darstellung von Außenflächen. Die Betrachtung der Innenseiten führt zu undefinierten Ergebnissen.
radius height SFVec2f '1 2' appearance SFString "" # siehe Material & Farbe
Die Methode cylinder spezifiziert einen geschlossenen Zylinder (Abbildung 6) mit dem Mittelpunkt (0 0 0) im lokalen Koordinatensystem, dessen zentrale Achse auf der y-Achse liegt. Standardmäßig hat der Zylinder eine Ausdehnung von -1 bis +1 in alle drei Richtungen. Der radius-Parameter bestimmt den Radius des Zylinders und der height-Parameter die Höhe entlang der zentralen Achse. Beide, radius und height, müssen größer als 0.0 sein. Der Parameter appearance spezifiziert die Farbe bzw. die Oberflächeneigenschaften.
Ein Zylinder erfordert nur die Darstellung von Außenflächen. Die Betrachtung der Innenseiten führt zu undefinierten Ergebnissen.
from SFVec3f "" to SFVec3f "" radius SFFloat 0 # 0 = Haarlinie appearance SFString "" path SFEnum "" # XYZ, XZY, YXZ, YZX, ZXY, ZYX
In VRML erfolgt die Positionierung eines Körpers durch die Angabe eines
Raumpunktes und der Richtung im Raum (Vektor). Diese Vorgehensweise erweist
sich dann als besonders nachteilig, wenn zwei Punkte durch einen Körper
miteinander verbunden werden müssen. Der VRML-Knoten IndexedLineSet
bietet nur die Möglichkeit, zwei Punkte durch Linien in einer
Standardstrichstärke zu verbinden. Um eine variable Linienstärke zu
realisieren, muß ein Zylinder als Linienersatz dienen. Die Methode line führt alle notwendigen Berechnungen durch, um diesen Zylinder korrekt zu
plazieren. Die Parameter from und to
bestimmen den Start- und Endpunkt der Linie. Der Parameter radius gibt den Radius des Zylinders vor, der für die Verbindung eingesetzt wird.
Ob die Linie einen direkten oder einen orthogonalen Verlauf entlang der x-,
y- und z-Achsen nehmen soll, spezifiziert der Parameter path. Bei leerem Parameter wird die direkte Verbindung gewählt.
In dem folgenden Beispiel erzeugt die erste Linie einen orthogonalen Linienverlauf beginnend an der Position '1 -1 1', der sich zunächst entlang der x-Achse bewegt, dann in Richtung der z-Achse und schließlich parallel zur y-Achse an der Koordinate '-3 2 2' endet. Der Zylinder hat einen Durchmesser von drei Zentimetern. Der zweite Zylinder verbindet beide Koordinaten auf direktem Weg miteinander.
new VRML(2) ->begin ->line('1 -1 1', '-3 2 2', 0.03, 'red', 'XZY') ->line('1 -1 1', '-3 2 2', 0.03, 'white') ->end ->print;
size SFVec3f '2 2 2' # Breite Höhe Tiefe appearance SFString "" # siehe Material & Farbe
Die Methode pyramid definiert eine Pyramide mit dem Mittelpunkt (0 0 0) im lokalen Koordinatensystem. Standardmäßig hat der Pyramide die Größe von zwei Einheiten in jeder Richtung, jeweils von -1 bis +1. Der size-Parameter spezifiziert die Ausdehnung entlang der x-, y- und z-Achse und muß bei jeder Komponente größer als 0.0 sein. Der Parameter appearance spezifiziert die Farbe bzw. die Oberflächeneigenschaften. Werden mehrere Farben angegeben (durch Kommata getrennt), so wird jede Seite mit der entsprechen Farbe belegt.
Beispiel:
$vrml->pyramid('1 1 1','blue,green,red,yellow,white');
radius SFFloat 1 appearance SFString "" # siehe Material & Farbe
Die Methode sphere spezifiziert eine Kugel mit dem Mittelpunkt (0 0 0) im lokalen Koordinatensystem. Der radius-Parameter bestimmt den Radius der Kugel und muß größer als 0.0 sein. Der Parameter appearance spezifiziert die Farbe bzw. die Oberflächeneigenschaften.
Wenn eine Textur auf die Kugel gelegt wird, umhüllt sie die ganze Oberfläche, beginnend von der Rückseite entgegen dem Uhrzeigersinn. Die Textur hat eine Naht an der Rückseite, wo die Fläche x=0 die Kugel schneidet und die z-Werte negativ sind.
Eine Kugel erfordert nur die Darstellung von Außenflächen. Die Betrachtung der Innenseiten führt zu undefinierten Ergebnissen.
height MFFloat [] color MFColor [] # bzw. Material & Farbe xDimension SFInt32 0 zDimension SFInt32 0 xSpacing SFFloat 1.0 zSpacing SFFloat 1.0 creaseAngle SFFloat 0 colorPerVertex SFBool 1 solid SFBool 0
Die Methode elevationgrid spezifiziert ein Höhenmodell durch ein regelmäßiges Gitter. Der Parameter height gibt dabei eine Anzahl von Höhenwerten vor zu denen jeweils ein Farbwert (bei colorPerVertex gleich 1) gehört. Wird colorPerVertex auf 0 gesetzt, so werden die Flächen zwischen vier Punkten eingefärbt, d.h. es wird ein Farbwert pro Dimension (x,z) weniger benötigt. Der Parameter height kann als Referenz auf ein Array - welches eine x-Zeile enthält - angegeben werden. In diesem Fall wird die Anzahl der Elemente als xDimension und die Anzahl der Zeilen als zDimension interpretiert. Sie sollte dann nicht nochmals ermittelt werden. Wird der Parameter color nicht als Referenz auf ein ARRAY übergeben, so wird angenommen, daß es sich um eine Farb- bzw. Texturangabe handelt.
Beispiel:
open(FILE,"<height.txt"); my @height = <FILE>; open(COL,"<color.txt"); my @color = <COL>; $vrml->navigationinfo(["EXAMINE","FLY"],200) ->viewpoint("Top","1900 6000 1900","TOP") ->elevationgrid(\@height, \@color, undef, undef, 250, undef, 0) ->print;
string MFString [] appearance SFString "" # siehe Material & Farbe font SFString '1 SERIF PLAIN' align SFEnum 'BEGIN' # BEGIN, MIDDLE, END
Die Methode text spezifiziert eine flache, zweiseitige Zeichenkette, die in der z-Ebene des lokalen Koordinatensystems positioniert wird. Der Parameter string kann eine Liste von Zeichenketten enthalten, wobei jeder Eintrag in einer neuen Zeile dargestellt wird. Der Parameter appearance spezifiziert die Farbe bzw. die Oberflächeneigenschaften, die für den kompletten Text gültig ist. Der Parameter font gliedert sich in drei Teile size, family und style, jeweils durch ein Leerzeichen getrennt. Der erste Wert size spezifiziert die Schriftgröße (Schriftgrad), bezogen auf das lokale Koordinatensystem der text-Methode. Er muß immer größer als 0.0 sein. Der zweite Wert family enthält eine Zeichenkette in Großbuchstaben, welche die Font-Familie spezifiziert. Der Browser bestimmt jedoch letztendlich, welcher Font aus dieser Familie zum Einsatz kommt. Üblicherweise werden von den Browsern mindestens SERIF für einen Serif-Font wie Times Roman, SANS für einen Sans-Serif-Font wie Helvetica und TYPEWRITER für einen Font mit konstanter Buchstabenbreite wie Courier unterstützt. Ein leerer Wert für family ist identisch mit SERIF. Der Parameter style kann die Werte PLAIN, BOLD, ITALIC und BOLDITALIC annehmen.
PLAIN (keine Besonderheiten, Voreinstellung) BOLD (fett) ITALIC (kursiv) BOLDITALIC (fett und kursiv)
Der Parameter align gibt die Ausrichtung des Textes an. Es stehen folgende Werte zur Verfügung:
BEGIN bzw. LEFT (linksbündig, Voreinstellung) MIDDLE bzw. CENTER (zentriert) END bzw. RIGHT (rechtsbündig)
string MFString [] appearance SFString "" # siehe Material & Farbe font SFString '1 SERIF PLAIN' align SFEnum 'BEGIN' # BEGIN, MIDDLE, END
Die Methode billtext ist äquivalent zur Methode text mit der zusätzlichen Eigenschaft, daß der Text immer dem Betrachter zugewandt bleibt. Sie kombiniert die Methoden billboard und text, da es häufig vorkommt, daß die Textinformationen einer Szene aus allen Richtungen lesbar sein müssen.
'Eigenschaft1=Liste1; Eigenschaft2=Farbe1,Farbe2; ...'
wobei Eigenschaft die Werte:
a - ambientColor (nur VRML 1.0) d - diffuseColor e - emissiveColor s - specularColor
ai - ambientIntensity (nur VRML 2.0) sh - shininess tr - transparency
tex - filename, wrapS, wrapT
def - benennt den Appearance-Knoten defmat - benennt den Material-Knoten deftex - benennt den Image- bzw. MovieTexture-Knoten
annehmen kann und Liste eine Anzahl von Materialien definiert, die durch Kommata getrennt werden müssen. Das Kürzel für einen Farbwert besteht dabei aus einem Buchstaben und das Kürzel einer Intensität aus zwei Buchstaben. Drei und mehr Buchstaben sind für Definitionen und Texturen vorgesehen. Das Modul erkennt selbständig, ob es sich um eine ImageTexture (GIF, JPEG, PNG, BMP) oder um ein Video (AVI, MPEG, MOV) handelt. Mehrere Eigenschaften können kombiniert werden, indem diese durch ein Semikolon voneinander getrennt werden. Farbwerte können als RGB-Tripel oder als Name angegeben werden. Es gibt vier Schreibweisen, um eine Farbe (z. B. intensives Gelb) zu definieren.
'1 1 0' (VRML-Standard) 'FFFF00' oder 'ffff00' '255 255 0' 'yellow'
Die beiliegende Version des VRML-Moduls enthält alle X11-Farbnamen. Jedem Farbnamen kann ein zweistelliger Zahlenwert folgen, der die Helligkeit linear verringert. Dieser prozentuale Anteil muß von dem Farbnamen durch ein spezielles Zeichen ( % _ ) getrennt werden. Hier bietet sich das Prozentzeichen als intuitive Gedankenstütze an. Von der Verwendung dieses Zeichens innerhalb eines Parameters einer URL-Adresse ist jedoch abzuraten, da Prozentzeichen, die von Ziffern gefolgt werden, in entsprechende ASCII-Zeichen umgewandelt werden. Es wird deshalb empfohlen, in URL-Adressen, insbesondere im QUERY_STRING, den Unterstrich (_) als Trennsymbol zu verwenden !
Analog zum vorherigen Beispiel können vier verschiedene Schreibweisen eingesetzt werden, um die Intensität einer Farbe (z. B. Gelb) zu verringern.
'.5 .5 0' (VRML-Standard) '808000' '128 128 0' 'yellow%50'
Abschließend noch zwei Beispiele für identische Farbwerte:
yellow%100 = yellow_100 = yellow (gelb)
white%0 = black (schwarz)
Eine Liste der verfügbaren Farbnamen befindet sich im Modul VRML::Color.
Die Methode appearance wird implizit beim Gebrauch der Geometriemethoden aufgerufen. Sie realisiert die obige Synatx. Normalerweise wird sie nicht anderweitig benötigt.
keys
genannt, liegen immer im Bereich von 0.0 bis 1.0. Zu jedem key
muß es einen Funktionswert vom Typ des Interpolators geben. Zwischen den keys
wird linear interpoliert. Um eine bessere Interpolation als die stückweise
lineare Interpolation zu erzielen, muß man sich einen eigenen Interpolator
schreiben. Für ganze Zahlen gibt es keinen Interpolator.
name SFString "" type SFEnum "" # Color, Coordinate, Normal, Orientation, # Position und Scalar keys MFFloat [] # [0,1] keyValues MF... [] # Typ des Interpolators
Die Methode interpolator erzeugt einen benannten Interpolator, der linear zwischen den Funktionswerten des im Parameters type spezifizierten Datentyps interpoliert. Als Typen stehen zur Auswahl: Color, Coordinate, Normal, Orientation, Position und Scalar. Der Parameter name enthält den Bezeichner, über den der Interpolator beispielsweise in einer route-Methode referenziert werden kann.
Beispiel:
$vrml->interpolator('RotBlau', 'Color', [0,1], ['1 0 0', '0 0 1']);
Für den Ablauf von Animationen ist der TimeSensor von besonderer Bedeutung. Er kann in kontinuierlichen Abständen Ereignisse liefern, die an Skripte oder Interpolatoren gesendet werden.
Alle Sensoren benötigen grundsätzlich einen Namen für die referenzierende route-Anweisung. Dieser wird immer im Parameter name spezifiziert.
name SFString "" maxAngle SFFloat undef minAngle SFFloat 0 diskAngle SFFloat 15 offset SFFloat 0 autoOffset SFBool 1 enabled SFBool 1
Der Cylinder-Sensor generiert Ereignisse, sobald der Benutzer einen virtuellen Zylinder anklickt.
name SFString "" maxPosition SFVec2f undef minPosition SFVec2f '0 0' offset SFVec3f '0 0 0' autoOffset SFBool 1 enabled SFBool 1
Der Plane-Sensor generiert Ereignisse, sobald der Benutzer eine virtuelle Ebene anklickt.
name SFString "" size SFVec3f '0 0 0' center SFVec3f '0 0 0' enabled SFBool 1
Der Proximity-Sensor generiert Ereignisse, sobald sich der Benutzer innerhalb eines bestimmten (quaderförmigen) Bereichs um ein bestimmtes Objekt bzw. einen bestimmten Koordinatenpunkt bewegt.
name SFString "" offset SFRotation '0 1 0 0' autoOffset SFBool 1 enabled SFBool 1
Der Sphere-Sensor generiert Ereignisse, sobald der Benutzer eine virtuelle Kugel anklickt.
name SFString "" cycleInterval SFFloat 1 loop SFBool 0 startTime SFFloat 0 stopTime SFFloat 0 enabled SFBool 1
Der Time-Sensor generiert Ereignisse, die Zeitwerte enthalten. Diese Zeitwerte können beispielsweise Animationen steuern.
name SFString "" enabled SFBool 1
Der Touch-Sensor generiert Ereignisse, sobald sich der Benutzer mit dem Mauszeiger über ein bestimmtes Objektteil bewegt und dieses anklickt.
Das folgende Beispiel stellt eine weiße Kugel dar, die bei Aktivierung mit rotem Licht bestrahlt wird.
Beispiel:
$vrml ->begin ->touchsensor('Schalter') ->sphere(1,'white') ->def('Licht')->directionallight("", 1, 0, 'red', 0) ->route('Schalter.isActive', 'Licht.on') ->end ->print->save;
name SFString "" size SFVec3f '0 0 0' center SFVec3f '0 0 0' enabled SFBool 1
Der Visibility-Sensor generiert Ereignisse, sobald ein Teil eines quaderförmigen Bereiches in das Blickfeld des Betrachters eintritt oder aus dem Blickfeld verschwindet.
FROM.feldname SFString "" TO.feldname SFString ""
Die Methode route stellt die Verbindung zwischen einem Knoten, der Ereignisse sendet, und einem Knoten, der dieses Ereignis empfängt her. Das Verständnis der Beziehungen zwischen den Sende- und Empfangsfeldern der jeweiligen Knoten ist Voraussetzung für das erfolgreiche Weiterleiten (routen) von Ereignissen. Der Parameter FROM.feldname spezifiziert das Feld eines benannten Knotens, von dem das Ereignis gesendet wird. Der Parameter TO.feldname spezifiziert das Feld eines benannten Knotens, welches das Ereignis erhalten soll. Als Werte dieser Parameter können nur mit def benannte Objekte verwendet werden, bei denen die Datentypen übereinstimmen. Ein Beispiel für die Weiterleitung von Ereignissen ist im Abschnitt Sensoren zu finden.
name SFString ""
Die Benennung eines Knotens ist Grundvoraussetzung für die Wiederverwendung (Instanzierung) und das Weiterleiten von Ereignissen. Namen von Knoten, Feldern, Ereignissen und Prototypen dürfen nicht mit einer Ziffer beginnen und keines der folgenden Zeichen enthalten:
Steuerzeichen (ASCII 0 bis 31) Leerzeichen einfache und doppelte Anführungszeichen Kommentarzeichen # Komma, Punkt und Semikolon Plus- und Minus-Zeichen Klammern Backslash
Beispiel:
$vrml->def('Kugel')->sphere(1,'red')
name SFString ""
Die Methode use dient der Referenzierung bzw. Instanzierung eines mit der Methode def definierten Objekts. Als einzigen Parameter benötigt sie den Namen des Objekts.
Beispiel:
$vrml->use('Kugel')
VRML::VRML1::Standard
VRML::VRML2
VRML::VRML2::Standard
VRML::Base
VRML::Color
Siehe auch http://www.gfz-potsdam.de/~palm/vrmlperl/ für weitere Informationen zu den VRML-Modulen und wie man sie einsetzen kann.
Homepage http://www.gfz-potsdam.de/~palm/