next up previous contents
Nächste Seite: X3D-Edit Aufwärts: 3D-Beschreibungssprachen Vorherige Seite: Sensoren   Inhalt


Prototypen in VRML bzw. X3D

Neben den vorgegebenen Knoten, die es in VRML oder X3D gibt, lassen sich auch eigene Objekte definieren. Das macht besonders dann Sinn, wenn ein Objekt mehrmals in leicht abgewandelter Form in einer Szene vorkommt. Ein Hocker z.B. kann sich aus einer Sitzfläche und vier Beinen zusammensetzten. Wird ein Bein durch einen Prototypen beschrieben und ist zudem in seiner Farbe variabel, muß so nicht jedes einzelne Bein gesondert definiert werden. Ein anderer Mechanismus, mit dem sich Objekte in einer Szene wiederverwenden lassen, ist das DEF/USE Konzept. Ein Objekt wird dabei über seinen Namen mit dem Schlüsselword DEF definiert, wodurch das Objekt in der weiteren Szene referenzierbar ist. Mit USE kann nun dieser Knoten beliebig oft in der Szene wiedervewendet werden. Da durch USE genau der Knoten verwendet wird, der durch DEF festgelegt wurde, können so keine Variationen eingebaut werden. Wenn in dem Hockerbeispiel die Beine mit diesem Konzept beschrieben werden, können nur Hocker mit gleicher Beinfarbe enstehen. In VRML wird ein Prototyp mit dem Knoten PROTO und in X3D mit ProtoDeclare definiert. Das Konzept ist in beiden Fällen identisch und wird lediglich mit einer unterschiedlichen Syntax realisiert. Im Weiteren wird deshalb nur auf die X3D-Syntax eingegangen. Bevor man ein eigenes Objekt in der Szene verwenden kann, muß der genaue Aufbau festgelegt sein. Der wird in dem schon erwähnten Knoten ProtoDeclare definiert. Die weitere Gestaltung eines Prototypen ist in zwei Bereiche unterteilt. Im Deklarationsteil, der durch den Knoten ProtoInterface definiert wird, werden die verschiedenen Datenfelder des Prototypen festgelegt, wobei beliebig viele Felder angelegt werden können. Im anschließenden Definitionsteil werden die eigentlichen Eigenschaften des Prototypen festgelegt. Dies geschieht mit dem Knoten ProtoBody. Dabei werden die Werte aus dem Deklarationsteil genutzt, um das genaue Aussehen festzulegen. Indem den Datenfeldern bei der Instanziierung unterschiedliche Werte zugewiesen werden, lassen sich unterschiedliche Instanzen eines Prototypen erzeugen.

Deklaration eines Prototypen
 <ProtoDeclare name="Ball">
    <ProtoInterface>
      <field accessType="inputOutput" name="translation"
          type="SFVec3f"/>
      <field accessType="initializeOnly" name="radius"
          type="SFFloat"/>
      <field accessType="inputOutput" name="color"
          type="SFColor"/>
    </ProtoInterface>
    <ProtoBody>
      <Transform DEF="s_transform">
        <IS>
          <connect nodeField="translation"
              protoField="translation"/>
        </IS>
        <Shape>
          <Sphere DEF="sphere">
            <IS>
              <connect nodeField="radius" protoField="radius"/>
            </IS>
          </Sphere>
          <Appearance>
            <Material DEF="s_mat">
              <IS>
                <connect nodeField="diffuseColor"
                    protoField="color"/>
              </IS>
            </Material>
          </Appearance>
        </Shape>
      </Transform>
    </ProtoBody>
  </ProtoDeclare>

Im Quellcode 5.4 ist das Beispiel eines Prototypen zu sehen, in dem eine Kugel über mehrere Parameter definiert werden kann. Zunächst wird im Knoten ProtoDeclare der Bezeichner des neuen Objektes angegeben, in diesem Fall der Name  ``Ball``. Im darauffolgenden Deklarationsteil werden drei Datenfelder definiert. Das erste Datenfeld hat den Namen translation, den Feldtyp inputOutput und den Datentyp SFVec3f. Der Aufbau der anderen Datenfelder ist ähnlich.
Im Definitionsteil wird nun das eigentliche Objekt beschrieben. In diesem Fall ist es nahezu identisch zu dem Beispiel aus Quellcode 5.2. Der einzige Unterschied besteht darin, daß Datenfelder bestimmter Knoten im ProtoBody mit den Datenfeldern des ProtoInterface verbunden sind. Dies wird mit mehreren connect-Knoten realisiert, die jeweils in einem IS-Knoten definiert werden. Dadurch weist man den Datenfeldern automatisch die Werte zu, die man bei der Instanziierung des Prototypen angibt. Auf diese Weise werden hier dem Ball-Objekt der Farbwert, die Radiusangabe und die genauen Weltkoordinaten übergeben.
Eine Instanz des Objektes wird mit dem Knoten ProtoInstance erzeugt, wie im Quellcode 5.5 als Beispiel zu sehen ist. Dabei erhält das Objekt über das Datenfeld name die Informationen der Deklaration. Die einzelnen Datenfelder werden dann noch mit den Knoten fieldValue initialisiert.

Initiierung eines Prototypen
  <ProtoInstance name="Ball">
    <fieldValue name="translation" value="10 0 0"/>
    <fieldValue name="radius" value="2"/>
    <fieldValue name="color" value="1 0 0"/>
  </ProtoInstance>


next up previous contents
Nächste Seite: X3D-Edit Aufwärts: 3D-Beschreibungssprachen Vorherige Seite: Sensoren   Inhalt
Oliver Krone 2003-04-28