07.12.2012 Aufrufe

Java 3D Interaktion und Animation Java 3D Behavior ...

Java 3D Interaktion und Animation Java 3D Behavior ...

Java 3D Interaktion und Animation Java 3D Behavior ...

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

<strong>Java</strong> <strong>3D</strong><br />

<strong>Interaktion</strong> <strong>und</strong> <strong>Animation</strong><br />

In <strong>Java</strong><strong>3D</strong> werden <strong>Interaktion</strong> <strong>und</strong> <strong>Animation</strong> mittels<br />

Verhalten-Objekten (<strong>Behavior</strong> objects) realisiert.<br />

Als <strong>Interaktion</strong> werden Aktionen bezeichnet, die direkt<br />

auf eine Benutzeraktion zurückzuführen sind, wie z.B.<br />

Mausbewegung oder Tastendruck.<br />

<strong>Animation</strong>en sind alle Aktionen, die aufgr<strong>und</strong> anderer<br />

Stimulationen auftreten, z.B. zeitgesteuert, LODspezifisch<br />

oder aufgr<strong>und</strong> anderer Merkmale.<br />

© H. Hansen FHTW-Berlin 1999<br />

<strong>Java</strong><strong>3D</strong><br />

Definition von <strong>Behavior</strong>klassen<br />

• Definition (mindestens) eines Konstruktors<br />

• Setzen einer Referenz auf das zu verändernde<br />

Objekt<br />

• Redefinieren von<br />

public void initialization()<br />

Starten des Triggermechanismus<br />

• Redefinieren von<br />

public void processStimulus()<br />

Decodieren der Triggerbedingung<br />

Reagieren auf den Trigger<br />

Erneutes Starten des Triggers<br />

Häufige Fehlerquellen<br />

Vergessen des Starten des Triggers in der Funktion<br />

initialization()<br />

Keine Rückkehr aus der Funktion<br />

processStimulus()<br />

© H. Hansen FHTW-Berlin 1999<br />

1/15<br />

3/15<br />

<strong>Behavior</strong><br />

<strong>Java</strong> <strong>3D</strong><br />

<strong>Behavior</strong> Klassenstruktur<br />

Billboard<br />

Interpolator<br />

LOD<br />

DistanceLOD<br />

KeyNavigator<strong>Behavior</strong><br />

Mouse<strong>Behavior</strong><br />

PickMouse<strong>Behavior</strong><br />

NodeComponent<br />

RotPosPathScaleI...<br />

© H. Hansen FHTW-Berlin 1999<br />

.<br />

.<br />

.<br />

MouseRotate<br />

MouseTranslate<br />

MouseZoom<br />

public class Simple<strong>Behavior</strong><br />

extends <strong>Behavior</strong><br />

{<br />

private TransformGroup targetTG ;<br />

private Transform<strong>3D</strong> rotation =<br />

new Transform<strong>3D</strong>() ;<br />

private double angle = 0.0 ;<br />

PickRotate<strong>Behavior</strong><br />

PickTranslate<strong>Behavior</strong><br />

PickZoom<strong>Behavior</strong><br />

<strong>Java</strong><strong>3D</strong><br />

Definition von <strong>Behavior</strong>klassen<br />

Simple<strong>Behavior</strong>(TransformGroup targetTG)<br />

{ this.targetTG = targetTG ; }<br />

public void initialize()<br />

{ this.wakeupOn(new WakeupOnAWTEvent(<br />

KeyEvent.KEY_PRESSED));<br />

}<br />

public void processStimulus(<br />

Enumeration criteria)<br />

{ angle += 0.1 ;<br />

rotation.rotY(angle) ;<br />

targetTG.setTransform(rotation) ;<br />

this.wakeupOn(new WakeupOnAWTEvent(<br />

KeyEvent.KEY_PRESSED));<br />

}<br />

} // end of class Simple<strong>Behavior</strong><br />

© H. Hansen FHTW-Berlin 1999<br />

2/15<br />

4/15


<strong>Java</strong><strong>3D</strong><br />

Verwenden eines <strong>Behavior</strong>s<br />

public BranchGroup createSceneGraph()<br />

{ // Create the root of the branch graph<br />

BranchGroup objRoot = new BranchGroup() ;<br />

TransformGroup objRotate<br />

= new TransformGroup();<br />

objRotate.setCapability(<br />

TransformGroup.ALLOW_TRANSFORM_WRITE) ;<br />

objRoot.addChild(objRotate) ;<br />

objRotate.addChild(new ColorCube(0.4)) ;<br />

Simple<strong>Behavior</strong> myRotation<strong>Behavior</strong><br />

= new Simple<strong>Behavior</strong>(objRotate) ;<br />

myRotation<strong>Behavior</strong>.setSchedulingBo<strong>und</strong>s(<br />

new Bo<strong>und</strong>ingSphere()) ;<br />

objRoot.addChild(myRotation<strong>Behavior</strong>) ;<br />

// Let <strong>Java</strong> <strong>3D</strong> perform optimizations on<br />

// this scene graph.<br />

objRoot.compile();<br />

return objRoot;<br />

} // end of CreateSceneGraph method of<br />

// Simple<strong>Behavior</strong>App<br />

© H. Hansen FHTW-Berlin 1999<br />

java.lang.Object<br />

javax.media.j3d.WakeupCondition<br />

WakeupOr<br />

WakeupAnd<br />

WakeupAndOfOrs<br />

WakeupOrOfAnds<br />

WakeupCriterion<br />

<strong>Java</strong><strong>3D</strong><br />

Trigger<br />

*) Dies sind alles Unterklassen von WakeupCriterion.<br />

© H. Hansen FHTW-Berlin 1999<br />

5/15<br />

WakeupOnActivation *<br />

WakeupOnAWTEvent<br />

WakeupOn<strong>Behavior</strong>Post<br />

WakeupOnCollisionEntry<br />

WakeupOnCollisionExit<br />

WakeupOnCollisionMovement<br />

WakeuoOnDeactivation<br />

WakeupOnElapsedFrames<br />

WakeupOnElapsedTime<br />

WakeupOnSensorEntry<br />

WakeupOnSensorExit<br />

WakeupOnTransformChange<br />

WakeupOnViewPlatformEntry<br />

WakeupOnViewPlatformExit<br />

7/15<br />

<strong>Java</strong><strong>3D</strong><br />

Verwenden eines <strong>Behavior</strong>s<br />

Häufige Fehlerquellen<br />

Falsche Angaben der "scheduling bo<strong>und</strong>s" zum<br />

Verhalten<br />

Vergessen des Hinzufügens des Verhaltens zum<br />

Szenengraphen<br />

© H. Hansen FHTW-Berlin 1999<br />

<strong>Java</strong><strong>3D</strong><br />

Erzeugen von <strong>Animation</strong>en<br />

In <strong>Java</strong><strong>3D</strong> ist "<strong>Behavior</strong>" eine Klasse zum Definieren<br />

von <strong>Animation</strong>en oder <strong>Interaktion</strong>en mit visuellen<br />

Objekten. Mit Hilfe von <strong>Behavior</strong>-Objekten kann jede<br />

Eigenschaft eines visuellen Objekts zur Laufzeit des<br />

Programms verändert werden.<br />

Als <strong>Animation</strong> wird ein Verhalten dann bezeichnet,<br />

wenn es (zeitlich) programmgesteuert ist, als <strong>Interaktion</strong><br />

dann, wenn es durch einen Programmbenutzer<br />

ausgelöst wird.<br />

Jedes visuelle Objekt in einem virtuellen Universum<br />

kann ein oder mehrere Verhalten (<strong>Behavior</strong>-Objekte)<br />

besitzen.<br />

© H. Hansen FHTW-Berlin 1999<br />

6/15<br />

8/15


<strong>Java</strong><strong>3D</strong><br />

Erzeugen von <strong>Animation</strong>en<br />

Notwendige Programmschritte zum Erzeugen von<br />

<strong>Behavior</strong>-Objekten:<br />

1. Erzeugen eines TransformGroup-Objekts<br />

1.1. Setzen der ALLOW_TRANFORM_WRITE Fähigkeit<br />

2. Erzeugen eines Alpha-Objekts<br />

2.1. Setzen der Zeitparameter des Alpha-Objekts<br />

3. Erzeugen eines Interpolator-Objekts<br />

3.1. Setzen der Verweise auf das TransformGroup- <strong>und</strong> das<br />

Alpha-Objekt<br />

3.2. Anpassen der <strong>Behavior</strong>-Parameter<br />

4. Definieren der Planungsregion<br />

4.1. Setzen der Planungsregion für das Behaviour<br />

5. Einfügen des Behaviours als Kind des Transform-<br />

Group-Objekts<br />

© H. Hansen FHTW-Berlin 2000<br />

<strong>Java</strong><strong>3D</strong><br />

Anordnen von <strong>Behavior</strong>s (2/2)<br />

Entscheidungshilfen für das Anordnen:<br />

1. Einfluß auf die "scheduling bo<strong>und</strong>s"<br />

2. Wartung des Programmcodes<br />

Bei der ersten Anordnung kann es zu Problemen<br />

kommen, wenn das <strong>3D</strong>-Objekt interaktiv manipulierbar<br />

ist. Da das <strong>Behavior</strong> ein eigenes, von ihm<br />

referenziertes, "scheduling bo<strong>und</strong>s"-Objekt erzeugt,<br />

könnte bei einer Bewegung des Objekts dieses aus<br />

dem Sichtbarkeitsbereich entschwinden, da auf das<br />

<strong>3D</strong>-Objekte noch zusätzliche Transformationen<br />

angewendet werden (aus dem Knoten TG), die auf<br />

das <strong>Behavior</strong>-Objekt nicht angewendet werden.<br />

Die zweite Anordnung vermeidet dieses Problem.<br />

Schlecht entworfene <strong>Behavior</strong>s können die<br />

Darstellung von Szenen sehr negativ beeinflussen.<br />

Vermeiden sollte man auf jeden Fall:<br />

3. Vergeuden von Arbeitsspeicher durch unnötiges<br />

Erzeugen von neuen Objekten<br />

4. Unnötiges Aktivieren von Triggerbedingungen<br />

© H. Hansen FHTW-Berlin 2000<br />

9/15<br />

11/15<br />

<strong>Java</strong><strong>3D</strong><br />

Anordnen von <strong>Behavior</strong>s (1/2)<br />

Verhaltensobjekte können auf unterschiedliche Weise<br />

in Szenengraphen angeordnet werden, wie die<br />

beiden folgenden Graphen zeigen.<br />

BG<br />

TG<br />

<strong>3D</strong>-Objekt<br />

BG<br />

TG<br />

<strong>3D</strong>-Objekt<br />

B<br />

B<br />

© H. Hansen FHTW-Berlin 2000<br />

KeyNavigator<strong>Behavior</strong><br />

Bedeutung der Tasten<br />

Taste Bewegung Bewegung mit Alt-Taste<br />

←<br />

→<br />

↑<br />

↓<br />

PgUp<br />

PgDn<br />

+<br />

-<br />

=<br />

<strong>Java</strong><strong>3D</strong><br />

fertige <strong>Behavior</strong>s<br />

nach links drehen nach links bewegen<br />

nach rechts drehen nach rechts bewegen<br />

vorwärts bewegen<br />

rückwärts bewegen<br />

nach oben drehen nach oben bewegen<br />

nach unten drehen nach unten bewegen<br />

zurück zum Ausgangspunkt<br />

vermindere Abstand<br />

der hinteren Clippingebene<br />

zurück zum Mittelpunkt<br />

des Virtuellen<br />

Universums<br />

© H. Hansen FHTW-Berlin 2000<br />

10/15<br />

12/15


<strong>Java</strong> <strong>3D</strong><br />

KeyNavigatorbehavior<br />

public BranchGroup createSceneGraph<br />

(SimpleUniverse su)<br />

{<br />

// Create the root of the branch graph<br />

TransformGroup vpTrans = null;<br />

BranchGroup objRoot = new BranchGroup();<br />

objRoot.addChild(createLand());<br />

// create other scene graph content<br />

vpTrans = su.getViewingPlatform().<br />

getViewPlatformTransform() ;<br />

translate.set( 0.0f, 0.3f, 0.0f) ;<br />

T<strong>3D</strong>.setTranslation(translate) ;<br />

vpTrans.setTransform(T<strong>3D</strong>);<br />

KeyNavigator<strong>Behavior</strong> keyNavBeh =<br />

new KeyNavigator<strong>Behavior</strong>(vpTrans) ;<br />

keyNavBeh.setSchedulingBo<strong>und</strong>s(<br />

new Bo<strong>und</strong>ingSphere(<br />

new Point3d(),1000.0)) ;<br />

objRoot.addChild(keyNavBeh) ;<br />

objRoot.compile() ;<br />

return objRoot ;<br />

} // end of CreateSceneGraph method of<br />

KeyNavigatorApp<br />

© H. Hansen FHTW-Berlin 2000<br />

<strong>Java</strong> <strong>3D</strong><br />

Objektauswahl<br />

Die standardmäßig implementierte Objektauswahl<br />

erfolgt durch Mausklick. Ausgewählt werden alle<br />

Objekte entlang einer Geraden vom Ort des Hotspots<br />

des Mauszeigers in die <strong>3D</strong>-Welt hinein.<br />

Da die Berechnung des (bzw. der) gewählten Objekte<br />

aufwendig ist, gibt es eine Reihe von Methoden, die<br />

helfen, Rechenzeit zu sparen.<br />

1. Nur Objekte, die durch Aufruf der Funktion<br />

setPickable(true) markiert wurden, können<br />

zur Laufzeit durch Mausklicks selektiert werden.<br />

2. Statt der Geometrie des Objektes kann auch<br />

seine umschriebene Grenze für das Berechnen<br />

der Auswahl verwendet werden. Dann muß<br />

USE_BOUNDS anstelle von USE_GEOMETRY als<br />

Konstante im entsprechenden Konstruktor<br />

angegeben werden.<br />

3. Es wird nur ein Teilgraph des Szenengraphen für<br />

Auswahloperationen verwendet.<br />

© H. Hansen FHTW-Berlin 2000<br />

13/15<br />

15/15<br />

Beschreibung der Mouse<strong>Behavior</strong>s<br />

Mouse-<br />

<strong>Behavior</strong>klasse<br />

<strong>Java</strong> <strong>3D</strong><br />

Mousebehaviors<br />

durchgeführte<br />

Bewegung des <strong>3D</strong>-<br />

Objekts<br />

MouseRotate visuelles Objekt an seinem<br />

Ort drehen<br />

MouseTranslate visuelles Objekt in einer zur<br />

Bildebene parallelen Ebene<br />

bewegen<br />

MouseZoom visuelles Objekt in einer zur<br />

Bildebene senkrechten<br />

Ebene bewegen<br />

Mouse<br />

Action<br />

linke Maustaste<br />

gedrückt<br />

beim Bewegen<br />

rechte Maustaste<br />

gedrückt<br />

beim Bewegen<br />

mittlere Maustaste<br />

gedrückt<br />

beim Bewegen<br />

© H. Hansen FHTW-Berlin 2000<br />

14/15

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!