© Prof. Dr. H. Gläser, Graphische Datenverarbeitung Benutzer Interaktion Benutzer Interaktion (interaction): die virtuelle Welt reagiert auf Benutzer Eingaben.

Slides:



Advertisements
Ähnliche Präsentationen
Software Engeniering II
Advertisements

Konzeptioneller Vergleich von VRML, Java3D und OpenGL hinsichtlich ihrer Eignung zur Erstellung von Animationen von Christian Stein.
Animation in Java 3D Ausarbeitung im Seminar Java 3D
Collision Detection in Java3D Hristo Matev WS 02/03.
Eine Seminararbeit von Gerd Mühlinghaus
DVG Einfache Klassen Einfache Klassen. DVG Einfache Klassen 2 Strukturen Beispiel: Personendaten bestehen aus –String name –String vorname.
Java3D Einfacher scene graph View branch graph BG Shape3D Knoten S
Application Programming Interface Graphische Datenverarbeitung
Geometrie Programmierung beginnend bei 0 ist
Kritische Betrachtung
Abstrakte Klassen HS Merseburg (FH) WS 06/07.
Ausnahmen HS Merseburg (FH) WS 06/07.
Threads Richard Göbel.
Java: Objektorientierte Programmierung
FH-Hof Interaktion Richard Göbel. FH-Hof Interaktion mit der Klasse Behavior Behavior-Objekte sind Knoten des Szenengraphen. Behavior-Objekte werden durch.
Java: Dynamische Datentypen
Einführung in die Programmierung von 3D-Grafiken Basis ist Java3D
Indirekte Adressierung
FH-Hof Automatisches Erzeugen von Geometrie Richard Göbel.
FH-Hof Animation - Teil 1 Richard Göbel. FH-Hof Themen Darstellung der Geometrie ändern (Transformation, Appearance, etc.) Geometrie ändern (Morphing)
FH-Hof Interaktion Richard Göbel. FH-Hof Interaktion mit der Klasse Behavior Behavior-Objekte sind Knoten des Szenengraphen. Behavior-Objekte werden durch.
FH-Hof Java3D - Grundlagen Richard Göbel. FH-Hof Java3D Konzept Erzeugung eines Szenengraphen als virtuelle Welt Darstellung der virtuellen Welt mit Hilfe.
MVC.
Wie überwacht man Objekte im "Alltag" ?. Indem man "Wanzen" an diese anbringt.
Ein Beispiel in Java.
Konstruktoren.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (05 – Elementare Datenstrukturen) Prof. Th. Ottmann.
Informatik II, SS 2008 Algorithmen und Datenstrukturen Vorlesung 6 Prof. Dr. Thomas Ottmann Algorithmen & Datenstrukturen, Institut für Informatik Fakultät.
Benötigte Applets Startseite: in HTML-Format Applet auf der Startseite Das Applet, das auf der Startseite geladen wird, wird die vier Buttons und die eine.
Einführung in die OOP in Java
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik I Vorlesung Listen-
Programmieren mit JAVA
Programmieren mit JAVA
Vererbung Spezialisierung von Klassen in JAVA möglich durch
PRJ 2007/1 Stefan Dissmann Motivation Problem: gleiche Datenstrukturen werden für verschiedene Objekte gebraucht: z.B. Listen von Studierenden, Kunden,
PKJ 2005/1 Stefan Dissmann Ausblick Es fehlen noch: Möglichkeiten zum Strukturieren größerer Programme Umgang mit variabler Zahl von Elementen Umgang mit.
PKJ 2005/1 Stefan Dissmann Rückblick auf 2005 Was zuletzt in 2005 vorgestellt wurde: Klassen mit Attributen, Methoden und Konstruktoren Referenzen auf.
PKJ 2005/1 Stefan Dissmann Klassenhierarchie Person Kunde Goldkunde Lieferant Object.
1DVG3 - Eventbehandlung Eventbehandlung. DVG3 - Eventbehandlung 2 Events Events sind externe Ereignisse, die parallel zum normalen Programmablauf auftreten.
DVG Interfaces. DVG mehrfache Vererbung 4 Mehrfache Vererbung ist die Ableitung einer Klassen von mehreren anderen Klassen. –farbigerPunkt.
07-GraphischeObjekte Graphische Objekte in EMMA301Paint.
Abstrakte Klassen, Interface
DVG Klassen und Objekte
DVG Einfache Klassen 1 Einfache Klassen. 2DVG Einfache KlassenStrukturen Beispiel: Personendaten bestehen aus String name String name.
EDV Parallelprogrammierung1 Parallelprogrammierung mit JAVA.
Wir müssen also überlegen: Implementierung der Knoten, Implementierung der Kanten, daraus: Implementierung des Graphen insgesamt. Annahme: die Knoteninhalte.
© 2004 Pohlig - Taulien Swing Ereignissteuerung. © 2004 Pohlig - Taulien GK Informatik mit Java 2 Auf Button-Klick reagieren.
Informatikunterricht mit Java
FH-Hof Konfiguration eines Universums Richard Göbel.
Seite 1 Interface - Konzept Ein Interface führt einen neuen Datentyp ein: interface Frau {... } Das Interface enthält Deklarationen ( keine Definitionen.
PRJ 2007/1 Stefan Dissmann Verkettete datenstruktur: Liste Problem: Liste, die eine beliebige Zahl von Elementen verwaltet Operationen: Erzeugen, Anfügen,
IT2 – WS 2005/20061Oct 10, 2005 Externes Verhalten – Quelltext (source code) Durch Aufrufe der Konstruktoren und Methoden kann das externe Verhalten (=die.
EPROG Tutorium Einheit 4 Klassen und Objekte. Wiederholung Schleifen do... while while for break/continue Strings String char Methoden für Strings Arrays.
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
OOP-Begriffe Abstraktion Modellieren Klasse Objekt Attribute Methoden
Aufgaben Version 1: Es soll eine Wetterstation mit folgenden zwei Anzeigen implementiert werden: Aktuelle Wetterbedingungen mit Temperatur und.
Einfach und doppelt verkettete Listen in JAVA by Jens Weibler
Objektorientierte Programmierung
OOP-Begriffe Abstraktion Modellieren Klasse Objekt Attribute Methoden
2 Datenabstraktion Geheimnisprinzip:
Java-Kurs Übung Besprechung der Hausaufgabe
Institut für Kartographie und Geoinformation Prof. Dr. L. Plümer, Dipl.-Ing. D. Dörschlag, Dr. G. Gröger Einführung in die Programmierung mit Java 13.
Abstrakte Klassen und das Interface-Konzept
Diskrete Mathe Diskrete Mathematik I Listen Vorlesung 4.
Vererbung in Java. public abstract class Form { protected int breite; protected int hoehe; protected String farbe; /** * Erzeuge eine Form der Breite.
Konstruktoren.
Objektorientierung Gliederung von Daten und Funktionen zu Objekten
1. Die rekursive Datenstruktur Liste 1
Implementieren von Klassen
1. Die rekursive Datenstruktur Liste 1
 Präsentation transkript:

© Prof. Dr. H. Gläser, Graphische Datenverarbeitung Benutzer Interaktion Benutzer Interaktion (interaction): die virtuelle Welt reagiert auf Benutzer Eingaben Animation die virtuelle Welt verändert sich im Laufe der Zeit Indirekte Auswirkungen von Benutzer Eingaben (billboard Verhalten) Stimulus Änderung bewirkt

© Prof. Dr. H. Gläser, Graphische Datenverarbeitung Benutzer Interaktion Nicht im Tutorial: Feststellen von Kollisionen

© Prof. Dr. H. Gläser, Graphische Datenverarbeitung Benutzer Interaktion (billboard = Reklametafel) sehr detaillierte Geometrien werden zu Texturen vereinfacht. Behavior sorgt dafür, daß die Tafel unabhängig vom Sichtwinkel immer senkrecht zum Beobachter steht Reklametafel Verhalten LOD Verhalten Je näher der Betrachter den Dingen kommt, desto detaillierte visual object Geometrien werden verwendet. Behavior schaltet automatisch zwischen den unterschiedlichen Detaillierungsgraden (level of detail - LOD) um

© Prof. Dr. H. Gläser, Graphische Datenverarbeitung Benutzer Interaktion Die Klasse Behavior Interaktion Animation

© Prof. Dr. H. Gläser, Graphische Datenverarbeitung Benutzer Interaktion -> drei Methoden implementieren: initialize processStimulus Konstruktor Verhaltensklassen selbst programmieren behavior ist abstrakte Klasse - stellt Referenz zum object of change her - aufgerufen wenn live - Anfangstrigger Ereignis (WakeupCondition Objekt) spezifizieren Methode: wakeupOn( ) - aufgerufen wenn Trigger Ereignis, - Ereignis entschlüsseln, - object of change ändern - Trigger erneut setzen !!

© Prof. Dr. H. Gläser, Graphische Datenverarbeitung Benutzer Interaktion import java.awt.event.*; import java.util.Enumeration; class SimpleBehavior extends Behavior{ private TransformGroup targetTG; private Transform3D rotation = new Transform3D(); private double angle = 0.0; SimpleBehavior(TransformGroup targetTG){ this.targetTG = targetTG; } void initialize(){ this.wakeupOn(new WakeupOnAWTEvent(KeyEvent.KEY_PRESSED)); } void processStimulus(Enumeration criteria){ angle = angle + 0.1; rotation.rotY(angle); targetTG.setTransform(rotation); this.wakeupOn(new WakeupOnAWTEvent(KeyEvent.KEY_PRESSED)); }

© Prof. Dr. H. Gläser, Graphische Datenverarbeitung Benutzer Interaktion Ausführungsbegrenzung (execution culling) Nur wenn sich activation volume der ViewPlatform und scheduling bonds des Behavior schneiden, wird das Verhalten ausgeführt Einfügen des Verhaltens Objekts in den Szene Graphen vrgl. folgendes Programmfragment

© Prof. Dr. H. Gläser, Graphische Datenverarbeitung Benutzer Interaktion BranchGroup createSceneGraph() { BranchGroup objRoot = new BranchGroup(); TransformGroup objRotate = new TransformGroup(); objRotate.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); objRoot.addChild(objRotate); objRotate.addChild(new ColorCube(0.4)); SimpleBehavior myRotationBehavior = new SimpleBehavior(objRotate); myRotationBehavior.setSchedulingBounds(new BoundingSphere()); objRoot.addChild(myRotationBehavior); objRoot.compile(); return objRoot; } objRotate Objekt wird erst im Behavior eine rotierende TransformGroup !

© Prof. Dr. H. Gläser, Graphische Datenverarbeitung Benutzer Interaktion Welches Problem könnte mit dieser Aufhängung des Behavior Objekts auftreten, wenn nicht rotiert sondern translatiert wird ?

© Prof. Dr. H. Gläser, Graphische Datenverarbeitung Benutzer Interaktion Bounds Objekt des Behavior Objekts scheduling Bereich activation volume der ViewPlatform Solange sich activation volume und scheduling Bereich schneiden, ist das Verhalten aktiv

© Prof. Dr. H. Gläser, Graphische Datenverarbeitung Benutzer Interaktion Bounds Objekt des Behavior Objekts scheduling Bereich activation volume der ViewPlatform Würfel wird immer noch bewegt, selbst wenn er gar nicht mehr gesehen wird

© Prof. Dr. H. Gläser, Graphische Datenverarbeitung Benutzer Interaktion Bounds Objekt des Behavior Objekts scheduling Bereich activation volume der ViewPlatform Würfel kann nicht mehr bewegt werden, obwohl der Benutzer ihn sehen kann

© Prof. Dr. H. Gläser, Graphische Datenverarbeitung Benutzer Interaktion 1. Lösung: 2. Lösung: Einsatz von BoundingLeaf void setSchedulingBoundingLeaf(BoundingLeaf bl)

© Prof. Dr. H. Gläser, Graphische Datenverarbeitung Benutzer Interaktion Performanz Fallen Memory Burn: Unnötiges Erzeugen von Objekten. Bsp.: in processStimulus die Verwendung von new. Garbage Collector vernichtet alte Objekte -> Zeichnen wird unterbrochen Objekte nach Möglichkeit wiederverwenden. Unnötige Trigger Aufrufe Es gibt eine Methode, die den Trigger bei jedem Neuzeichnen des Bilds (rendering) aufruft. Dies ist oft nicht nötig.

© Prof. Dr. H. Gläser, Graphische Datenverarbeitung Benutzer Interaktion Weitere Methoden von Behavior void postId(int postId) WakeupOnBehaviorPost Verkettet Behavior void setEnable(boolean state) Möglichkeit Behavior auf inaktiv zu setzen, auch wenn es eigentlich aktiv ist View getView() Es kann viele View Objekte geben, die das Verhalten aktivieren. Aber es gibt einen primary View (der erste, der mit einer live Platform verknüpft wird). An diesem richtet sich das Verhalten (z.B. billboard) aus. getView liefert den primary View

© Prof. Dr. H. Gläser, Graphische Datenverarbeitung Benutzer Interaktion Aufwach Bedingungen

© Prof. Dr. H. Gläser, Graphische Datenverarbeitung Benutzer Interaktion Triggermechanismus eines Verhaltens Behavior Objekt WakeupCondition Objekt: WakeupOnAWTEvent processStimulus Methode wird ausgelöst KeyEvent.KEY_PRESSED Trigger

© Prof. Dr. H. Gläser, Graphische Datenverarbeitung Benutzer Interaktion Triggermechanismus zwischen verschiedenen Verhalten (Wache auf bei Post vom Behavior) WakeupCondition Objekt: WakeupOnBehaviorPost postID(1) Behavior Objekt B Behavior Objekt A processStimulus Methode wird ausgelöst Trigger

© Prof. Dr. H. Gläser, Graphische Datenverarbeitung Benutzer Interaktion Beispiel Tastendruck: -> Tür öffnet sich Erneueter Tastendruck: -> Tür schließt sich

© Prof. Dr. H. Gläser, Graphische Datenverarbeitung Benutzer Interaktion class OpenBehavior extends Behavior{ private TransformGroup targetTG; private WakeupCriterion pairPostCondition; private WakeupCriterion AWTEventCondition; OpenBehavior(TransformGroup targetTG){ this.targetTG = targetTG; AWTEventCondition = new WakeupOnAWTEvent(KeyEvent.KEY_PRESSED); } public void setBehaviorObjectPartner(Behavior behaviorObject){ pairPostCondition = new WakeupOnBehaviorPost(behaviorObject, 1); } public void initialize(){ this.wakeupOn(AWTEventCondition); } public void processStimulus(Enumeration criteria){ if (AWTEventCondition.hasTriggered()){ // make door open -- code excluded this.wakeupOn(pairPostCondition); postId(1); } else { this.wakeupOn(AWTEventCondition); } Dekodieren: Wer hat getriggert: Taste oder anderes Behavior Triggern des anderen Behavior CloseBehavior hat analogen Code (auch mit postID = 1 !)

© Prof. Dr. H. Gläser, Graphische Datenverarbeitung Benutzer Interaktion TransformGroup doorTG = new TransformGroup(); OpenBehavior openObject = new OpenBehavior(doorTG); CloseBehavior closeObject = new CloseBehavior(doorTG); openObject.setBehaviorObjectPartner(closeObject); closeObject.setBehaviorObjectPartner(openObject); // Setze scheduling bounds für behavior Objekte -- code excluded Innerhalb einer Methode, die den Szene Graph zusammenbaut:

© Prof. Dr. H. Gläser, Graphische Datenverarbeitung Benutzer Interaktion Kollisionsdetektion - weites Thema WakeupOnCollisionEntry WakeupOnCollisionMovement WakeupOnCollisionExit Wenn 2 Objekte kollidieren Wenn 2 Objekte sich während der Kollision bewegen Wenn 2 Objekte die Kollision beenden - Kollision kann so schnell sein, dass kein Trigger ausgelöst wird - Für ein Objekt kann zu einer Zeit nur eine Kollision behandelt werden WakeupOnCollision*( Bounds Node ScreneGraphPath [, int] USE_BOUNDS USE_GEOMETRY ) [, int]

© Prof. Dr. H. Gläser, Graphische Datenverarbeitung Benutzer Interaktion Weiteres Aufwachen WakeupOnDeactivation() WakeupOnElapsedFrames(int frameCount) WakeupOnElapsedTime(long milliseconds) activation volume und scheduling bounds ohne Schnitt WakeupOnSensorEntry / Exit(Bounds...) Sensor ist ein beliebiges Eingabegerät außer Tastatur und Maus WakeupOnTransformChange(TransformGroup...) Hier kann auch Verhalten mit einem Utility Verhalten koordiniert werden WakeupOnViewPlatformEntry / Exit(Bounds...)

© Prof. Dr. H. Gläser, Graphische Datenverarbeitung Benutzer Interaktion Kombination von Aufwachbedingungen WakeupOn*

© Prof. Dr. H. Gläser, Graphische Datenverarbeitung Benutzer Interaktion Der Beobachter wird durch die Virtuelle Welt bewegt Behavior Bewegen der View Platform Wie kommt man beim SimpleUniverse an die Transform Group der View Platform ? Frage:

© Prof. Dr. H. Gläser, Graphische Datenverarbeitung Benutzer Interaktion Bewegen der View Platform ViewingPlatform vp = su.getViewingPlatform; TransformGroup vpt = vp.getViewPlatformTransform(); Mit dieser TransformGroup kann der Beobachter rotiert und verschoben werden su ist ein SimpleUniverse Objekt

© Prof. Dr. H. Gläser, Graphische Datenverarbeitung Benutzer Interaktion AWTEvent Tastendruck Verhaltens Utility Klassen für die Tastatur Navigation processStimulus(...) abstrakte Klasse Behavior implementiert KeyNavigatorBehavior KeyNavigator bedient sich Konstruktur nimmt (nur) TransformGroup entgegen (wird vom Programmierer nicht beeinflußt) wertet aus

© Prof. Dr. H. Gläser, Graphische Datenverarbeitung Benutzer Interaktion Verhalten des KeyNavigatorBehavior

© Prof. Dr. H. Gläser, Graphische Datenverarbeitung Benutzer Interaktion Verhaltens Utility Klassen für die Maus Navigation abstrakte Klasse MouseBehavior MouseRotate MouseTranslate MouseZoom implementieren zu benutzen setTransformGroup(TransformGroup...) MouseBehaviorCallback Interface zu implementieren: transformChanged(int type, Transform3D...) BenutzerMouseBehaviorKlasse die transformChanged Methode dieser Klasse wird aufgerufen, wenn die MouseTranslate Klassen aktiviert werden type = MOUSE_ROTATE,... setupCallback(MouseBehaviorCallback...)

© Prof. Dr. H. Gläser, Graphische Datenverarbeitung Benutzer Interaktion Customizing der Maus Navigation Möglichkeit A:Implementieren einer eigenen MouseBehavior Klasse (Extension von MouseBehavior) Möglichkeit B:Ableiten von MouseBehavior*, Überschreiben von transformChanged Möglichkeit C:Registrieren bei einer MouseBehavior* Klasse, implementieren vom Interface MouseBehaviorInterface d.h. der Methode transformChanged

© Prof. Dr. H. Gläser, Graphische Datenverarbeitung Benutzer Interaktion Anklicken oder Picking Das naheste Objekt wird selektiert (oder eine Liste mit geschnittenen Objekten wird geliefert) Der scene graph des selektierten Objekts wird zurückgeliefert (um z.B. den Knoten auszusuchen,der geändert werden soll, z.B. TransformGroup für Rotieren)

© Prof. Dr. H. Gläser, Graphische Datenverarbeitung Benutzer Interaktion Performanz Aspekte des Picking Schnittpunktsberechnung ist aufwendig Node Methode setPickable(boolean pickable)- wirkt auch auf alle Kinder ENABLE_PICK_REPORTING capability eines Node Objekts: dieser Node wird im zurückgelieferten scene graph path auf jeden Fall aufgeführt. - Sonst nur, wenn er zur eindeutigen Identifizierung des path benötigt wird. Im Konstruktor: USE_BOUNDS, oder USE_GEOMETRY

© Prof. Dr. H. Gläser, Graphische Datenverarbeitung Benutzer Interaktion Beschränkung des pick testing auf den Teil des scene graph, der in Frage kommt: in pick utility Klassen kann eine Wurzel eines Untergraphen angegeben werden, der nur untersucht wird. Er sollte möglichst ausschließlich pickable Objekte enthalten. PickRotateBehavior behavior = new PickRotateBehavior(root, canvas, bounds); root.addChild(behavior); Pick Utility Klassen Wo die Maus sich bewegt

© Prof. Dr. H. Gläser, Graphische Datenverarbeitung Benutzer Interaktion Bei picks gehts noch weiter: noch nicht gemacht: S.46 bis 58