animationen in java 3d eine seminararbeit von gerd mühlinghaus
TRANSCRIPT
Animationen in Java 3D
Eine Seminararbeit von
Gerd Mühlinghaus
Inhalt dieses Vortrags
Grundlagen der Animation in Java 3D Animationsarten Alpha Objekt Interpolatoren Billboard Level of Detail Morph
Animation ≠ Interaktion
Interaktion
Benutzereingaben verändern ein visuelles Objekt im virtuellen Raum.
Animation
Animation nennt man Veränderungen in der virtuellen Welt die ohne Benutzerinteraktion stattfinden.
schauen wir uns dieses Beispiel einmal an
Animationsarten
Zeitbasierte Animation
Ein Alpha Objekt bestimmt den Zeitpunkt der Veränderung eines visuellen Objektes durch einen Interpolator.
Blickwinkelbezogene Animation
Im Gegensatz dazu steuern „Billboard“ und „Level of Detail“ eine Animation über den Blickwinkel des Betrachters.
Klassenhierarchie der Behavior Animationsklassen
Erstellen einer zeitbasierten Animation in Java 3D
Erstellen eines Zielobjektes mit seinen Eigenschaften.
Erstellen eines Alpha Objektes.
Erstellen eines Interpolator Objektes mit Verweis auf Alpha und Ziel Objekt.
Spezifizieren des Wirkungsbereichs (SchedulingBound) des Interpolator Objektes.
Einfügen des Interpolator Objekts in den Szenegraphen.
Erstellen eines Zielobjektes
// Erstellen des Zielobjektes (hier beispielhaft ein TransformGroup Objekt)
TransformGroup objSpin = new TransformGroup();
// mit seinen Eigenschaften (Capabilities).
// ALLOW_TRANSFORM_WRITE bedeutet, dass die Parameter des
// Zielobjekts verändert werden können.
objSpin.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
Eigenschaften einesAlpha Objekts
Startzeit ist immer die Systemstartzeit
alle Alpha Objekte haben die gleiche Startzeit
Interpolatoren beginnen alle synchron Beginn der Startzeit kann verzögert werden, durch
Aktivierungszeit (TriggerTime)Zeitpunkt nach der Startzeit, an dem die Operationen des Alpha
Objektes beginnen sollen.
Phasenverzögerungszeit (PhaseDelayDuration)Zeitdauer nach der Aktivierungszeit bis der Zyklus der
Wellenform beginnt.
4 Phasen der Alpha Wellenform
Startzeit des Programms(1) increasingAlphaDuration(4)
Aktivierungszeit(2) alphaAtOneDuration(5)
Phasenverzögerungszeit(3) decreasingAlphaDuration(6)
alphaAtZeroDuration(7)
Alpha Objekt Zeitgeber einer Animation
Erstellen einesAlpha Objekts
Konstruktor:
Alpha(int loopCount, long increasingAlphaDuration)
Beispiel:Alpha alpha = new Alpha (-1, 60000);
periodisches Wiederholen Periodendauer 1 Minute
Was machen denn diese Interpolatoren?
Interpolatoren legen fest, welches Objekt auf welche Art animiert werden soll.
Vordefinierte Behavier Klassen
(es können auch eigene erstellt werden). Alpha Objekt bestimmt wann die Interpolatoren ihren
Einsatz haben. Sie werden als Kind ihres Ziel Objektes im
Szenengraph eingefügt.
Achtung die Interpolatoren haben unterschiedliche Zielobjekte!
Erstellen eines Interpolators
// Einfacher Konstruktor mit Alpha und Zielobjekt.
Interpolator(Alpha alpha, target)
// Interpolatoren können auch gleich mit ihren spezifischen Eigenschaften
// erstellt werden. Hier am Beispiel eines RotationInterpolators.
RotationInterpolator (Alpha alpha, TransformGroup target,
Transform3D axisOfRotation, float minimumAngle, float maximumAngle)
// Konkretes Beispiel: Erstellen eines Interpolator Objektes mit Verweis auf
// Alpha und Ziel Objekt;
// mit der Standardeinstellung: volle Drehung um die y-Achse.
RotationInterpolator rotInt = new RotationInterpolator(alpha, objSpin);
Interpolatoren
Interpolator ändert
ColorInterpolator Farbe
PositionInterpolator Position
RotationInterpolator Rotation
ScaleInterpolator Größe
SwitchValueInterpolator Aussehen
TransparencyInterpolator Transparenz
Spezifizieren des Wirkungsbereichs und Einfügen in den Szenengraphen
// Aus Performancegründen muss ein Wirkungsbereich festgelegt werden.
// Außerdem sind Interpolatoren nur in diesem aktiv.
// Hier beispielhaft für den vorhin erstellten RotationInterpolator.
rotInt.setSchedulingBounds(new BoundingSphere());
// Zuletzt wird der Interpolator in den Szenengraph eingefügt.
objRoot.addChild(rotInt);
drehen wir doch einfach mal unsere Uhr um die y-Achse
Beispiel eines RotationInterpolators
public BranchGroup createSceneGraph() {// Erstellen der Wurzel des branch graph.BranchGroup objRoot = new BranchGroup();
// Erstellen des Zielobjektes (hier ein TransformGroup Objekt).TransformGroup objSpin = new TransformGroup();
// mit seinen Eigenschaften. ALLOW_TRANSFORM_WRITE bedeutet,// dass die Parameter des Zielobjekts verändert werden können.objSpin.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
// Erstellen eines Alpha Objekts// das sich kontinuierlich, mit einer Periode von 1 Minute, dreht.Alpha alpha = new Alpha (-1, 60000);
Beispiel eines RotationInterpolators
// Erstellen eines Interpolator Objektes mit Verweis auf Alpha und // Ziel Objekt; mit der Standardeinstellung: volle Drehung um die // y-Achse.RotationInterpolator rotInt = new RotationInterpolator(alpha, objSpin);
// Festlegen des Wirkungsbereichs.rotInt.setSchedulingBounds(new BoundingSphere());
objRoot.addChild(objSpin); objSpin.addChild(new Clock()); // Einfügen des Interpolator Objekts in den
Szenegraphen. objRoot.addChild(rotInt);
objRoot.compile(); return objRoot;}
Blickwinkelbezogene Animation
Billboard KlasseDreht 2D Bilder so, dass diese immer dem Betrachter zugewandt sind. So können 2D Objekte ihre 3D Pentands ersetzen.
Ersparnis von Rechenzeit!
Level of Detail KlasseJe weiter die Entfernung zu einem visuellen Objekt, je weniger Details beim Rendern. Ersparnis von Rechenzeit
OrientatedShape3D KlasseSoll in Zukunft die Billboard Klasse ersetzen.
Ermöglicht mehr als einen Blickwinkel auf die Objekte.
Stammt nicht von der Behavior sondern von der Shape3D Klasse ab.
Interpolation von Geometrie Die Morph Klasse
animiert komplette GeometryArray Objekte keine Behavior, sondern eine Node Klasse jede Geometrie kann in eine andere umgewandelt werden
Objekte müssen der gleichen Klasse abstammen Objekte müssen die gleiche Anzahl an Polygonen
besitzen natürlich können auch visuelle Objekte animiert werden Anwendung nicht sehr komplex, aber benötigt Behavior Objekt um Animation oder Interakion zu
ermöglichen
Erstellen einerMorph Animation
Erstellen einer eigenen Behavior Klasse zum Ermöglichen der Animation.
Erstellen eines Arrays mit GeometryArray Objekten.
Erstellen eines Morph Objektes mit ALLOW_WEIGHTS_WRITE Eigenschaft.
Einfügen des Morph Objekts in den Szenegraphen.
Beispiel einerMorph Animation
Erstellen der MorphBehavior Klasse.
public class MorphBehavior extends Behavior{
private Morph targetMorph; private Alpha Alpha;
// Da in diesem Beispiel 4 Schlüsselbilder verwendet werden, muss das // GeometryArray auch 4 Einträge enthalten. private double[] weights = {0, 0, 0, 0}; private WakeupCondition trigger = new WakeupOnElapsedFrames(0);
// Erstellen der MorphBehavior MorphBehavior(Morph targetMorph, Alpha Alpha){ this.targetMorph = targetMorph; this.alpha = Alpha; }
Beispiel einerMorph Animation
public void initialize(){ // Festlegen der initial wakeup condition. this.wakeupOn(trigger); }
public void processStimulus(Enumeration criteria){ // Initialisieren des Gewichte Arrays. weights[0] = 0; weights[1] = 0; weights[2] = 0; weights[3] = 0;
// Ändern der Gewichte in Abhängigkeit von Alpha. float alphaValue = 4f * alpha.value(); int alphaIndex = (int) alphaValue; weights[alphaIndex] = (double) alphaValue -
(double)alphaIndex; if(alphaIndex < 3) weights[alphaIndex + 1] = 1.0 - weights[alphaIndex]; else weights[0] = 1.0 - weights[alphaIndex];
Beispiel einerMorph Animation
weights[0] = 1.0 - weights[alphaIndex];
targetMorph.setWeights(weights);
this.wakeupOn(trigger); //Setzen der nächsten wakeup condition. }} // Ende der MorphBehavior Klasse.
Erstellen eines Arrays mit GeometryArray Objekten.
Erstellen eines Morph Objektes.
Einfügen des Morph Objekts in den Szenegraphen.
Beispiel einerMorph Animation
public BranchGroup createSceneGraph() {// Erstellen der Wurzel des branch graph.
BranchGroup objRoot = new BranchGroup();
Transform3D t3d = new Transform3D(); t3d.set(new Vector3f(0f, -0.5f, 0f)); TransformGroup translate = new TransformGroup(t3d);
// Erstellen eines Arrays mit GeometryArray Objekten. GeometryArray[] geomArray = new GeometryArray[4]; geomArray[0] = createGeomArray0(); geomArray[1] = createGeomArray1(); geomArray[2] = createGeomArray2(); geomArray[3] = createGeomArray3();
// Erstellen eines Morph Objektes mit ALLOW_WEIGHTS_WRITE.
Morph morphObj = new Morph(geomArray); morphObj.setCapability(Morph.ALLOW_WEIGHTS_WRITE);
Beispiel einerMorph Animation
// Erstellen eines Alpha Objekts. Alpha Alpha = new Alpha(-1, 2000); // continuous 2 sec. period alpha.setIncreasingAlphaRampDuration(100);
// Erstellen der Morph Behavior MorphBehavior morphBehav = new MorphBehavior(morphObj,
Alpha); morphBehav.setSchedulingBounds(new BoundingSphere());
// Einfügen des Morph Objekts in den Szenegraphen. objRoot.addChild(translate); translate.addChild(morphObj); objRoot.addChild(morphBehav);
return objRoot;} // Ende der CreateSceneGraph Methode der MorphApp.
Literatur
Bouvier, D. J.:
Getting Started with the Java 3D™ API - Chapter 5, Sun Tutorial Version 1.5 (Java 3D API v 1.1.2)
Haller, M.:Java 3D Teil 6