Konzeptioneller Vergleich von VRML, Java3D und OpenGL hinsichtlich ihrer Eignung zur Erstellung von Animationen von Christian Stein
Übersicht Motivation / Grundlagen: Was ist OpenGL, Java3D und VRML? (incl. Beispiele) Wie sind die Animationsmodelle aufgebaut? Wo sind Unterschiede zwischen den Animations-Konzepten Das Resultat
Motivation Historische Entwicklung: Früher: 3D-Bild (starr/statisch) Heute: Virtuelle-Realität (VR): permanente Abbild-Erstellung, Interaktion und Dynamik der 3D-Objekte Animationen notwendig Hoher Aufwand für 3D-Bild-Berechnung Þ Minimierung der Neuberechnungen notwendig Gesucht: Ein Modell, daß Animationen effektiv realisiert Zwei Arten von Animation: Navigation / Interaktion Dynamik der 3D-Objekte
Was ist OpenGL, Java3D und VRML? Alle drei sind plattformübergreifende Schnittstellen OpenGL (Graphics Library): Low-Level-API es werden einzelne Abbilder von 3D-Szenen erstellt (CAD-Bereich) Java3D: 'Low-Level'-API, Neu (Final-Release vor 2 Tagen) Zur Erstellung von 'Virtueller Realität' (VR) geeignet (es werden mehrere Abbilder hintereinander erstellt) VRML (Virtual Reality Modeling Language): High-Level-'API', WWW-Bereich VR möglich
Beispiele für OpenGL, Java3D und VRML
OpenGL void CCubeView::DrawScene(void) { glTranslatef(0.0f, 0.0f, -m_fRadius); glRotatef(wAngleZ, 0.0f, 0.0f, 1.0f); wAngleZ += 5.0f; glBegin(GL_QUADS); glColor3f(1.0f, 0.0f, 1.0f); glVertex3f(-0.5f, 0.5f, 0.5f); glVertex3f(-0.5f, -0.5f, 0.5f); glVertex3f(0.5f, 0.5f, 0.5f); glVertex3f(0.5f, -0.5f, 0.5f); glEnd(); glFinish(); SwapBuffers(wglGetCurrentDC()); }
Java3D public BranchGroup createSceneGraph() { BranchGroup objRoot = new BranchGroup(); TransformGroup objTrans = new TransformGroup(); objRoot.addChild(objTrans); objTrans.addChild(new ColorCube(0.4)); objRoot.compile(); return objRoot; }
VRML #VRML V2.0 utf8 Transform { children [ Shape geometry Sphere { } appearance Appearance material Material { diffuseColor 0.8 0 0 } } ]
Das 'Animationsmodell' von OpenGL
OpenGL Alle Zwischendaten werden nach der Rastererung vergessen (Hauptaufwand der Berechnung ist davor L) Noch Operationen auf Pixelebene möglich, aber unhandlich
Das Animationsmodell von VRML
VRML Sensoren erzeugen Ereignisse Alle empfangen und senden, bzw. senden weiter Interpolatoren und Scripte berechnen neue Werte
Route-Mechanismus (VRML) ROUTE QuellKnoten.QuellVariable TO ZielKnoten.ZielVariable mehrere Verbindungen zu einer Variable mehrere Verbindungen von einer Variable Endlosschleifen nicht möglich, da pro Nachrichtenkette eine Variable nur einmal eine Nachricht senden kann
Sensoren und Interpolatoren (VRML) Sensoren ändern ihre Variablen anhand von Benutzereingaben oder Zeit Interpolatoren rechnen 'Zeit'-Werte in andere um, z.B. Translationen, Rotationen Interpolator-'Zeit'-Werte sind im [0,1] Intervall Interpolatoren können Teilintervalle unterschiedlich linear Interpolieren, z.B. [0, 0.5, 1] ® [5 0 0, 6 0 0, 8 0 0]
Script-Knoten - Struktur (VRML) { # Interface-Teil = Variablen # Script-Teil = Funktion die ausgeführt werden }
VRML-Browser Aufbau
Das Animationsmodell von Java3D
Java3D
Der Scheduler (Java3D) Bekommt von 'Verhalten'-Objekten (also auch von Interpolatoren) gesagt bei welchen Ereignissen sie aufgerufen werden sollen. Es wird zusätzlich eine Scheduleregion angegeben (Optimierung durch culling). Strukturen: volume/scheduling tree (Scheduleregionen) and/or tree (Ereigniskombination)
Interpolatoren (Java3D) Interpolatoren sind Klassen, die anhand von einer Aktivierungsfunktion Eigenschaften oder die Position von geometrische Objekte verändern. Die Aktivierungsfunktion bildet Zeitwerte in 4 Phasen in Werte zwischen 0 und 1 ab: Aufstieg, 1, Abstieg und 0. Die Steigung muß nicht konstant sein.
Verhalten-Klasse (Java3D) public class bspBehavior extends Behavior { // Variablendeklaration public bspBehavior(Parameter p) { // Variablen initialisieren } public void initialize() { wakeupOn(wakeupKriterium); } public void processStimulus(Enumeration criteria) // Die Handlung wakeupOn(wakeupKriterium); }
Unterschiede der Animations-Konzepte von Java3D und VRML
Verhaltens-Klasse vs. Script-Knoten Java3D: Eingebettet vs. VRML: Schnittstelle (d.h. bei VRML, Kommunikation zwischen zwei Threads) VRML-Script-Knoten: nur Werte-Berechnung, kein AWT (oder nur mit Tricks) Java3D besser, da sie in eine Programmier- sprache eingebettet ist
Ereignisse / Sensoren VRML: Sensoren sind fertige Werkzeuge Þ Wenig Programmieraufwand Java3D: Nur Benachrichtigung Þ Mehr Möglichkeiten Ähnliches Angebot an Interaktionsmöglichkeiten (Es fehlt in Java3D der Sichtbarkeit-Sensor)
Scheduleregionen und Bounding-Boxes Java3D: Scheduleregionen sind notwendig Þ Optimierung wird 'aufgezwungen' VRML: Bounding-Boxes können angegeben werden Sie existieren nicht für alle Knoten (dezentrale Regelung) Dieses Feature wird häufig übersehen
Scheduler vs. Route Kein direkter Vergleich möglich, da die Mechanismen unterschiedliche Aufgaben haben: Scheduler: 'Nur' Ereignisse werden weitergegeben Route: Variablen werden weitergegeben, es entsteht eine Nachrichtenkette Eine Variablen-Weitergabe kann auch Ereignis sein
Interpolatoren Ähnliches Angebot bei beiden Schnittstellen Java3D: Aktivierungsfunktion Þ Mehr Möglichkeiten (z.B. Pendelbewegung)
VRML-Browser in Java3D Es zeigt sich, daß einer Realisierung nichts im Wege steht und daß die Programmier-ung einfacher in Java3D ist als (direkt) in OpenGL.
Resultat des Animationsmodell-Vergleichs Java3D: Verhaltensklassen: können vererbt werden (Java ist OO) Einbettung in Programmiersprache Zentrale Konzepte (Scheduler) Nicht ganz so einfach zu benutzen, dafür für alles geeignet VRML: Umfassende Sensoren Einfach zu benutzen, aber nicht für jeden Gebrauch Schlechte Anbindung an Programmiersprachen Nicht alle Konzepte sind zentral OpenGL: keine Animations-Mechanismen