Das Arbeiten mit Prototypen erlaubt eine Strukturierung von Objekten, wie
sie kein Software-Tool in dieser Form erreichen kann. Außerdem kann
man sich über die Prototypen eine Sammlung von allgemein Nutzbaren Objekten
erzeugen.
Der folgende Text beschreibt, wie ein Prototyp für einen Stuhl aufgebaut
sein kann und was man dann alles mit dem Prototypen anfangen kann.
Betrachtet man den Stuhl genau, so kann man feststellen, dass er nur
aus Quadern besteht, also Objekten vom Typ Box.
Diese Boxen unterscheiden sich in ihrer Größe, ihrer Farbe und natürlich ihrer Lage im Raum. Es bietet sich an hierfür einen speziellen Prototypen zu erstellen. |
|
Der Prototyp "Kasten" erlaubt vielfältige Veränderungen an
dem zugrinde liegenden Element, nur die geometrische Form "Box" ist festgelegt.
Jede der Zeilen im Interface-Teil der Prototyp-Deklaration beginnt mit dem Wort field bzw. exposedField. Der Unterschied spielt eigentlich nur bei Animationen eine Rolle. Danach folgt dann der Type des Feldes, den muss man jeweils in der VRML-Dokumetation nachschlagen. Die wichtigsten Typen tauchen bereits in dem Beispiel auf. In der letzten Spalte folgen dann die frei wählbare Bezeichnung für das Feld und der Vorgabewert. Wird das entsprechende Feld beim Instanziieren nicht angegeben, dann wird der Vorgabewert eingetragen.
|
PROTO Stuhl [ field SFVec3f pos 0 0 0 field SFRotation rotation 0 0 0 0 field SFVec3f size 1.0 1.0 1.0 exposedField SFColor color 0 0 1 ] { Transform { children [ Kasten { #Fußstrebe unten links color IS color size 0.06 0.16 1.8 trans 0.03 0.08 0.9 } Kasten { #Fußstrebe unten rechts color IS color size 0.06 0.16 1.8 trans 1.65 0.08 0.9 } Kasten { #Fußstrebe hinten color IS color size 1.56 0.16 0.06 trans 0.84 0.08 1.77 } Kasten { #Sitzflächenuntergrund color IS color size 1.68 0.16 1.68 trans 0.84 1.76 0.84 } Kasten {#Sitzfläche color .8 .5 .2 size 1.64 0.02 1.64 trans 0.84 1.842 0.84 } Kasten { #Strebe links color IS color size 0.06 3.2 0.09 trans -0.02 1.562 1.24 rotation 1 0 0 .32 } Kasten { #Strebe rechts color IS color size 0.06 3.2 0.09 trans 1.7 1.562 1.24 rotation 1 0 0 .32 } Kasten { #Lehne color .8 .5 .2 size 1.68 0.96 0.04 trans 0.84 2.76 1.64 rotation 1 0 0 .32 } ] translation IS pos rotation IS rotation scale IS size } } # Ende PROTO Stuhl |
Der Prototyp "Stuhl" ist nun nur noch eine Zusammenstellung von Objekten
des Typs "Kasten". Die einzelnen Objekte unterscheiden sich nur in ihrer
Farbe, ihrer Größe und ihrer Position im Raum.
Die Positionierung der einzelnen Elemente bleibt immer noch mühsam, man kann die optimale Position jeweils berechnen oder ausprobieren.
|
Stuhl { pos -1 0 0 rotation 0 1 0 0.7 } |
Eine Instanz vom Objekt Stuhl kann man jetzt ganz einfach erzeugen. Man muss sich nur überlegen, welche der Eigenschaften man verändern muss. |
Das folgende Listing zeigt einen sehr flexiblen Umgang mit den Prototypen.
Der Prototyp bleibt dabei in einer Extra-Datei, nur die Instanz wird im aktuellen
Listing erzeugt:
#VRML V2.0 utf8 Background { skyColor 1 1 1} EXTERNPROTO Stuhl [ exposedField SFColor color field SFVec3f pos field SFRotation rotation field SFVec3f size ] "prototyp-stuhl.wrl#Stuhl" Stuhl { color 1 1 0 } Will man externe Prototypen verwenden, so muss man leider deren Interface-Teil in das eigene Listing kopieren, wobei die Vorgabe-Werte entfallen müssen. Man muss aber nur die Felder im Interface-Teil angeben, die man auch benutzen möchte. Im Beispiel hätten also die kursiven Zeilen entfallen dürfen. Die Datein müssen noch nicht einmal auf dem gleichen Rechner liegen, der Verweis auf die Prototyp-Datei kann eine komplette URL sein: ] "http://www.debacher.de/vrml/beispiele/prototyp-stuhl.wrl#Stuhl" (VRML wertet übrigens die Interface-Liste vorrangig aus und benutzt den ersten passende Prototyp in der Prototyp-Datei. Falls mehrere passen muss der richtige an die URL angehängt werden, hier #Stuhl. Der Bezeichner hinter EXTERNPROTO ist frei wählbar und muss nicht mit dem Bezeichner in der Prototyp-Datei übereinstimmen.) |