VRML "von Hand"

Eines der Vorteile von VRML ist die Tatsache, dass das Format eines VRML Files normiert und damit bekannt ist. Zusammen mit der Tatsache, dass VRML in leicht zu bearbeitbaren Textfiles abgespeichert werden, ergibt sich damit die Möglichkeit, VRML einfach "von Hand" mit einem Texteditor zu bearbeiten.

Dafür gibt es mehrere mögliche Gründe:

Fehlerkorrektur

Ein "beliebter" Fehler von Werkzeugen, die VRML-Files schreiben, ist das Problem mit dem Directorypfad von Bilddateien. Viele Werkzeuge benutzen einen absoluten Pfad (statt besser einen relativen Pfad), der spätestens dann nicht mehr stimmt, wenn die Dateien später auf einen Webserver übertragen werden.
Zur Erkl¨rung: ein absoluter Directorypfad enthält sämtliche Unterdirectories (z.B. /usr/home/wasweisich), während ein relativer Pfad nur den Pfad beschreibt, um von einem File zum nächsten zu kommen (z.B. ../wasweisich)).

Ein kleines Beispiel dazu finden Sie hier. In dieser Datei ist die folgende Bilddatei nicht sichtbar. Wenn Sie cosmoplayer als VRML-Browser benutzen, können sie sich die Fehlermeldung ansehen, indem sie die Taste "\" drücken.

Laden sie diese beiden Dateien zu sich herunter und versuchen Sie das Probelm mit einen Texteditor zu lösen.

Schlagen Sie in der Knotenliste des VRML-Standard unter "Appearance" nach, wonach Sie in dieser Textdatei suchen müssen und was sie ändern müssen.

Morphing mathematischer Flächen

Als nächstes ein Beispiel, das wenig geeignet scheint für viele mausorientierte Werkzeuge.

Eine Animation, bei der die Eckpunkte eines aus Einzelflächen zusammengesetzten Körpers bewegt werden, nennt man "Morphing". In einem Werkzeug wie z.B. cosmoworlds kann die Erstellung sehr aufwendig sein, da eine sehr grosse Anzahl von Eckpunkten dazu angefasst werden muss.

Eine Alternative dazu bildet die hier vorgestellte Vorgehensweise mit Hilfe eines Texteditors und des Programms tessel .

Tessel ist ein Programm, mit dessen Hilfe ein VRML1 File (oder auch einige andere weit verbreitete 3D Fileformate) aus einer mathematischen Formel (genauer: einer 2 dimensionalen Parametrisierung einer Oberfläche im 3 dimensionalen Raum) gewonnen werden kann. Für Architekten dürfte das vermutlich für die Berechnung von freitragenden Konstruktion wie das Münchener Olympiastadion interessant sein.

Ein Beispiel:
Die Datei eins.tess enthält eine Formel
parametric
map cartesian
uname u
vname v
urange -1 1 4 open
vrange -1 1 4 open
c1 u
c2 v
c3 u*u+v*v
colormode none
#set axes .true.
set zoom 2
vrml eins.vrml
endparametric

die ein Parabolid bescheibt, wobei nur 4*4=16 quadratischen Flächen gezeichnet werden.
Mit dem Befehl

tessel eins.tess

wird ein VRML1 File erzeugt, das sich mit Cosmoworlds in ein VRML2 File wandeln lässt.

Eine zweite Datei zwei.tess enthält eine ähnliche Formel

parametric
map cartesian
uname u
vname v
urange -1 1 4 open
vrange -1 1 4 open
c1 u
c2 v
c3 -abs(u)+abs(v)
colormode none
#set axes .true.
set zoom 2
vrml zwei.vrml
endparametric
Mit dem Befehl

tessel zwei.tess

wird ein VRML1 File erzeugt, das sich mit Cosmoworlds in ein VRML2 File wandeln lässt.

Wichtig in diesem Zusammenhang ist, dass die Anzahl und der Aufbau der einzelnen Polygone (hier Rechtecke) identisch ist. Das ist Voraussetzung für die Benutzung eines CoordinateInterpolator Knoten, der in VRML für Morphing benutzt wird.

Zum Beispiel sieht das von cosmoworlds nach vrml2/vrml97 gewandelt File "eins.vrml" so aus:

#VRML V2.0 utf8 CosmoWorlds V1.0

Group {
  children	Group {
    children	[
      NavigationInfo {
	avatarSize	0
      }
      Collision {
	children	Group {
	  children	Group {
	    children	Shape {
	      appearance	Appearance {
		material	DEF Def_Color Material {
		  diffuseColor	1 0 0
		}

	      }

	      geometry	IndexedFaceSet {
		coord	Coordinate {
		  point	[ -1 -1 2,
			    -1 -0.333333 1.11111,
			    -1 0.333333 1.11111,
			    -1 1 2,
			    -0.333333 -1 1.11111,
			    -0.333333 -0.333333 0.222222,
			    -0.333333 0.333333 0.222222,
			    -0.333333 1 1.11111,
			    0.333333 -1 1.11111,
			    0.333333 -0.333333 0.222222,
			    0.333333 0.333333 0.222222,
			    0.333333 1 1.11111,
			    1 -1 2,
			    1 -0.333333 1.11111,
			    1 0.333333 1.11111,
			    1 1 2 ]
		}

		coordIndex	[ 0, 4, 5, 1, -1, 1, 5, 6,
			  2, -1, 2, 6, 7, 3, -1, 4,
			  8, 9, 5, -1, 5, 9, 10, 6,
			  -1, 6, 10, 11, 7, -1, 8, 12,
			  13, 9, -1, 9, 13, 14, 10, -1,
			  10, 14, 15, 11, -1 ]
		solid	FALSE
		creaseAngle	0.5
	      }

	    }

	  }

	}

	collide	FALSE
      }
    ]
  }

}


Betrachten Sie den Abschnitt

              geometry  IndexedFaceSet {
                coord   Coordinate {
                  point [ -1 -1 2,
                            -1 -0.333333 1.11111,
                            -1 0.333333 1.11111,


"geometry IndexedFaceSet" bedeutet, dass es sich um einen Körper aus zusammengesetzen Einzelflächen handelt. "point" bedeutet die einzelnen Eckpunkte.
Das weiter unten folgende "coordIndex" gibt an, welche Punkte zusammen eine Einzelfläche bilden (der Punkt Nummer -1 bedeutet, dass eine Einzelfläche abgeschlossen ist).
Vergleichen Sie das jetzt mit der mit cosmoworlds nach VRML2/VRML97 gewandelten Datei von "zwei.tess". Sie stellen fest, dass sich nur die Positionen der einzelnen Eckpunkte unterscheiden.

Für Morphing ergibt sich folgendes Kochrezept:

#VRML V2.0 utf8

# Von hier 
# vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv

Group {
  children	Group {
    children	[
      NavigationInfo {
	avatarSize	0
      }
      Collision {
	children	Group {
	  children	Group {
	    children	Shape {
	      appearance	Appearance {
		material	DEF Def_Color Material {
		  diffuseColor	1 0 0
		}

	      }

	      geometry	IndexedFaceSet {
		coord	
# hier einen Namen fuer Routes einfuegen
               DEF COORD Coordinate {
		  point	[ -1 -1 2,
			    -1 -0.333333 1.11111,
			    -1 0.333333 1.11111,
			    -1 1 2,
			    -0.333333 -1 1.11111,
			    -0.333333 -0.333333 0.222222,
			    -0.333333 0.333333 0.222222,
			    -0.333333 1 1.11111,
			    0.333333 -1 1.11111,
			    0.333333 -0.333333 0.222222,
			    0.333333 0.333333 0.222222,
			    0.333333 1 1.11111,
			    1 -1 2,
			    1 -0.333333 1.11111,
			    1 0.333333 1.11111,
			    1 1 2 ]
		}

		coordIndex	[ 0, 4, 5, 1, -1, 1, 5, 6,
			  2, -1, 2, 6, 7, 3, -1, 4,
			  8, 9, 5, -1, 5, 9, 10, 6,
			  -1, 6, 10, 11, 7, -1, 8, 12,
			  13, 9, -1, 9, 13, 14, 10, -1,
			  10, 14, 15, 11, -1 ]
		solid	FALSE
		creaseAngle	0.5
	      }

	    }

	  }

	}

	collide	FALSE
      }
    ]
  }

}

# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
# bis hier die Datei eins.vrml (+ Einfuegen von "DEF COORD")

# Definition des CoordinateInterpolator

DEF INTERPOL CoordinateInterpolator { 
 key           [0,1]
keyValue      [
#points aus "eins.vrml"
		            -1 -1 2,
			    -1 -0.333333 1.11111,
			    -1 0.333333 1.11111,
			    -1 1 2,
			    -0.333333 -1 1.11111,
			    -0.333333 -0.333333 0.222222,
			    -0.333333 0.333333 0.222222,
			    -0.333333 1 1.11111,
			    0.333333 -1 1.11111,
			    0.333333 -0.333333 0.222222,
			    0.333333 0.333333 0.222222,
			    0.333333 1 1.11111,
			    1 -1 2,
			    1 -0.333333 1.11111,
			    1 0.333333 1.11111,
			    1 1 2 
#points aus "zwei.vrml"
                            -1 -1 0,
			    -1 -0.333333 -0.666667,
			    -1 0.333333 -0.666667,
			    -1 1 0,
			    -0.333333 -1 0.666667,
			    -0.333333 -0.333333 0,
			    -0.333333 0.333333 0,
			    -0.333333 1 0.666667,
			    0.333333 -1 0.666667,
			    0.333333 -0.333333 0,
			    0.333333 0.333333 0,
			    0.333333 1 0.666667,
			    1 -1 0,
			    1 -0.333333 -0.666667,
			    1 0.333333 -0.666667,
			    1 1 0 
        ]
    }

# Timersensor

    DEF TIMER TimeSensor {
      cycleInterval     10
      loop      TRUE
    }

# noetige Routes

ROUTE INTERPOL.value_changed TO COORD.set_point
ROUTE TIMER.fraction_changed TO INTERPOL.set_fraction



Benutzen Sie dieses Kochrezept, um Morphing mit Hilfe von einer grösseren Zahl Einzelflächen (Sie müssen die Zahl 4 in den Tessel Eingabefiles erhöhen) und anderen mathematischen Formeln zu machen.
Die benötigten Mathematischen Formeln finden Sie z.B. hier und hier