Prototyp Stuhl

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.

1. Das Ergebnis

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.

 

2. Der Prototyp Kasten:

PROTO  Kasten [
  exposedField 	SFVec3f  	trans 0 0 0
  field     	SFVec3f  	size 1.0 1.0 1.0
  field		SFRotation  	rotation  0 0 0 0
  exposedField	SFColor  	color  .8  .8  .8
  field 	MFString 	textur [ ]
  field     	SFFloat  	visible 0
]
{
Transform {
  children [
   Shape {
     appearance Appearance {
        material Material {
          diffuseColor IS color
          transparency IS visible
        }
        texture ImageTexture {
          url IS textur
        }

     }
     geometry Box {
       size IS size
     }
   }
  ]
  translation IS trans
  rotation IS rotation
 } 
} # Ende PROTO Kasten

} # Ende PROTO Kasten
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.

 

3. Der Prototyp Stuhl:

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.

4. Eine mögliche Instanz von Stuhl

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.

 

5. Externe Prototypen

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.)


geschrieben von Uwe Debacher, letzte Änderung am 11.11.2003