Transformationen in Java 3D

Größe: px
Ab Seite anzeigen:

Download "Transformationen in Java 3D"

Transkript

1 Transformationen in Java 3D Eine Ausarbeitung von Florian Hüter im Rahmen des Seminars Java3D von Prof. Dr. W. Heinzel an der FH Fulda im WS 2002/03.

2 Inhaltsverzeichnis: Seite 1. Allgemeines zu Java3D Was ist Java3D? Der Szenengraph Theoretische Grundlagen von Transformationen Transformationen in Java3D Allgemeines Vorbereitungen Translation Skalierung Rotation Anmerkungen Ein praktisches Beispiel...23 Quellenverzeichnis...26 Anhang...27 Seite 2 von 32

3 1. Allgemeines zu Java3D 1.1. Was ist Java3D? Java3D ist eine Bibliothek von Java-Klassen zur Darstellung dreidimensionaler Grafik innerhalb von Java-Applikationen und Applets. Die Struktur einer darzustellenden Szene wird hierbei durch den Szenengraphen definiert, der den kompletten Aufbau einer 3D- Szene in einer baumartigen Struktur beinhaltet. Dadurch erlaubt Java3D eine relativ komfortable Handhabung von Objekten und Unterobjekten. Für die Darstellung von Szenen setzt Java3D auf ein lokal vorhandenes Rendering-API wie z.b. OpenGL oder unter Windows auch DirectX auf. Dadurch kann Java3D auch die für das jeweilige Rendering-API optimierte Hardware zur Szenendarstellung nutzen. Der Nachteil hierbei ergibt sich jedoch dadurch, dass durch die Verwendung der lokalen Rendering-API zwangsläufig eine Plattformabhängigkeit entsteht. Allerdings muss lediglich lokal eine entsprechend angepasste Version von Java3D einmalig installiert werden. Die kompilierten Java-Programme an sich laufen durch die Verwendung der immer gleichen Schnittstelle zur Anwendung bzw. zum Applet dann wiederum auf jeder Plattform, auf der Java3D installiert ist. Für die Darstellung einer Szene analysiert Java3D den Szenengraphen und konvertiert diesen in eine auf Renderingperformance optimierte Form, die von der jeweils vorhandenen Rendering-API abhängig ist. Bei Veränderungen der Szene erfolgt wenn zulässig eine erneute Optimierung. Der Programmierer muss sich also nicht um die Optimierung einer Szene in Bezug auf Renderingperformance kümmern dies nimmt Java3D ihm ab. Seite 3 von 32

4 1.2. Der Szenengraph Der Szenengraph von Java3D besteht aus zwei Teilen: Zum einen dem Viewing -Zweig, der alle für die Darstellung erforderlichen Parameter enthält und zum anderen dem Content -Zweig, der den Inhalt der Szene (Geometrie, Transformationen, etc.) enthält. Der Viewing -Zweig wird an dieser Stelle nicht näher erläutert, da sowohl dieser als auch das Locale- und das VirtualUniverse-Objekt vollständig automatisch erzeugt werden können, indem die Klasse SimpleUniverse verwendet wird. Augenmerk soll an dieser Stelle jedoch kurz auf den Content - Zweig gerichtet werden, da sich hieran sehr schön der strukturierte Aufbau eines Java3D-Szenengraphen verdeutlichen lässt. An der Spitze des Content - Zweiges stehen zunächst ein oder virtual universe locale BranchGroup BranchGroup TransformGroup content viewing Abbildung 1 Der Szenengraph von Java3D mehrere BranchGroup-Objekte. An diese lassen sich nun beliebig viele weitere BrachGroup- und/oder TransformGroup-Objekte anhängen. Wie später noch ersichtlich wird lassen sich so komplexe Strukturen erzeugen, die jedoch stets übersichtlich und verständlich sind. Mit folgendem Code-Fragment lassen sich beispielsweise ein Ober- und ein Unterarm auf einfachste Weise modellieren: BranchGroup oberarm = new BranchGroup(); oberarm.addchild(new ColorCube(0.3)); BranchGroup unterarm = new BranchGroup(); oberarm.addchild(new ColorCube(0.3)); oberarm.addchild(unterarm); // erzeugt BranchGroup oberarm // erstellt Würfel als Oberarm // erzeugt BranchGroup unterarm // erstellt Würfel als Unterarm // ordnet Unterarm Oberarm unter Diese logische Struktur eines Arms kann jetzt durch Bewegung der BranchGroup oberarm als Ganzes bewegt werden und darüber hinaus lässt sich der Unterarm durch Transformationen der BranchGroup unterarm auch einzeln bewegen. Der Unterarm muss nun noch an die richtige Stelle im Koordinatensystem geschoben werden, und ein zugegebenermaßen sehr einfacher Arm ist fertig. Auf Translation und andere Transformationen sowie die Erstellung eines komplexen, funktionsfähigen Armes wird jedoch erst später eingegangen. Seite 4 von 32

5 2. Theoretische Grundlagen von Transformationen Die theoretische Grundlage für die hier behandelten Transformationen Translation, Skalierung und Rotation bilden mathematische Matrizenmultiplikationen. So lassen sich n-dimensionale Transformationen als Matrizen der Größe n+1 x n+1 darstellen. Die hier behandelten Transformationen im dreidimensionalen Raum können also als 4x4-Matrizen beschrieben werden. An dieser Stelle soll nur kurz auf die mathematischen Hintergründe der Transformationen eingegangen werden, da das Hauptaugenmerk dieser Ausarbeitung auf der Anwendung von Transformationen in Java3D liegt. Nähere Informationen zu diesem Thema finden sich für Interessierte jedoch im Skript von Prof. Dr. W. Heinzel zur Lehrveranstaltung Graphische Datenverarbeitung an der FH Fulda im Sommersemester 2000 im dritten Kapitel Transformationen auf den Seiten Jedoch sind die dortigen Ausführungen auf OpenGL bezogen, deren Koordinatensystem eine von Java3D abweichende Achsenbezeichnung verwendet. Für geometrische Operationen in Java3D gilt folgendes Koordinatensystem: y x z Abbildung 2 Das Koordinatensystem von Java3D Die einfachste Transformation, zumindest in Bezug auf die dafür notwendige mathematische Berechnung stellt die Translation dar. Diese lässt sich durch folgende Matrix abbilden, wobei der Punkt P mit den Koordinaten (u, v, w) um den Vektor (a b c) verschoben werden soll: [ u v w 1 ] a b c = [ u+a v+b w+c 1 ] Seite 5 von 32

6 Auch die Skalierung lässt sich durch eine einfache Matrizenmultiplikation erreichen. Hierzu ist folgende Rechenoperation für jeden Eckpunkt P (u, v, w) eines zu skalierenden Objekts durchzuführen, wenn mit dem Vektor (a b c) skaliert werden soll: [ u v w 1 ] a b c = [ au bv cw 1 ] Hierbei ist jedoch zu beachten, dass der Mittelpunkt des Objekt zunächst in den Ursprung des Koordinatensystems geschoben und nach der Skalierung wieder zurück bewegt werden muss, um den Mittelpunkt des Objekts durch die Skalierung nicht zu verschieben. Die aufwändigste der hier behandelten Transformationen stellt die Rotation dar. Jedoch soll auch hier nur sehr kurz aus Gründen der Vollständigkeit eine der benötigten Matrizen vorgestellt und keine detaillierten Erklärungen dazu gegeben werden. Eine Rotation eines Punktes P mit den Koordinaten (u, v, w) mit dem Winkel a um die x-achse lässt sich durch folgende Matrizengleichung darstellen: [ u v w 1 ] cos(a) -sin(a) 0 0 sin(a) cos(a) = [ u v*cos(a)-z*sin(a) y*sin(a)+z*cos(a) 1 ] Alle anderen möglichen Rotationen werden durch ähnliche Gleichungen abgebildet, auf die hier jedoch nicht näher eingegangen werden soll. Die Drehrichtung für die Rotationen um die jeweiligen Achsen lässt sich übrigens aus Abbildung 2 auf der vorangegangenen Seite entnehmen, die das Koordinatensystem von Java3D mit den Rotationsrichtungen für alle Achsen zeigt. Seite 6 von 32

7 3. Transformationen in Java3D 3.1. Allgemeines Standardmäßig werden in Java3D alle Objekte bezüglich der Weltkoordinaten platziert. Diese umständliche und unpraktikable Vorgehensweise lässt sich allerdings durch die Verwendung von Transformationsgruppen, so genannte TransformGroup-Objekte umgehen. Ein TransformGroup-Objekt erlaubt die Verwendung eines neuen Koordinatensystems, das relativ zum Koordinatensystem des Vaters angeordnet ist. Verändert (transformiert) man nun die TransformGroup, bewegen sich gleichzeitig auch alle Objekte bzw. Modelle in dieser Gruppe. Nun lässt sich dieses Vater-Kind-Prinzip in Java3D natürlich über beliebig viele Ebenen durchführen. Hierbei akkumulieren sich selbstverständlich die Transformationen der einzelnen Stufen. Darüber hinaus sollte man wissen, dass der Szenengraph von unten nach oben abgearbeitet wird. Tiefer im Szenengraph angeordnete Transformationen werden also zuerst ausgeführt. Allerdings lassen sich durch die Verwendung von TransformGroup-Objekten noch keine Transformationen ausführen. Dazu benötigt man wenigstens ein Transform3D-Objekt. Dieses dient zur Beschreibung der Transformationen einer TransformGroup und muss dieser entsprechend zugewiesen werden. Auf die einzelnen Befehle, die dazu in Java3D erforderlich sind, wird in den folgenden Abschnitten detailliert anhand von Beispielen eingegangen. Content -Zweig des Szenengraphen BranchGroup TransformGroup TransformGroup TransformGroup TransformGroup Transform3D rotate scale Abbildung 3 Der Content -Zweig des Szenengraphen Seite 7 von 32

8 3.2. Vorbereitungen An dieser Stelle beginnen wir nun mit der eigentlichen Programmierung. Doch zuerst sollten wir eine Umgebung erzeugen, die für alle späteren Demonstrationen und Erklärungen verwendet werden kann. Zunächst benötigen wir einige allgemeine Klassen, die wir importieren müssen. Dies geschieht durch folgende Codezeilen: // Zu importierende Klassen import java.applet.applet; import java.awt.*; import com.sun.j3d.utils.applet.mainframe; import com.sun.j3d.utils.universe.*; import com.sun.j3d.utils.geometry.colorcube; import javax.media.j3d.*; import javax.vecmath.*; Danach beschreiben wir zunächst einmal den Rumpf der zu erstellenden Klasse SimpleScene, den wir später nach und nach füllen werden. Es werden folgende Funktionen für unser Java3D-Programm benötigt: public class SimpleScene extends Applet // Im Konstruktor wird lediglich eine Java3D-Szene vorbereitet und // anschließend dargestellt. Daher kann dieser Konstruktor später universal // verwendet werden. Die eigentliche Szene wird in der Funktion // createscenegraph() weiter unten erstellt. public SimpleScene() // Hier wird die eigentliche Szene erstellt (bzw. modelliert) public BranchGroup createscenegraph() // Die Hauptfunktion, die die Szene als Anwendung oder Applet aufruft public static void main(string[] argv) new MainFrame(new SimpleScene(), 256, 256); Wie bereits die Kommentare im Quelltext verdeutlichen, wird hier die Programm-Klasse SimpleScene erstellt, die einen Konstruktor besitzt, der die Szene vorbereitet und lädt. Außerdem existiert eine Funktion createscenegraph, in der später die komplette Szene erstellt wird. Am Ende der Klasse steht noch die java-typische main-funktion, die das Programm startet, indem sie ein Objekt der Klasse SimpleScene erzeugt. Da jetzt das ungefähre Aussehen einer Java3D-Anwendung von der Struktur her klar sein sollte, wollen wir nun damit beginnen, die einzelnen Funktionen zu füllen. Seite 8 von 32

9 Fangen wir also mit der Erstellung des Konstruktors an. Dieser muss ein SimpleUniverse- Objekt inklusive Virtual-Universe-Objekt, Locale-Objekt und dem kompletten Viewing -Zweig erzeugen und den Szenengraphen dort hinein laden. Für nähere Informationen hierzu siehe Kapitel 1.2 Der Szenengraph. Um kurz die wichtigsten Funktionen näher zu beschreiben sei gesagt, dass zunächst der Content -Zweig des Szenengraphen über den Aufruf der später noch detailliert beschriebenen Funktion createscenegraph() erzeugt wird. Dieser wird anschließend aus Performancegründen kompiliert und optimiert. Danach wird ein Canvas3D-Objekt erzeugt und positioniert, das einer Leinwand entspricht und für die Darstellung der Szene benötigt wird. Nun wird unter Verwendung dieses Canvas3D-Objekts ein SimpleUniverse erzeugt, dass die Basis einer jeden Java3D-Szene bildet. Danach wird die Kamera noch so positioniert, dass der im Fenster sichtbare Bereich der Szene genau von -1 bis 1 sowohl auf der X- als auch auf der Y-Achse reicht. Zum Schluss muss nur noch der bereits kompilierte Content -Zweig des Szenengraphen in dieses SimpleUniverse geladen werden und fertig ist die Java3D-Umgebung. Der Java-Code hierzu sieht folgendermaßen aus: public SimpleScene() // Setzen des Layout-Managers setlayout(new BorderLayout()); // Aufruf der Funktion zur Erstellung des Szenengraphen (bzw. der Szene) BranchGroup scene = createscenegraph(); // Kompiliert (Optimiert) den Szenengraph scene.compile(); GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration(); // Erzeugt eine Leinwand (=Canvas), auf der die Szene dargestellt wird Canvas3D canvas3d = new Canvas3D(config); // In den Mittleren Bereich der Szene (Center) das Canvas3D-Objekt einfügen add("center", canvas3d); // Erstellung des SimpleUniverse als Root-Objekt der gesamten Szene SimpleUniverse universe = new SimpleUniverse(canvas3D); // Die Kameraposition wird entlang der Z-Achse so versetzt, dass die // Fenstergrenzen jeweils bei -1 und 1 des Koordinatensystems liegen universe.getviewingplatform().setnominalviewingtransform(); // Szenengraph in SimpleUniverse einfügen universe.addbranchgraph(scene); Jetzt wäre das Programm ja beinahe schon lauffähig, jedoch fehlt noch das Wichtigste: Die eigentliche Szene. Um nun also etwas darzustellen benötigen wir noch etwas Inhalt in Seite 9 von 32

10 der Funktion createscenegraph(). Diese werden wir zunächst erst einmal mit einem bunten Würfel füllen, um die Vorbereitungen für die folgenden Kapitel abzuschließen. Im Einzelnen sieht dies nun so aus: Zunächst einmal erstellen wir das Root-Objekt oder auch die Wurzel der Szene, dem alle anderen Objekte untergeordnet werden. Dieses nennen wir auch dementsprechend rootobject. Um die Szene später noch transformieren zu können, benötigen wir nun ein TransformGroup-Objekt, welches den Namen tgroup erhält. Mit dessen Hilfe können wir später sämtliche Transformationen auf alle Objekte als Ganzes ausführen, die dieser TransformGroup angehören. Um nun endlich ein sichtbares Objekt in die Szene zu bringen, verwenden wir die importierte Klasse ColorCube. Diese erzeugt einen Würfel, dessen Seiten unterschiedlich eingefärbt und alle den angegebenen Wert vom Mittelpunkt entfernt sind. Diesen Würfel ordnen wir auch sogleich unserer TransformGroup unter, um ihn später transformieren zu können. Des Weiteren muss die TransformGroup noch unserem rootobject als Kind zugewiesen werden, um den Baum zu komplettieren. Am Ende geben wir dann noch eine Referenz auf unser rootobject zurück. Der hierzu erforderliche Code sieht folgendermaßen aus: // Hier wird die eigentliche Szene erstellt (bzw. modelliert) public BranchGroup createscenegraph() // Root-Objekt innerhalb der Szene wird erstellt BranchGroup rootobject = new BranchGroup(); // Eine TransformGroup erzeugen, um später Transformationen durchzuführen TransformGroup tgroup = new TransformGroup(); // Den ColorCube als Kind-Objekt in die TransformGroup aufnehmen tgroup.addchild(new ColorCube(0.5)); // Die TransformGroup als Kind-Objekt ins Root-Objekt aufnehmen rootobject.addchild(tgroup); // Die Szene bzw. das Root-Objekt zurückgeben return rootobject; Und nun zum Abschluss dieser Vorbereitung noch einmal den Code im Ganzen, der dazu benutzt werden kann, eine eigene Java3D-Szene zu erschaffen und der auch im Folgenden als Grundlage für weitere Erklärungen verwendet wird: // Zu importierende Klassen import java.applet.applet; import java.awt.*; import com.sun.j3d.utils.applet.mainframe; import com.sun.j3d.utils.universe.*; import com.sun.j3d.utils.geometry.colorcube; import javax.media.j3d.*; import javax.vecmath.*; Seite 10 von 32

11 public class Translation extends Applet // Der Translation-Konstruktor kann für jedes beliebige andere Programm // ebenfalls als Konstruktor verwendet werden, da er eine Szene in Java3D // komplett vorbereitet und darstellt. // Die eigentliche Szene wird in der Funktion createscenegraph() weiter // unten erstellt. public Translation() // Setzen des Layout-Managers setlayout(new BorderLayout()); // Aufruf der Funktion zur Erstellung des Szenengraphen (bzw. der Szene) BranchGroup scene = createscenegraph(); // Kompiliert (Optimiert) den Szenengraph scene.compile(); GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration(); // Erzeugt eine Leinwand (=Canvas), auf der die Szene dargestellt wird Canvas3D canvas3d = new Canvas3D(config); // In den Mittleren Bereich der Szene (Center) das Canvas3D-Objekt einfügen add("center", canvas3d); // Erstellung des SimpleUniverse als Root-Objekt der gesamten Szene SimpleUniverse universe = new SimpleUniverse(canvas3D); // Die Kameraposition wird entlang der Z-Achse so versetzt, dass die // Fenstergrenzen jeweils bei -1 und 1 des Koordinatensystems liegen universe.getviewingplatform().setnominalviewingtransform(); // Szenengraph in SimpleUniverse einfügen universe.addbranchgraph(scene); // Hier wird die eigentliche Szene erstellt (bzw. modelliert) public BranchGroup createscenegraph() // Root-Objekt innerhalb der Szene wird erstellt BranchGroup rootobject = new BranchGroup(); // Transform3D-Objekt erzeugen, das die Rotationsmatrix aufnimmt sowie mit // Einheitsmatrix belegen Transform3D translate = new Transform3D(); // Um den angegebenen Vektor verschieben (X,Y,Z) translate.set(new Vector3d( 0.0, 0.0, 0.0 )); // Eine TransformGroup erzeugen, die das Transform3D-Objekt aufnimmt TransformGroup tgroup = new TransformGroup(); // Die Transformation der TransformGroup zuordnen tgroup.settransform(translate); // Den ColorCube als Kind-Objekt in die TransformGroup aufnehmen tgroup.addchild(new ColorCube(0.5)); // Die TransformGroup als Kind-Objekt ins Root-Objekt aufnehmen rootobject.addchild(tgroup); // Die Szene bzw. das Root-Objekt zurückgeben return rootobject; // Die Hauptfunktion, die die Szene als Anwendung oder Applet aufruft public static void main(string[] argv) new MainFrame(new Translation(), 256, 256); Seite 11 von 32

12 Als Ergebnis sollte dieser Code dann ein Ergebnis liefern, dass als Anwendung ausgeführt dieses Fenster darstellt: Abbildung 4 - SimpleScene Man sieht einen Würfel mit einem Meter, denn genau das ist die Standard-Maßeinheit des Koordinatensystems von Java3D, Kantenlänge, der zentriert im Fenster angezeigt wird. Die Zentrierung entsteht dadurch, dass die Mitte des Fensters den Ursprung des Koordinatensystems bildet und der Mittelpunkt des Würfels genau auf diesem liegt. Um dies zu verändern, benötigen wir als erste Transformation die Translation, die im nächsten Kapitel erklärt wird. Seite 12 von 32

13 3.3. Translation Kommen wir nun also zur wahrscheinlich einfachsten aller Transformationen der Translation oder Verschiebung. In Java3D gibt es eigentlich nur zwei Möglichkeiten, eine solche Translation durchzuführen. Entweder man verwendet hierzu einen dreidimensionalen Verschiebungsvektor (das ist die einfachere und gebräuchlichere Methode), oder man gibt eine 4x4-Matrix an, die die Verschiebung enthält (das ist die komplizierte in Kapitel 2 angesprochene Methode). Beginnen wir also zunächst mit der Verschiebung unseres Würfels aus 3.2. per Verschiebungsvektor. Hierzu benötigen wir als Erstes ein neues Objekt der Klasse Transform3D, das die Verschiebung oder auch allgemein die Transformation aufnimmt, die auf ein Objekt angewendet werden soll. Diesem Transform3D-Objekt geben wir anschließend einen Vektor an, um den verschoben werden soll. In unserem Beispiel ist dies der Vektor (-1.0, 1.0, -2.0), der das Koordinatensystem einer TransformGroup um einen Meter nach links (-1.0), einen Meter nach oben (1.0) und zwei Meter nach hinten, also ins Bild hinein (-2.0) verschiebt. Um dies zu erreichen muss die Transformation nun nur noch mit der Methode settransform dem TransformGroup-Objekt zugewiesen werden, welches transformiert werden soll. Da wir momentan erst ein solches Objekt erstellt haben, fällt die Auswahl nicht schwer. Der Code hierzu stellt sich folgendermaßen dar (rot markierte Textelemente sind neu hinzugekommen): public BranchGroup createscenegraph() // Root-Objekt innerhalb der Szene wird erstellt BranchGroup rootobject = new BranchGroup(); // Eine TransformGroup erzeugen, um später Transformationen durchzuführen TransformGroup tgroup = new TransformGroup(); // Transform3D-Objekt erzeugen, das die Transformationen aufnimmt Transform3D translate = new Transform3D(); // Um den angegebenen Vektor verschieben (X,Y,Z) translate.set(new Vector3d( -1.0, 1.0, -2.0 )); // Die Transformation der TransformGroup zuordnen tgroup.settransform(translate); // Den ColorCube als Kind-Objekt in die TransformGroup aufnehmen tgroup.addchild(new ColorCube(0.5)); // Die TransformGroup als Kind-Objekt ins Root-Objekt aufnehmen rootobject.addchild(tgroup); // Die Szene bzw. das Root-Objekt zurückgeben return rootobject; Seite 13 von 32

14 Das Ergebnis dieser Transformation sieht dann folgendermaßen aus, wobei links noch einmal die Ausgangssituation ohne Transformation und rechts die Szene nach erfolgter Translation abgebildet ist. Nun kann man auch erstmals erkennen, dass es sich bei unserem ColorCube wirklich um einen Würfel und nicht nur um ein Quadrat handelt. Abbildung 5 SimpleScene Abbildung 6 - Translation Kommen wir nun zur etwas unübersichtlicheren Methode, der Translation mittels Vorgabe der Transformationsmatrix. Hierbei gilt es, den gewünschten Verschiebungsvektor in die in Kapitel 2 für die Translation angegebene 4x4-Matrix einzusetzen und diesen dann wie oben beschrieben der TransformGroup zuzuweisen. Für obige Translation (-1.0, 1.0, -2.0) ergibt sich also folgendes Bild: Allgemeine Translationsmatrix für eine Verschiebung um (a, b, c): Einsetzen des Vektors (-1.0, 1.0, -2.0) ergibt folgende Matrix: a b c Wir müssen also, um dieselbe Verschiebung wie oben zu erreichen mit obiger Matrix transformieren. Dies geschieht durch folgende Code-Zeile, mit der der entsprechende translate.set-methodenaufruf aus obigem Programm ersetzt wird: // Folgende Matrix als Transformationsmatrix angeben translate.set(new Matrix4d( 1.0, 0.0, 0.0, -1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, -2.0, 0.0, 0.0, 0.0, 1.0 )); Mit Hilfe von Matrizen lassen sich übrigens auch alle anderen hier angesprochenen Transformationen ausführen. Jedoch wird darauf nicht mehr explizit eingegangen. Seite 14 von 32

15 3.4. Skalierung Als nächste ebenfalls sehr einfache Transformation wollen wir nun die Skalierung, also das Stauchen und Strecken einzelner oder auch aller Koordinatenachsen behandeln. Für die Skalierung bietet Java3D zwei Methoden an. Bei einer werden alle Achsen des Koordinatensystems mit dem gleichen Faktor skaliert, bei der anderen lässt sich für jede Achse der gewünschte Skalierungsfaktor separat einstellen. Beginnen wir mit der uniformen Skalierung aller Achsen. Hier kann wieder auf unsere SimpleScene zurückgegriffen werden, deren Funktion createscenegraph nur noch um die Skalierung des Koordinatensystems ergänzt werden muss. Dies geschieht nach folgender Vorgehensweise, die der bei der Translation erklärten gleicht. Wir erzeugen ein Transform3D-Objekt, das die Transformation aufnehmen kann, setzen den Skalierungsfaktor fest und weisen das Transform3D am Ende der TransformGroup zu. Der benötigte Java-Code sieht folgendermaßen aus, wobei rote Codefragmente zur Ausgangsszene SimpleScene hinzugefügt wurden: // Hier wird die eigentliche Szene erstellt (bzw. modelliert) public BranchGroup createscenegraph() // Root-Objekt innerhalb der Szene wird erstellt BranchGroup rootobject = new BranchGroup(); // Eine TransformGroup erzeugen, um später Transformationen durchzuführen TransformGroup tgroup = new TransformGroup(); // Transform3D-Objekt erzeugen, das die Transformationen aufnimmt Transform3D scale = new Transform3D(); // Alle Achsen um den angegebenen Vektor skalieren scale.set(0.5); // Die Transformation der TransformGroup zuordnen tgroup.settransform(scale); // Den ColorCube als Kind-Objekt in die TransformGroup aufnehmen tgroup.addchild(new ColorCube(0.5)); // Die TransformGroup als Kind-Objekt ins Root-Objekt aufnehmen rootobject.addchild(tgroup); // Die Szene bzw. das Root-Objekt zurückgeben return rootobject; Jedoch lassen sich wie bereits erwähnt die einzelnen Koordinatenachsen auch unterschiedlich skalieren. Dies erreicht man durch Verwendung der Methode setscale anstatt der universalen set-methode. Der setscale-methode muss man hierbei lediglich einen dreidimensionalen Vektor übergeben, der sich aus Skalierung in X-, Y- und Z- Richtung zusammensetzt. Seite 15 von 32

16 Für eine unterschiedliche Skalierung der Achsen ist also die Zeile scale.set durch folgende zu ersetzen, wenn die X-Achse mit dem Faktor 0,5 gestaucht, die Y-Achse mit dem Faktor 1,5 gestreckt und die Z-Achse unverändert bleiben soll: // Die Achsen mit dem angegebenen Vektor skalieren (X, Y, Z) scale.setscale(new Vector3d( 0.5, 1.5, 0.0 )); Zum Vergleich hier noch einmal die SimpleScene mit dem Standard ColorCube der Kantenlänge 1 (Abbildung 7), der uniform mit dem Faktor 0,5 gestauchte ColorCube (Abbildung 8) und der mittels Skalierungsvektor veränderte ColorCube (Abbildung 9). Abbildung 7 - ColorCube ohne Transformation Abbildung 8 Uniforme Skalierung Abbildung 9 Skalierung per Vektor Seite 16 von 32

17 3.5. Rotation Kommen wir nun zur letzten hier behandelten Transformation der Rotation oder Drehung um eine oder mehrere Achsen. Diese bietet die größte Vielfalt an Methoden und möglichen Vorgehensweisen. Fangen wir jedoch erst einmal ganz einfach an mit der Rotation um eine Koordinatenachse, beispielsweise die x-achse. Hierzu benötigen wir wiederum die Szene SimpleScene, die wie oben um ein Transform3D-Objekt erweitert wird. Diesem Transform3D-Objekt weisen wir nun als Transformation eine Rotation um die x-achse zu, indem wir dessen Methode rotx verwenden. Entsprechend existieren die Methoden roty und rotz. Diese Methoden verlangen nur einen Übergabeparameter, und zwar den Wert, um den rotiert werden soll. Hierbei ist zu beachten, dass die Werte im Radiusmaß übergeben werden müssen. Die Konstante Pi entspricht hierbei 180, 2 mal Pi wären dann entsprechend 360. Da wir den Würfel aber zunächst nur um 45 rotieren wollen, übergeben wir der Methode rotx Pi/4. Abschließend müssen wir das Transform3D-Objekt wie gewohnt noch der TransformGroup zuweisen. Der hierzu erforderliche Programm-Code sieht folgendermaßen aus: // Hier wird die eigentliche Szene erstellt (bzw. modelliert) public BranchGroup createscenegraph() // Root-Objekt innerhalb der Szene wird erstellt BranchGroup rootobject = new BranchGroup(); // Eine TransformGroup erzeugen, um später Transformationen durchzuführen TransformGroup tgroup = new TransformGroup(); // Transform3D-Objekt erzeugen, das die Transformationen aufnimmt Transform3D rotate = new Transform3D(); // Um 45 um die X-Achse rotieren (PI = 180 ) rotate.rotx(math.pi/4d); // Die Transformation der TransformGroup zuordnen tgroup.settransform(rotate); // Den ColorCube als Kind-Objekt in die TransformGroup aufnehmen tgroup.addchild(new ColorCube(0.5)); // Die TransformGroup als Kind-Objekt ins Root-Objekt aufnehmen rootobject.addchild(tgroup); // Die Szene bzw. das Root-Objekt zurückgeben return rootobject; Das Ergebnis dieser Rotation im Vergleich zur ursprünglichen SimpleScene ist auf der Folgeseite abgebildet. Seite 17 von 32

18 Abbildung 10 SimpleScene Abbildung 11 - Rotation um die x-achse Seite 18 von 32

19 Natürlich lassen sich mit Java3D auch mehrere Rotationen verketten. Dazu erstellen wir zunächst zwei weitere Transform3D-Objekte und belegen eines mit einer Rotation um die y- Achse, das andere mit einer Rotation um die z-achse. Anschließend multiplizieren wir die beiden Rotationsmatrizen nacheinander jeweils mit der Ausgangstransformation und schon haben wir eine verkettete Rotation um alle drei Achsen. Der Quellcode hierzu sieht folgendermaßen aus: // Hier wird die eigentliche Szene erstellt (bzw. modelliert) public BranchGroup createscenegraph() // Root-Objekt innerhalb der Szene wird erstellt BranchGroup rootobject = new BranchGroup(); // Eine TransformGroup erzeugen, um später Transformationen durchzuführen TransformGroup tgroup = new TransformGroup(); // Transform3D-Objekte für die X-, Y- und Z-Rotation erzeugen Transform3D rotate = new Transform3D(); Transform3D rotatey = new Transform3D(); Transform3D rotatez = new Transform3D(); // Um 45 um die X-Achse rotieren (PI = 180 ) rotate.rotx(math.pi/4d); // Um 45 um die Y-Achse rotieren rotatey.roty(math.pi/4d); // Um 45 um die Z-Achse rotieren rotatez.rotz(math.pi/4d); // Rotationsmatrizen nacheinander multiplizieren rotate.mul(rotatey); rotate.mul(rotatez); // Die Transformation der TransformGroup zuordnen tgroup.settransform(rotate); // Den ColorCube als Kind-Objekt in die TransformGroup aufnehmen tgroup.addchild(new ColorCube(0.5)); // Die TransformGroup als Kind-Objekt ins Root-Objekt aufnehmen rootobject.addchild(tgroup); // Die Szene bzw. das Root-Objekt zurückgeben return rootobject; Hierbei ist jedoch zu beachten, dass die Rotationen nacheinander durchgeführt werden. Das komplette Koordinatensystem wird also zunächst um 45 um die x-achse rotiert, anschließend um 45 um die bereits veränderte y-achse und abschließend um die zweimal gedrehte z-achse. Eine Slideshow dieser ganzen Rotationskette findet sich zum besseren Verständnis auf der folgenden Seite. Hierbei sollte man immer das Java3D-typische Koordinatensystem (s. Abbildung 2) im Hinterkopf haben. Seite 19 von 32

20 Abbildung 12 Ausgangsszene Abbildung 13 - Nach der x-rotation Abbildung 14 - Nach der y-rotation Abbildung 15 - Nach der z-rotation Wie man jedoch schnell erkennt, ist das ein ziemlich umständlicher Weg, mehrere Rotationen durchzuführen. Natürlich gibt es dafür eine einfachere Methode, die zudem den Vorteil hat, dass nicht nacheinander rotiert wird, sondern alle Rotationen quasi gleichzeitig durchgeführt werden. Jede Einzelrotation wird also direkt am Ausgangskoordinatensystem vorgenommen und das Ergebnis ist daher auch viel einfacher vorherzusagen. Benutzt wird hierzu lediglich eine neue Methode namens SetEuler, der man drei Rotationsfaktoren für die drei möglichen Rotationsrichtungen übergibt. Der Quellcode und das entsprechende Ergebnis stehen auf der Folgeseite. Man beachte den Unterschied der Ausgabe zum vorangegangenen Beispiel. Seite 20 von 32

21 // Hier wird die eigentliche Szene erstellt (bzw. modelliert) public BranchGroup createscenegraph() // Root-Objekt innerhalb der Szene wird erstellt BranchGroup rootobject = new BranchGroup(); // Eine TransformGroup erzeugen, um später Transformationen durchzuführen TransformGroup tgroup = new TransformGroup(); // Transform3D-Objekt erzeugen, das die Transformationen aufnimmt Transform3D rotate = new Transform3D(); // In jede Richtung jeweils um den angegebenen Winkel rotieren rotate.seteuler(new Vector3d( Math.PI/4d, Math.PI/4d, Math.PI/4d )); // Die Transformation der TransformGroup zuordnen tgroup.settransform(rotate); // Den ColorCube als Kind-Objekt in die TransformGroup aufnehmen tgroup.addchild(new ColorCube(0.5)); // Die TransformGroup als Kind-Objekt ins Root-Objekt aufnehmen rootobject.addchild(tgroup); // Die Szene bzw. das Root-Objekt zurückgeben return rootobject; Das entsprechende Ergebnis dieser Operation sieht dann so aus (im Gegensatz zur verketteten Multiplikation weiter oben): Abbildung 16 - Rotation mittels seteuler Seite 21 von 32

22 3.6. Anmerkungen Grundsätzlich lassen sich durch Matrizenmultiplikation alle möglichen Transformationen miteinander kombinieren, jedoch sollte man wie bereits angesprochen aber auf die Reihenfolge der einzelnen Transformationen achten. Wie gesagt wird immer zuerst die erste Transformation ausgeführt und das Koordinatensystem dieser TransformGroup entsprechend verändert. Die nächste Transformation ganz gleich welcher Art derselben TransformGroup bezieht sich dann mit ihren Angaben auf dieses veränderte Koordinatensystem. Des Weiteren sollte der Vollständigkeit halber an dieser Stelle noch erwähnt werden, dass sich das Koordinatensystem eines Transform3D-Objekts wieder in den Anfangszustand versetzen lässt, die Transformationen dieses Objekts also rückgängig gemacht werden, wenn man die Methode setidentity() des entsprechenden Transform3D-Objekts anwendet. Im nächsten abschließenden Kapitel besprechen wir nun noch den Aufbau einer etwas komplexeren Szene in Java3D. Viel Spaß damit! Seite 22 von 32

23 4. Ein praktisches Beispiel Beginnen wir nun also mit der Anwendung des Gelernten. Ziel unseres Beispiels ist die sehr vereinfachte Nachbildung eines menschlichen Körperrumpfes und eines Armes. Der Arm soll sich per Tastatureingabe bewegen lassen. Hierbei sollen Ober- und Unterarm getrennt voneinander steuerbar sein. Beginnen wir also mit der Planung des Modells: Zunächst erschaffen wir ein zentrales Objekt, das die übrigen Objekte aufnimmt. Dieses nennen wir rootobject. Anschließend erstellen wir eine TransformGroup koerper für den Körper, in die wir eine Box als Symbol für den Rumpf aufnehmen. Ihr ordnen wir eine TransformGroup kopf unter, in die wir eine Kugel zur Darstellung des Kopfes aufnehmen. Nun muss der Kopf noch auf dem Körper platziert werden. Dies geschieht durch Translation der TransformGroup kopf an die entsprechende Stelle. Als nächstes generieren wir eine TransformGroup oberarmpositionierung, die dazu dient, den Oberarm später an die richtige Stelle in der Szene bewegen zu können. Diese ordnen wir der TransformGroup koerper unter. Anschließend erstellen wir eine weitere TransformGroup oberarmrotater und ordnen diese der Gruppe oberarmpositionierung unter. Mit Hilfe von oberarmrotater können wir später den Arm bewegen bzw. rotieren. Die TransformGroup oberarmrotater muss außerdem für Veränderungen während der Laufzeit freigegeben werden. Dies geschieht durch Aufrufen der Methode setcapability mit dem Parameter TransformGroup.ALLOW_TRANSFORM_WRITE. Jetzt erstellen wir noch eine TransformGroup oberarm und ordnen diese der Gruppe oberarmrotater unter. Nun platzieren wir noch einen Zylinder in der Gruppe oberarm, der den Oberarm darstellt. Zum Schluss verschieben wir diesen so, dass der Punkt, an dem der Oberarm mit dem Körper verbunden ist, im Ursprung des übergeordneten Koordinatensystems der Gruppe oberarmrotater liegt und schon ist der Oberarm fertig. Um den Oberarm später jedoch per Tastatur bewegen zu können, müssen wir der TransformGroup oberarmrotater noch ein Verhalten zuweisen. Dies wird hier jedoch nicht näher erläutert, da dies nicht zum Thema Transformationen gehört und den Umfang dieser Ausarbeitung sprengen würde. Für nähere Informationen hierzu siehe Quelltext- Kommentare im Anhang bzw. die Ausarbeitung eines Kommilitoenen zum Thema Interaktionen. Seite 23 von 32

24 Als letztes Objekt wollen wir nun noch einen Unterarm erstellen, der ebenfalls bewegt werden kann. Die Vorgehensweise hierbei ist analog zur oben beschriebenen Erstellung des Oberarms und wird daher nicht näher erläutert. Die fertige Szene hat also folgende Struktur: BG rootobject Box TG koerper Sphere TG kopf TG oberarmpositionierung TG oberarmrotater Cylinder TG oberarm TG unterarmpositionierung TG unterarmrotater Cylinder TG unterarm BG: BranchGroup TG: TransformGroup Abbildung 17 - Der "Content"-Zweig des Szenengraphen Den einzelnen Objekten der Szene lassen sich nun noch unterschiedliche Farben zuordnen, um sie besser unterscheiden zu können. Außerdem sollte die TransformGroup koerper mit allen ihr untergeordneten Objekten noch etwas verschoben und rotiert werden, um den Oberarm besser in Szene zu setzen. Wie das fertige Programm aussehen könnte, ist auf der nächsten Seite zu sehen. Sowohl Ober- als auch Unterarm lassen sich in jeweils zwei Richtungen per Tastatureingabe bewegen. Der Quelltext dafür kann im Anhang dieser Ausarbeitung eingesehen werden. Seite 24 von 32

25 Abbildung 18 - Das fertige Programm Dieses Beispielprogramm stellt selbstverständlich nur einen Ansatz für den Einstieg in die Programmierung mit Java3D dar und kann bei Bedarf noch beliebig erweitert werden. So könnte man das Modell vervollständigen bzw. feiner modellieren. Auch die Verwendung von Farben und Texturen kann hieran gut erprobt werden. Java3D bietet zur weiteren Gestaltung eine große Vielfalt an Möglichkeiten, die es zu erlernen gilt. Ich hoffe, diese Ausarbeitung konnte die in sie gesetzten Erwartungen erfüllen und wünsche weiterhin noch viel Spaß mit Java3D. Seite 25 von 32

26 Quellenverzeichnis [HalM] Multimediaprogrammierung und Sensorik 5 Java3D Teil 5 Autor Michael Haller ( ) abgerufen am [HeiW] Skript zur Lehrveranstaltung Graphische Datenverarbeitung an der FH Fulda Autor Prof. Dr. W. Heinzel (Stand: SS 2000) [JAPI] Java3D 1.3 API [JoyK] Online Computer Graphics Notes Transformation Autor Ken Joy ( ) abgerufen am [SoNa] Siggraph 99 - Introduction to Programming with Java 3D Autoren Henry Sowizral & Dave Nadeau (Juli 1999) abgerufen am Seite 26 von 32

27 Anhang Hier nun der Quellcode, des in Kapitel 4 besprochenen Beispielprogramms: /* Autor: Florian Hüter letzte Änderung: * * Klassenname: Mensch * * Entwickelt im Rahmen des Seminars Java3D bei Prof. Dr. W. Heinzel an der * FH Fulda im WS 2002/03. * * Es wird ein Teil eines Menschen nachgebildet, dessen Ober- und Unterarm * separat voneinander bewegt werden kann. * * Tastenbelegung: * * * Oberarmsteuerung: Unterarmsteuerung: * Anlegen: d Anwinkeln: k * Strecken: a Strecken: i * Nach vorne: s Nach außen: l * Nach hinten: w Nach innen: j * Zurücksetzen: f Zurücksetzen: h * * * Anmerkung: * Da Teile der Klasse SimpleBehavior einem Beispielprogramm von Sun * entnommen wurden, muss folgender Lizenzvermerk im Quellcode erscheinen: * * /09/22 16:24 * * Copyright (c) Sun Microsystems, Inc. All Rights Reserved. * * Sun grants you ("Licensee") a non-exclusive, royalty free, license to use, * modify and redistribute this software in source and binary code form, * provided that i) this copyright notice and license appear on all copies of * the software; and ii) Licensee does not utilize the software in a manner * which is disparaging to Sun. * * This software is provided "AS IS," without a warranty of any kind. ALL * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY * IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR * NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE * LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING * OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS * LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, * INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER * CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF * OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE * POSSIBILITY OF SUCH DAMAGES. * * This software is not designed or intended for use in on-line control of * aircraft, air traffic, aircraft navigation or aircraft communications; or in * the design, construction, operation or maintenance of any nuclear * facility. Licensee represents and warrants that it will not use or * redistribute the Software for such purposes. */ /*** Zu importierende Klassen ***/ import java.applet.applet; import java.awt.*; import com.sun.j3d.utils.applet.mainframe; import com.sun.j3d.utils.universe.*; Seite 27 von 32

28 import com.sun.j3d.utils.geometry.*; import javax.media.j3d.*; import javax.vecmath.*; import java.awt.event.*; import java.util.enumeration; public class Mensch extends Applet /*** Konstruktor ***/ // Der Konstruktor initalisiert die Java3D-Umgebung public Mensch() setlayout(new BorderLayout()); // Aufruf der Funktion zur Erstellung des Szenengraphen (bzw. der Szene) BranchGroup scene = createscenegraph(); // Kompiliert (Optimiert) den Szenengraph scene.compile(); GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration(); // Erzeugt eine Leinwand (=Canvas), auf der die Szene dargestellt wird Canvas3D canvas3d = new Canvas3D(config); // Java3D-Koordinatensystem wird zur Leinwand hinzugefügt add("center", canvas3d); // Erstellung des SimpleUniverse als Root-Objekt der gesamten Szene SimpleUniverse universe = new SimpleUniverse(canvas3D); // Die Kameraposition wird entlang der Z-Achse so versetzt, dass die // Fenstergrenzen jeweils bei -1 und 1 des Koordinatensystems liegen universe.getviewingplatform().setnominalviewingtransform(); // Szenengraph in SimpleUniverse einfügen universe.addbranchgraph(scene); /*** Verhaltensklasse für Oberarm ***/ // Klasse, die das Verhalten des Oberarms steuert // Sie wurde einem Beispiel von Sun entnommen (s.o.) und erweitert public class SimpleBehavior extends Behavior private TransformGroup oberarm; private Transform3D oberarmrotation = new Transform3D(); private Transform3D oberarmrotationtemp = new Transform3D(); private WakeupCondition cond; // Konstruktor SimpleBehavior(TransformGroup tg1) this.oberarm = tg1; // Initalisiere das Verhalten public void initialize() cond = new WakeupOnAWTEvent(KeyEvent.KEY_PRESSED); this.wakeupon(cond); // Verhalten // Wird von Java automatisch augerufen, wenn entsprechender "Stimulus" // kommt (bestimmtes Event eintritt) public void processstimulus(enumeration criteria) oberarmrotationtemp.set(oberarmrotation); WakeupOnAWTEvent event = (WakeupOnAWTEvent)criteria.nextElement(); Seite 28 von 32

29 KeyEvent key = (KeyEvent)event.getAWTEvent()[0]; char c = key.getkeychar(); // Per Tasteneingabe Richtung der Drehung steuern switch(c) case 'd': oberarmrotation.rotz(0.1); oberarmrotation.mul(oberarmrotationtemp); oberarm.settransform(oberarmrotation); break; case 'a': oberarmrotation.rotz(-0.1); oberarmrotation.mul(oberarmrotationtemp); oberarm.settransform(oberarmrotation); break; case 'w': oberarmrotation.rotx(0.1); oberarmrotation.mul(oberarmrotationtemp); oberarm.settransform(oberarmrotation); break; case 's': oberarmrotation.rotx(-0.1); oberarmrotation.mul(oberarmrotationtemp); oberarm.settransform(oberarmrotation); break; // Anfangszustand wiederherstellen case 'f': oberarmrotation.setidentity(); oberarm.settransform(oberarmrotation); break; default: this.wakeupon(cond); // Ende der Klasse SimpleBehavior /*** Verhaltensklasse für Unterarm ***/ // Klasse, die das Verhalten des Unterarms steuert // SimpleBehavior2 stellt nahezu die gleiche Funktion wie SimpleBehavior // zur Verfügung, jedoch werden hier andere Tasten verwendet public class SimpleBehavior2 extends Behavior private TransformGroup unterarm; private Transform3D unterarmrotation = new Transform3D(); private Transform3D unterarmrotationtemp = new Transform3D(); private WakeupCondition cond; // Konstruktor SimpleBehavior2(TransformGroup tg1) this.unterarm = tg1; // Initalisiere das Verhalten public void initialize() cond = new WakeupOnAWTEvent(KeyEvent.KEY_PRESSED); this.wakeupon(cond); // Verhalten // Wird von Java automatisch augerufen, wenn entsprechender "Stimulus" // kommt (bestimmtes Event eintritt) public void processstimulus(enumeration criteria) unterarmrotationtemp.set(unterarmrotation); WakeupOnAWTEvent event = (WakeupOnAWTEvent)criteria.nextElement(); KeyEvent key = (KeyEvent)event.getAWTEvent()[0]; char c = key.getkeychar(); // Per Tasteneingabe Richtung der Drehung steuern switch(c) Seite 29 von 32

30 case 'j': unterarmrotation.rotz(0.1); unterarmrotation.mul(unterarmrotationtemp); unterarm.settransform(unterarmrotation); break; case 'l': unterarmrotation.rotz(-0.1); unterarmrotation.mul(unterarmrotationtemp); unterarm.settransform(unterarmrotation); break; case 'i': unterarmrotation.rotx(0.1); unterarmrotation.mul(unterarmrotationtemp); unterarm.settransform(unterarmrotation); break; case 'k': unterarmrotation.rotx(-0.1); unterarmrotation.mul(unterarmrotationtemp); unterarm.settransform(unterarmrotation); break; // Anfangszustand wiederherstellen case 'h': unterarmrotation.setidentity(); unterarm.settransform(unterarmrotation); break; default: this.wakeupon(cond); // Ende der Klasse SimpleBehavior2 /*** Farbgenerierungsmethode ***/ public Appearance makeappearance( double r, double g, double b) Appearance app = new Appearance(); ColoringAttributes farbe = new ColoringAttributes(); farbe.setcolor((float) r, (float) g, (float) b); app.setcoloringattributes(farbe); return app; /*** Modellierung der Szene ***/ public BranchGroup createscenegraph() // Festlegung einiger Farben Appearance approt = makeappearance(1.0, 0.0, 0.0); Appearance appgruen = makeappearance(0.0, 1.0, 0.0); Appearance appblau = makeappearance(0.0, 0.0, 1.0); Appearance appgelb = makeappearance(1.0, 1.0, 0.0); // Root-Objekt innerhalb der Szene wird erstellt BranchGroup rootobject = new BranchGroup(); /*** Körper ***/ // Erzeugt den Körper als oberste TransformGroup TransformGroup koerper = new TransformGroup(); koerper.addchild(new Box(0.25f, 0.4f, 0.1f, appgelb)); // Den Körper durch Verschiebung und Drehung besser in Szene setzen // Alle untergeordneten Objekte werden dadurch mit verschoben Transform3D koerperausrichtung = new Transform3D(); koerperausrichtung.set(new Vector3d(0.4, 0.0, 0.0)); Transform3D koerperdrehung = new Transform3D(); Seite 30 von 32

31 koerperdrehung.roty(0.3); koerperausrichtung.mul(koerperdrehung); koerper.settransform(koerperausrichtung); // Den Körper dem Wurzelobjekt der Szene als Kind zuweisen rootobject.addchild(koerper); /*** Kopf ***/ TransformGroup kopf = new TransformGroup(); kopf.addchild(new Sphere(0.15f, approt)); // Positioniert den Kopf am Körper und ordnet den Kopf dem Körper unter Transform3D kopfpositionierung = new Transform3D(); kopfpositionierung.set(new Vector3d(0.0, 0.55, 0.0)); kopf.settransform(kopfpositionierung); koerper.addchild(kopf); /*** Oberarm ***/ // Erzeugt die TransformGroup oberarmpositionierung, die zur Positionierung // des Oberarms am Körper verwendet wird TransformGroup oberarmpositionierung = new TransformGroup(); Transform3D oberarmankoerper = new Transform3D(); Transform3D oberarmdrehung = new Transform3D(); oberarmankoerper.set(new Vector3d(-0.25, 0.4, 0.0)); oberarmdrehung.rotz(-math.pi/4d); oberarmankoerper.mul(oberarmdrehung); oberarmpositionierung.settransform(oberarmankoerper); koerper.addchild(oberarmpositionierung); // Erzeugt die TransformGroup oberarmrotater, die zur Rotation des // Oberarms verwendet wird und oberarmpositionierung untergeordnet ist TransformGroup oberarmrotater = new TransformGroup(); oberarmpositionierung.addchild(oberarmrotater); // Erlaubt das Verändern dieser TransformGroup während der Laufzeit oberarmrotater.setcapability(transformgroup.allow_transform_write); // Die TransformGroup oberarm enthält den eigentlichen Oberarm TransformGroup oberarm = new TransformGroup(); oberarmrotater.addchild(oberarm); oberarm.addchild(new Cylinder(0.06f, 0.25f, appblau)); Transform3D oberarmzuursprung = new Transform3D(); // Positioniert den Oberarm mit dem Drehpunkt im Zentrum des übergeordneten // Koordinatensystems oberarmzuursprung.set(new Vector3d(0.0, , 0.0)); oberarm.settransform(oberarmzuursprung); // Verhalten zur Interaktion hinzufügen // Rotiert wird hierbei die TransformGroup oberarmrotater SimpleBehavior oberarmrotationbehavior = new SimpleBehavior(oberarmRotater); oberarmrotationbehavior.setschedulingbounds(new BoundingSphere()); oberarmpositionierung.addchild(oberarmrotationbehavior); /*** Unterarm ***/ // Erzeugt die TransformGroup unterarmrotater, die zur Positionierung // des Unterarms am Oberarm verwendet wird TransformGroup unterarmpositionierung = new TransformGroup(); Transform3D unterarmankoerper = new Transform3D(); Transform3D unterarmdrehung = new Transform3D(); unterarmankoerper.set(new Vector3d(0.0, -0.15, 0.0)); unterarmpositionierung.settransform(unterarmankoerper); oberarm.addchild(unterarmpositionierung); // Erzeugt die TransformGroup unterarmrotater, die zur Rotation des // Unterarms verwendet wird und unterarmpositionierung untergeordnet ist Seite 31 von 32

32 TransformGroup unterarmrotater = new TransformGroup(); unterarmpositionierung.addchild(unterarmrotater); // Erlaubt das Verändern dieser TransformGroup während der Laufzeit unterarmrotater.setcapability(transformgroup.allow_transform_write); // Die TransformGroup unterarm enthält den eigentlichen Unterarm TransformGroup unterarm = new TransformGroup(); unterarmrotater.addchild(unterarm); unterarm.addchild(new Cylinder(0.06f, 0.25f, appgruen)); Transform3D unterarmzuursprung = new Transform3D(); // Positioniert den Oberarm mit dem Drehpunkt im Zentrum des übergeordneten // Koordinatensystems unterarmzuursprung.set(new Vector3d(0.0, , 0.0)); unterarm.settransform(unterarmzuursprung); // Verhalten zur Interaktion hinzufügen // Rotiert wird hierbei die TransformGroup unterarmrotater SimpleBehavior2 unterarmrotationbehavior = new SimpleBehavior2(unterarmRotater); unterarmrotationbehavior.setschedulingbounds(new BoundingSphere()); unterarmpositionierung.addchild(unterarmrotationbehavior); // Die Szene bzw. das Root-Objekt zurückgeben return rootobject; // Die Hauptfunktion, die die Szene als Anwendung oder Applet aufruft public static void main(string[] argv) new MainFrame(new Mensch(), 256, 256); Seite 32 von 32

Einige weitere Fähigkeiten und Anwendungsbeispiele

Einige weitere Fähigkeiten und Anwendungsbeispiele Java3D Eine Einführung Was ist Java3D Ansicht (Viewing Model) Sichtbare Objekte Animationen und Interaktionen Einfaches Beispielprogram Einige weitere Fähigkeiten und Anwendungsbeispiele Was ist Java3D?

Mehr

Java 3D Einstiegs-Tutorial Teil 3

Java 3D Einstiegs-Tutorial Teil 3 Navigation mit der Maus Java 3D Einstiegs-Tutorial Teil 3 Computergrafik - Übungen W. Kurth, E. Roth WS 2001/02 Java 3D eröffnet mehrere Möglichkeiten, sich mittels Maus- Eingaben im virtuellen Raum zu

Mehr

Java 3D Einstiegs-Tutorial Teil 1

Java 3D Einstiegs-Tutorial Teil 1 Java 3D Einstiegs-Tutorial Teil 1 Computergrafik - Übungen W. Kurth, E. Roth WS 2001/02 Java 3D: Application Programming Interface (API) für Java Erweiterung von Java um Klassenbibliotheken, die als Interface

Mehr

MediaBoxXT 4.0. Einfache Erstellung von Postscript-Dateien mit QuarkXPress. JoLauterbach Software GmbH Stolzingstraße 4a 95445 Bayreuth Germany

MediaBoxXT 4.0. Einfache Erstellung von Postscript-Dateien mit QuarkXPress. JoLauterbach Software GmbH Stolzingstraße 4a 95445 Bayreuth Germany MediaBoxXT 4.0 Einfache Erstellung von Postscript-Dateien mit QuarkXPress JoLauterbach Software GmbH Stolzingstraße 4a 95445 Bayreuth Germany Telefon: 0921-730 3363 Fax: 0921-730 3394 Internet: email:

Mehr

Java3D - Teil 6. Michael Haller

Java3D - Teil 6. Michael Haller Java3D - eil 6 Michael Haller Inhalt der Vorlesung Interaktion 2: astaturgesteuerte Navigation Mausinteraktion Mausgesteuerte Navigation Animation Picking 2 Wir erinnern uns... public void initialize(){

Mehr

Aktuelle Binaries: Version 1.5.2; download: https://java3d.dev.java.net/binary-builds.html. + Visual Toolkit (VTK -> KITWARE)

Aktuelle Binaries: Version 1.5.2; download: https://java3d.dev.java.net/binary-builds.html. + Visual Toolkit (VTK -> KITWARE) 3. Java 3D 3.1 Grundlagen - Hierarchie von Java-Klassen, die eine Schnittstelle zur Darstellung und Interaktion von dreidimensionalen grafischen Szenen bilden. - Die geometrischen Objekte werdenin einem

Mehr

BatchX 3.0. Stapelverarbeitung mit QuarkXPress. JoLauterbach Software GmbH Balthasar-Neumann-Str. 11 95444 Bayreuth

BatchX 3.0. Stapelverarbeitung mit QuarkXPress. JoLauterbach Software GmbH Balthasar-Neumann-Str. 11 95444 Bayreuth BatchX 3.0 Stapelverarbeitung mit QuarkXPress JoLauterbach Software GmbH Balthasar-Neumann-Str. 11 95444 Bayreuth Telefon: 0921-730 3363 Fax: 0921-730 3394 E-Mail : info@jolauterbach.de Internet: http://www.jolauterbach.de

Mehr

Java 3D. Linien, Flächen und Objekte Axel Bartsch, Okt. 2002

Java 3D. Linien, Flächen und Objekte Axel Bartsch, Okt. 2002 Java 3D Linien, Flächen und Objekte Axel Bartsch, Okt. 2002 Virtual World Koordinaten System Grundlagen zur Definition visueller Objekte Shape3D Unterklasse der Leaf-Klasse Eigenschaften des visuellen

Mehr

3D-Grafik und -Animation: Java3D

3D-Grafik und -Animation: Java3D 3D-Grafik und -Animation: Java3D Hauptseminar Virtuelle Präsenz Wintersemester 2003/2004 Marco Jahn Inhaltsverzeichnis 1 Einleitung... 3 2 Java3D Grundlagen... 3 2.1 Die Java3D API... 3 2.2 Aufbau eines

Mehr

Erstellung geometrischer Figuren und Verwendung von Texturen in Java 3D

Erstellung geometrischer Figuren und Verwendung von Texturen in Java 3D Grafisch-Interaktive Systeme Prof. Dr. Heinzel Vertiefungsgebiet Embedded Systems Bachelor WS 2007 / 2008 Hochschule Fulda Erstellung geometrischer Figuren und Verwendung von Texturen in Java 3D Markus

Mehr

4 Grundlagen zu SVG-Karten und -Diagrammen...33

4 Grundlagen zu SVG-Karten und -Diagrammen...33 48 4 Grundlagen zu SVG-Karten und -Diagrammen 4 Grundlagen zu SVG-Karten und -Diagrammen...33 4.1 Bildschirmdarstellung vs. Papierkartendruck...33 4.1.1 Mehr Farben...33 4.1.2 Probleme beim Einsatz von

Mehr

Password Management. Password Management Guide MF-POS 8

Password Management. Password Management Guide MF-POS 8 Password Management Password Management Guide MF-POS 8 MF-POS8 Einleitung Dieses Dokument beschreibt die Passwortverwaltung des Kassensystems MF-POS 8. Dabei wird zwischen einem Kellner und einem Verwaltungsbenutzer

Mehr

ALL1688PC. Benutzerhandbuch. Passiver Powerline Verbindung (Home Plug Gerät) Phasenkoppler (Hutschienen Version)

ALL1688PC. Benutzerhandbuch. Passiver Powerline Verbindung (Home Plug Gerät) Phasenkoppler (Hutschienen Version) ALL1688PC Passiver Powerline Verbindung (Home Plug Gerät) Phasenkoppler (Hutschienen Version) Benutzerhandbuch Legal Notice 2011 All rights reserved. No part of this document may be reproduced, republished,

Mehr

Einführung in die Programmierung mit Java

Einführung in die Programmierung mit Java Einführung in die Programmierung mit Java Martin Wirsing 2 Ziele Geschichte der OO-Programmiersprachen Warum Java als Programmiersprache verwenden? Ein einfaches Java-Programm erstellen, übersetzen und

Mehr

Einführung in die Programmierung 1

Einführung in die Programmierung 1 Einführung in die Programmierung 1 Einführung (S.2) Einrichten von Eclipse (S.4) Mein Erstes Programm (S.5) Hallo Welt!? Programm Der Mensch (S.11) Klassen (S.12) Einführung Wie Funktioniert Code? Geschriebener

Mehr

B6. 3D-Computergrafik mit Java

B6. 3D-Computergrafik mit Java B6. 3D-Computergrafik mit Java B6.1 Grundlagen der 3D-Computergrafik (teilweise Wiederholung zu Vorlesung Digitale Medien) B6.2 Einführung in Java 3D B6.3 Animation B6.4 Geometrie, Material, Beleuchtung

Mehr

Inptools-Handbuch. Steffen Macke

Inptools-Handbuch. Steffen Macke Inptools-Handbuch Steffen Macke Inptools-Handbuch Steffen Macke Veröffentlicht $Date 2014-01-28$ Copyright 2008, 2009, 2011, 2012, 2014 Steffen Macke Dieses Dokument wurde unter der GNU-Lizenz für freie

Mehr

MaTHEMATISCHE GRUNDLAGEN BUGA-AR TELESCOPE. Marko HeRBERTZ

MaTHEMATISCHE GRUNDLAGEN BUGA-AR TELESCOPE. Marko HeRBERTZ MaTHEMATISCHE GRUNDLAGEN BUGA-AR TELESCOPE Marko HeRBERTZ Wiederholung: Objekt-, Welt- und Kamerakoordinaten Kugelkoordinaten in kartesische Mögliche Schwierigkeiten Kameralinse Lage der Festung Lagerichtige

Mehr

Up and Down - Projekt mit dem AT90USB162

Up and Down - Projekt mit dem AT90USB162 Up and Down - Projekt mit dem AT90USB162 Über diese Dokumentation: Projekt geplant, durchgeführt und ausgearbeitet von: Florian Patzer Erweiterte Projektangaben: Dieses Projekt wurde im Rahmen des Datenverarbeitungsunterrichts

Mehr

tricerat Simplify Value Package

tricerat Simplify Value Package tricerat Simplify Value Package Das Simplify Value Package importiert mehr als 350 gebräuchliche Einstellungsobjekte in die Datenbank der Simplify Suite - so dass diese per Drag & Drop zugewiesen werden

Mehr

1. Das Koordinatensystem

1. Das Koordinatensystem Liebe Schülerin! Lieber Schüler! In den folgenden Unterrichtseinheiten wirst du die Unterrichtssoftware GeoGebra kennen lernen. Mit ihrer Hilfe kannst du verschiedenste mathematische Objekte zeichnen und

Mehr

Payment Center. Kurzanleitung. Version 1.0.1

Payment Center. Kurzanleitung. Version 1.0.1 Payment Center Kurzanleitung Version 1.0.1 This document has been created by the Wirecard AG. Its contents may be changed without prior notice. External web links are provided for information only. Wirecard

Mehr

VPN Tracker für Mac OS X

VPN Tracker für Mac OS X VPN Tracker für Mac OS X How-to: Kompatibilität mit DrayTek Vigor VPN Routern Rev. 3.0 Copyright 2003-2005 equinux USA Inc. Alle Rechte vorbehalten. 1. Einführung 1. Einführung Diese Anleitung beschreibt,

Mehr

Inhalt. Stationey Grußkarten im Überblick... 3. Stationery Vorlagen in Mail... 4. Stationery Grußkarten installieren... 5

Inhalt. Stationey Grußkarten im Überblick... 3. Stationery Vorlagen in Mail... 4. Stationery Grußkarten installieren... 5 Grußkarten Inhalt Stationey Grußkarten im Überblick... 3 Stationery Vorlagen in Mail... 4 Stationery Grußkarten installieren... 5 App laden und installieren... 5 Gekaufte Vorlagen wiederherstellen 5 Die

Mehr

Kapitel 3. Transformationen

Kapitel 3. Transformationen Oyun Namdag Am 08.11.2007 WS 07/08 Proseminar Numerik: Mathematics for 3D game programming & computer graphics Dozenten: Prof. Dr. V. Schulz, C. Schillings Universität Trier Kapitel 3 Transformationen

Mehr

Repetitorium Informatik (Java)

Repetitorium Informatik (Java) Repetitorium Informatik (Java) Tag 6 Lehrstuhl für Informatik 2 (Programmiersysteme) Übersicht 1 Klassen und Objekte Objektorientierung Begrifflichkeiten Deklaration von Klassen Instanzmethoden/-variablen

Mehr

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java Vorlesung vom 18.4.07, Grundlagen Übersicht 1 Kommentare 2 Bezeichner für Klassen, Methoden, Variablen 3 White Space Zeichen 4 Wortsymbole 5 Interpunktionszeichen 6 Operatoren 7 import Anweisungen 8 Form

Mehr

Silke Trißl, Prof. Ulf Leser Wissensmanagement in der Bioinformatik. Jede Applikation braucht eine Klasse mit einer main-methode

Silke Trißl, Prof. Ulf Leser Wissensmanagement in der Bioinformatik. Jede Applikation braucht eine Klasse mit einer main-methode Methoden und Klassen Silke Trißl, Prof. Ulf Leser Wissensmanagement in der Bioinformatik Wiederholung Jede Applikation braucht eine Klasse mit einer main-methode Eintrittspunkt in das Programm Die main-methode

Mehr

1 Fraktale Eigenschaften der Koch-Kurve

1 Fraktale Eigenschaften der Koch-Kurve Anhang Inhaltsverzeichnis Fraktale Eigenschaften der Koch-Kurve iii. Einführung.................................. iii.2 Defintion.................................... iii.3 Gesamtlänge der Koch-Kurve........................

Mehr

2D-Transformationen. Kapitel 6. 6.1 Translation. 6.2 Skalierung

2D-Transformationen. Kapitel 6. 6.1 Translation. 6.2 Skalierung Kapitel 6 2D-Transformationen Mit Hilfe von Transformationen ist es möglich, die Position, die Orientierung, die Form und die Größe der grafischen Objekte zu manipulieren. Transformationen eines Objekts

Mehr

3D-Transformationen. Kapitel Translation Skalierung

3D-Transformationen. Kapitel Translation Skalierung Kapitel 13 3D-Transformationen Wie im weidimensionalen Fall, werden die Definitionspunkte der Objekte als Spaltenvektoren mit homogener Koordinate geschrieben. Die notwendigen Transformationen werden wieder

Mehr

Übersicht. Informatik 2 Teil 3 Anwendungsbeispiel für objektorientierte Programmierung

Übersicht. Informatik 2 Teil 3 Anwendungsbeispiel für objektorientierte Programmierung Übersicht 3.1 Modell Konto 3.2 Modell Konto - Erläuterungen 3.3 Benutzer Ein- und Ausgabe mit Dialogfenster I 3.4 Benutzer Ein- und Ausgabe mit Dialogfenster II 3.5 Klassen- und Objekteigenschaften des

Mehr

Eclipse Tutorial.doc

Eclipse Tutorial.doc Berner Fachhochschule Hochschule für Technik und Informatik, HTI Fachbereich Elektro- und Kommunikationstechnik Labor für Technische Informatik Eclipse Tutorial 2005, HTI Burgdorf R. Weber Dateiname: Eclipse

Mehr

Hintergrund und inaktiver Bildschirm. Administratorhandbuch

Hintergrund und inaktiver Bildschirm. Administratorhandbuch Hintergrund und inaktiver Bildschirm Administratorhandbuch September 2016 www.lexmark.com Inhalt 2 Inhalt Übersicht...3 Konfigurieren der Anwendung... 4 Zugriff auf die Konfigurationsseite für die Anwendung...4

Mehr

JAVA für Nichtinformatiker - Probeklausur -

JAVA für Nichtinformatiker - Probeklausur - JAVA für Nichtinformatiker - Probeklausur - Die folgenden Aufgaben sollten in 150 Minuten bearbeitet werden. Aufgabe 1: Erläutere kurz die Bedeutung der folgenden Java-Schlüsselwörter und gib Sie jeweils

Mehr

Objektorientierte Programmierung

Objektorientierte Programmierung Unterlagen zur Veranstaltung Einführung in die Objektorientierte Programmierung Mit Processing Alexis Engelke Sommer 2012 Alexis Engelke Inhalt Level 1: Geometrie Hintergrundfarben Punkte, Linien und deren

Mehr

FontWizardXT 4.3. Erweiterter EPS-Export für QuarkXPress. JoLauterbach Software GmbH Hammanstr. 27 60322 Frankfurt am Main Germany

FontWizardXT 4.3. Erweiterter EPS-Export für QuarkXPress. JoLauterbach Software GmbH Hammanstr. 27 60322 Frankfurt am Main Germany FontWizardXT 4.3 Erweiterter EPS-Export für QuarkXPress JoLauterbach Software GmbH Hammanstr. 27 60322 Frankfurt am Main Germany Telefon: 069-59796054 Fax: 069-59796055 Internet: email: info@jolauterbach.de

Mehr

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java 1 / 41 Einstieg in die Informatik mit Java Vererbung Gerd Bohlender Institut für Angewandte und Numerische Mathematik Gliederung 2 / 41 1 Überblick: Vererbung 2 Grundidee Vererbung 3 Verdeckte Variablen

Mehr

Starthilfe für C# Inhaltsverzeichnis. Medien- und Kommunikationsinformatik (B.Sc.) Alexander Paharukov. Informatik 3 Praktikum

Starthilfe für C# Inhaltsverzeichnis. Medien- und Kommunikationsinformatik (B.Sc.) Alexander Paharukov. Informatik 3 Praktikum Starthilfe für C# Inhaltsverzeichnis Allgemeines... 2 Bezugsquellen... 2 SharpDevelop... 2.NET Runtime... 2.NET SDK... 2 Installation... 2 Reihenfolge... 2 Vorschlag für eine Ordnerstruktur... 3 Arbeit

Mehr

Symmetrie von Naturgesetzen - Galilei-Transformationen und die Invarianz der Newton schen Gesetze

Symmetrie von Naturgesetzen - Galilei-Transformationen und die Invarianz der Newton schen Gesetze Symmetrie von Naturgesetzen - Galilei-Transformationen und die Invarianz der Newton schen Gesetze Symmetrie (Physik) (aus Wikipedia, der freien Enzyklopädie) Symmetrie ist ein grundlegendes Konzept der

Mehr

3 Mit Programmen und Fenstern

3 Mit Programmen und Fenstern 34 MIT PROGRAMMEN UND FENSTERN ARBEITEN 3 Mit Programmen und Fenstern arbeiten In dieser Lektion lernen Sie wie Sie Programme starten und wieder beenden wie Sie mit Fenstern arbeiten Ein Programm starten

Mehr

Vektoren. 2.1 Darstellung. Kapitel Subtraktion und Addition

Vektoren. 2.1 Darstellung. Kapitel Subtraktion und Addition Kapitel 2 Vektoren In diesem Kapitel werden wir im wesentlichen die verschiedenen Formen der Darstellung von Vektoren in MatLab sowie Verknüpfungen zwischen Vektoren betrachten. In letzterem Punkt ist

Mehr

Tutoraufgabe 1 (Programmanalyse):

Tutoraufgabe 1 (Programmanalyse): Prof. aa Dr. J. Giesl Programmierung WS14/15 C. Aschermann, F. Frohn, J. Hensel, T. Ströder Allgemeine Hinweise: Die Hausaufgaben sollen in Gruppen von je 2 Studierenden aus der gleichen Kleingruppenübung

Mehr

Yamaha Expansion Manager

Yamaha Expansion Manager Yamaha Expansion Manager Bedienungsanleitung Inhalt Überblick über Yamaha Expansion Manager...2 Bildschirmelemente und Funktionen...3 Verwalten von Pack-Daten...5 Installieren von Pack-Daten auf einem

Mehr

Transparenz 2.0. Passive Nachverfolgung und Filterung von WebApps auf dem Prüfstand

Transparenz 2.0. Passive Nachverfolgung und Filterung von WebApps auf dem Prüfstand Matthias Seul IBM Research & Development GmbH BSI-Sicherheitskongress 2013 Transparenz 2.0 Passive Nachverfolgung und Filterung von WebApps auf dem Prüfstand R1 Rechtliche Hinweise IBM Corporation 2013.

Mehr

Anleitung zur Erstellung einer Concept-Map

Anleitung zur Erstellung einer Concept-Map Anleitung zur Erstellung einer Concept-Map Was ist eigentlich eine Concept-Map? Eine Concept-Map (ein Begriffs-Netz) ist ein anschauliches Bild, in dem einzelne Begriffe (Concepts) miteinander verbunden

Mehr

5.5.8 Öffentliche und private Eigenschaften

5.5.8 Öffentliche und private Eigenschaften 5.5.8 Öffentliche und private Eigenschaften Schnittstellen vs. Implementierungen: Schnittstelle einer Klasse beschreibt, was eine Klasse leistet und wie sie benutzt werden kann, ohne dass ihre Implementierung

Mehr

Kapitel 8. Programmierkurs. Methoden. 8.1 Methoden

Kapitel 8. Programmierkurs. Methoden. 8.1 Methoden Kapitel 8 Programmierkurs Birgit Engels Anna Schulze Zentrum für Angewandte Informatik Köln Objektorientierte Programmierung Methoden Überladen von Methoden Der this-zeiger Konstruktoren Vererbung WS 07/08

Mehr

1 Analytische Geometrie

1 Analytische Geometrie Analytische Geometrie. Grundlagen, Begriffe, Schreibweisen Achsenkreuz Die Achsen heißen in dieser Darstellung x und -Achse. Punkte Punkte werden weiterhin mit großen, lateinischen Buchstaben bezeichnet

Mehr

Technische Hochschule Georg Agricola WORKSHOP TEIL 2. Veranschaulichung des EVA-Prinzips

Technische Hochschule Georg Agricola WORKSHOP TEIL 2. Veranschaulichung des EVA-Prinzips 12.1.2017 Technische Hochschule Georg Agricola WORKSHOP TEIL 2 Veranschaulichung des EVA-Prinzips Inhaltsverzeichnis 1. Kurzfassung zur Projekterstellung... 2 2. Erklärung zum EVA-Prinzip... 3 2.1 Benötigte

Mehr

Beispiel 2a Die eigenen ersten Schritte mit dem Gnu-Debugger GDB für Remote-Debugging

Beispiel 2a Die eigenen ersten Schritte mit dem Gnu-Debugger GDB für Remote-Debugging Beispiel 2a Die eigenen ersten Schritte mit dem Gnu-Debugger GDB für Remote-Debugging Das Beispiel orientiert sich am selben Code, der im Teil 1 der Serie verwendet wurde. Text Styles: Shell Prompt mit

Mehr

FensterHai. - Integration von eigenen Modulen -

FensterHai. - Integration von eigenen Modulen - FensterHai - Integration von eigenen Modulen - Autor: Erik Adameit Email: erik.adameit@i-tribe.de Datum: 09.04.2015 1 Inhalt 1. Übersicht... 3 2. Integration des Sourcecodes des Moduls... 3 2.1 Einschränkungen...

Mehr

6 Speicherorganisation

6 Speicherorganisation Der Speicher des Programms ist in verschiedene Speicherbereiche untergliedert Speicherbereiche, die den eigentlichen Programmcode und den Code der Laufzeitbibliothek enthalten; einen Speicherbereich für

Mehr

Die quadratische Funktion

Die quadratische Funktion Die quadratische Funktion In einem Labor wird die Bewegung eines Versuchswagen aufgenommen. Es werden dabei die folgenden Messreihen aufgenommen: Messreihe 1 Messreihe 2 Messreihe 3 x in s 0,0 0,5 1,0

Mehr

Kapitel 2: Mathematische Grundlagen

Kapitel 2: Mathematische Grundlagen [ Computeranimation ] Kapitel 2: Mathematische Grundlagen Prof. Dr. Stefan M. Grünvogel stefan.gruenvogel@fh-koeln.de Institut für Medien- und Phototechnik Fachhochschule Köln 2. Mathematische Grundlagen

Mehr

Benutzer- und Referenzhandbuch

Benutzer- und Referenzhandbuch Benutzer- und Referenzhandbuch MobileTogether Client User & Reference Manual All rights reserved. No parts of this work may be reproduced in any form or by any means - graphic, electronic, or mechanical,

Mehr

Microsoft PowerPoint 2013 Layouts

Microsoft PowerPoint 2013 Layouts Hochschulrechenzentrum Justus-Liebig-Universität Gießen Microsoft PowerPoint 2013 Layouts Layouts in PowerPoint 2013 Seite 1 von 8 Inhaltsverzeichnis Einleitung... 2 Layout auswählen... 2 Arbeiten mit

Mehr

Java Vererbung. Inhalt

Java Vererbung. Inhalt Java Vererbung Inhalt 1 Zielsetzung... 2 1.1 Bewertung... 2 2 Grundlagen der Vererbung... 2 2.1 Super und Subklassen... 2 3 Überladen von Methoden... 4 3.1 Unterschiedliche Parameter... 4 3.2 Gleiche Parameter

Mehr

3D Programmierung mit Java

3D Programmierung mit Java 3D Programmierung mit Java Daniel F. Abawi Professur für Graphische Datenverarbeitung J. W. Goethe-Universität Fachbereich 12 Danksagung / Quellenangabe Die Basis für diesen Foliensatz wurde von Dr. Paul

Mehr

Anleitung zum Java - Applet

Anleitung zum Java - Applet Anleitung zum Java - Applet Stetige Verteilungen Visualisierung von Wahrscheinlichkeit und Zufallsstreubereich bearbeitet von: WS 2004 / 2005 E/TI 7 betreut von: Prof. Dr. Wilhelm Kleppmann Inhaltsverzeichnis

Mehr

Programmieren I + II Regeln der Code-Formatierung

Programmieren I + II Regeln der Code-Formatierung Technische Universität Braunschweig Dr. Werner Struckmann Institut für Programmierung und Reaktive Systeme WS 2016/2017, SS 2017 Programmieren I + II Regeln der Code-Formatierung In diesem Dokument finden

Mehr

8 Baum in perfekter Komposition

8 Baum in perfekter Komposition 8 Baum in perfekter Komposition Die Implementierung des Binärbaums im letzten Kapitel wird mithilfe des Entwurfsmusters Kompositum optimiert. Knoten und Abschluss Bei der einfach verketteten Liste wurde

Mehr

Session 1: Classes and Applets

Session 1: Classes and Applets Session 1: Classes and Applets Literature Sprechen Sie Java, ISBN 3-89864-117-1, dpunkt deutsch Java für Studenten, ISBN 3-8273-7045-0, PearsonStudium deutsch Java in a Nutshell, ISBN: 0-59600-283-1, O'Reilly

Mehr

Einführung in Java. PING e.v. Weiterbildung Andreas Rossbacher 24. März 2005

Einführung in Java. PING e.v. Weiterbildung Andreas Rossbacher 24. März 2005 Einführung in Java PING e.v. Weiterbildung Andreas Rossbacher 24. März 2005 Gliederung 1. Was ist Java / Geschichte von Java 2. Prinzip der Plattformunabhängigkeit 3. Wie kommt man vom Quellcode zum Programm

Mehr

Programmierkurs Java

Programmierkurs Java Programmierkurs Java Konstruktor, Statische Methoden Packages Prof. Dr. Stefan Fischer Institut für Telematik, Universität zu Lübeck http://www.itm.uni-luebeck.de/people/fischer Initialisierung von Datenstrukturen

Mehr

Der Windows Explorer INITE 7e 2003 Joël François

Der Windows Explorer INITE 7e 2003 Joël François Der Windows Explorer 1 Einleitung Was ist der Explorer? Der Windows Explorer (nicht zu verwechseln mit dem Internet Explorer) ist ein Programm welches zur Datei Verwaltung unter Microsoft Windows verwendet

Mehr

Die Platzierung im Seitenbehang

Die Platzierung im Seitenbehang Die Platzierung im Seitenbehang easyboard bietet vielfältige Möglichkeiten der Platzierung von Warenträgern und Produkten. So lassen sich Warenträger beispielsweise um 90 oder gar 180 Grad drehen und der

Mehr

Swing :Komponenten I (Teil 2)

Swing :Komponenten I (Teil 2) l Bei Swing handelt es sich um eine Programmierschnittstelle und Grafikbibliothek zum Programmieren von grafischen Benutzeroberflächen l Swing stellt eine Menge von Klassen zur Verfügung l Swing wurde

Mehr

Transformationen im 3D-Raum

Transformationen im 3D-Raum Thomas Jung Repräsentation von 3D-Oberflächen Aufbau von Szenen Transformationen im 3D-Raum Projektionstranformationen Anwendung in OpenGL Geometrietransformationen bilden die Basis für die Computergrafik

Mehr

Thema. Aufgabenstellung. Fachpraktikum Visualisierung und interaktive Systeme WS 2011. Aufgabe 5: 3D-Tetris. 3D - Tetris.

Thema. Aufgabenstellung. Fachpraktikum Visualisierung und interaktive Systeme WS 2011. Aufgabe 5: 3D-Tetris. 3D - Tetris. Fachpraktikum Visualisierung und interaktive Systeme WS 2011 Aufgabe 5: 3D-Tetris Thema 3D - Tetris. Aufgabenstellung Die Aufgabe ist, ein Drei-Dimensionales Tetrisspiel zu konstruieren. Es werden zufällig

Mehr

Kleines Einführungstutorial zu DAZ-Studio

Kleines Einführungstutorial zu DAZ-Studio Kleines Einführungstutorial zu DAZ-Studio Spätestens mit dem Kauf und der Installation von Bryce 5.5 wird man mit dem DAZ- Studio konfrontiert. Mit Hilfe von DAZ-Studio wird der Import von Poserfiguren

Mehr

SAP Simple Finance Die Finanz- und Risikomanagementlösung für die Digital Economy

SAP Simple Finance Die Finanz- und Risikomanagementlösung für die Digital Economy SAP Simple Finance Die Finanz- und Risikomanagementlösung für die Digital Economy Elmar Hassler, Business Transformation Service, SAP Österreich GmbH Public SAP IT Summit 2015, 21. & 22. April, Salzburg

Mehr

Release Notes BRICKware 7.5.4. Copyright 23. March 2010 Funkwerk Enterprise Communications GmbH Version 1.0

Release Notes BRICKware 7.5.4. Copyright 23. March 2010 Funkwerk Enterprise Communications GmbH Version 1.0 Release Notes BRICKware 7.5.4 Copyright 23. March 2010 Funkwerk Enterprise Communications GmbH Version 1.0 Purpose This document describes new features, changes, and solved problems of BRICKware 7.5.4.

Mehr

Musterlösung zur Vorlesung Modellbasierte Softwareentwicklung Wintersemester 2014/2015 Übungsblatt 9

Musterlösung zur Vorlesung Modellbasierte Softwareentwicklung Wintersemester 2014/2015 Übungsblatt 9 Prof. Dr. Wilhelm Schäfer Paderborn, 15. Dezember 2014 Christian Brenner Tristan Wittgen Musterlösung zur Vorlesung Modellbasierte Softwareentwicklung Wintersemester 2014/2015 Übungsblatt 9 Aufgabe 1 Codegenerierung

Mehr

Wie erstellt man dynamische Elemente mit JSXGraph?

Wie erstellt man dynamische Elemente mit JSXGraph? Wie erstellt man dynamische Elemente mit JSXGraph? 1. Kurzinformation zu JSXGraph Was ist JSXGraph? Eine freie dynamische Mathematiksoftware, die vollständig in Javascript programmiert ist. Daher benötigt

Mehr

Kontextdiagramm Erstellen von Kontextdiagrammen mit TopEase

Kontextdiagramm Erstellen von Kontextdiagrammen mit TopEase Kontextdiagramm Erstellen von Kontextdiagrammen mit TopEase Version Control: Version Status Datum / Kurzzeichen 1.0 Begründung Copyright: This document is the property of Business-DNA Solutions GmbH, Switzerland.

Mehr

Ogre Einführung Teil 1

Ogre Einführung Teil 1 Inhalt -Einleitung -Installieren und Einrichten von Ogre -Die erste Anwendung Ogre Einführung Teil 1 Einleitung Eine 3D Engine ist eine sehr komplexe Software und besteht aus mehreren tausend Zeilen Programmcode.

Mehr

Java Kurzreferenz Für Fortgeschrittene

Java Kurzreferenz Für Fortgeschrittene Java Kurzreferenz Für Fortgeschrittene 1. Initialisierung von Applets: Die Methode init Wenn ein Applet gestartet wird, werden immer zwei Methoden aufgerufen. Diese heissen init und start. Um gewisse Berechnungen

Mehr

Professur Konstruktionslehre

Professur Konstruktionslehre Professur Konstruktionslehre Prof. Dr. -Ing. E. Leidich Praktikumsanleitung Creo Elements/Pro Wildfire 5 Erstellen von Explosionsansichten 1 Inhaltsverzeichnis 1. Erstellen einer Explosionsdarstellung...

Mehr

Beim Programmieren mit MMIX habt ihr vielleicht schon öfter eine der folgenden Fehlermeldungen von MMIXAL bekommen:

Beim Programmieren mit MMIX habt ihr vielleicht schon öfter eine der folgenden Fehlermeldungen von MMIXAL bekommen: 1 ADRESSIERUNG IN MMIX Beim Programmieren mit MMIX habt ihr vielleicht schon öfter eine der folgenden Fehlermeldungen von MMIXAL bekommen: no base address is close enough to the address A! relative address

Mehr

Inventarisierung von Exchange Alternativen für die Exchange-Inventarisierung

Inventarisierung von Exchange Alternativen für die Exchange-Inventarisierung Inventarisierung von Exchange Alternativen für die Exchange-Inventarisierung www.docusnap.com TITEL Inventarisierung von Exchange AUTOR Mohr Carsten DATUM 28.10.2015 VERSION 1.0 Die Weitergabe, sowie Vervielfältigung

Mehr

Kapitel 3: Geometrische Transformationen

Kapitel 3: Geometrische Transformationen [ Computeranimation ] Kapitel 3: Geometrische Transformationen Prof. Dr. Stefan M. Grünvogel stefan.gruenvogel@fh-koeln.de Institut für Medien- und Phototechnik Fachhochschule Köln 3. Geometrische Transformationen

Mehr

Der FontWizard Lite. Funktionalität Installation Arbeitsweise. :L]DUG6RIWZDUH Am Eichkopf 16 D-61462 Königstein Germany

Der FontWizard Lite. Funktionalität Installation Arbeitsweise. :L]DUG6RIWZDUH Am Eichkopf 16 D-61462 Königstein Germany Der FontWizard Lite Für den Apple Macintosh, Windows 95/98 und Windows NT Version 1.3 Funktionalität Installation Arbeitsweise :L]DUG6RIWZDUH Am Eichkopf 16 D-61462 Königstein Germany Fax.: +49 (0) 6174-298839

Mehr

Drei-Schichten-Architektur. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 16: 3-Schichten-Architektur 1 Fachkonzept - GUI

Drei-Schichten-Architektur. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 16: 3-Schichten-Architektur 1 Fachkonzept - GUI Universität Osnabrück Drei-Schichten-Architektur 3 - Objektorientierte Programmierung in Java Vorlesung 6: 3-Schichten-Architektur Fachkonzept - GUI SS 2005 Prof. Dr. F.M. Thiesing, FH Dortmund Ein großer

Mehr

Ab jetzt: Java ohne Kara

Ab jetzt: Java ohne Kara Java ohne Kara Ab jetzt: Java ohne Kara Ziel: Erfahrungen sammeln mit ersten Java Programmen JavaKara -> Java Ablauf in JavaKara: 1. Programm schreiben 2. Kompilieren 3. Programm starten Ablauf in Java

Mehr

Algorithmen & Programmierung. Steuerstrukturen im Detail Selektion und Iteration

Algorithmen & Programmierung. Steuerstrukturen im Detail Selektion und Iteration Algorithmen & Programmierung Steuerstrukturen im Detail Selektion und Iteration Selektion Selektion Vollständige einfache Selektion Wir kennen schon eine Möglichkeit, Selektionen in C zu formulieren: if

Mehr

Vererbung & Schnittstellen in C#

Vererbung & Schnittstellen in C# Vererbung & Schnittstellen in C# Inhaltsübersicht - Vorüberlegung - Vererbung - Schnittstellenklassen - Zusammenfassung 1 Vorüberlegung Wozu benötigt man Vererbung überhaubt? 1.Um Zeit zu sparen! Verwendung

Mehr

Erste Schritte mit Eclipse

Erste Schritte mit Eclipse Erste Schritte mit Eclipse März 2008, KLK 1) Java Development Kit (JDK) und Eclipse installieren In den PC-Pools der HAW sind der JDK und Eclipse schon installiert und können mit dem Application Launcher

Mehr

Algorithmen und Programmierung II

Algorithmen und Programmierung II Algorithmen und Programmierung II Vererbung Prof. Dr. Margarita Esponda SS 2012 1 Imperative Grundbestandteile Parameterübergabe String-Klasse Array-Klasse Konzepte objektorientierter Programmierung Vererbung

Mehr

netcim Boot-Stick erstellen Version 1.0 ( ) Netree AG CH-4658 Däniken

netcim Boot-Stick erstellen Version 1.0 ( ) Netree AG CH-4658 Däniken Boot-Stick erstellen Version 1.0 (13.07.2016) Netree AG CH-4658 Däniken +41 62 288 74 74 info@netcim.ch www.netcim.ch Published by Netree AG http://www.netree.ch Copyright 2016 by Netree AG All rights

Mehr

Auf Biegen und Schieben

Auf Biegen und Schieben 0 Auf Biegen und Schieben Seite Auf Biegen und Schieben Modifikationen von Graphen durch Faktoren und Summanden Düsseldorf, den 7.06.0 Der bisher veröffentlichte Entwurf des Kernlehrplans für die Sekundarstufe

Mehr

Graphische Benutzungsoberflächen

Graphische Benutzungsoberflächen Graphische Benutzungsoberflächen Graphische Benutzungsoberflächen (graphical user interfaces, GUI) dienen zur interaktiven Bedienung von Programmen, Ein- und Ausgabe mit graphischen Techniken und visuellen

Mehr

Wie modelliere ich einen Bilderrahmen?

Wie modelliere ich einen Bilderrahmen? Wie modelliere ich einen Bilderrahmen? Hallo, dieses Tutorial sollte Anfängern zeigen wie man in Blender einen Schnitt durch verschiedenste Profile erstellen kann und diese dann auch anordnet und miteinander

Mehr

Remotely Anywhere Verwendung von Zertifikaten Schritt für Schritt Anleitung zur Implementation von Zertifikaten in Remotely Anywhere

Remotely Anywhere Verwendung von Zertifikaten Schritt für Schritt Anleitung zur Implementation von Zertifikaten in Remotely Anywhere Remotely Anywhere Verwendung von Zertifikaten Schritt für Schritt Anleitung zur Implementation von Zertifikaten in Remotely Anywhere Copyright 1997-2005 Brainware Consulting & Development AG All rights

Mehr

1. Formulieren Sie den Algorithmus <Bedienung eines Getränkeautomaten> nach den oben genannten Kriterien.

1. Formulieren Sie den Algorithmus <Bedienung eines Getränkeautomaten> nach den oben genannten Kriterien. Java 1 Einführung Grundlegende Übungsaufgaben Arbeitsauftrag 1.1 1. Formulieren Sie den Algorithmus nach den oben genannten Kriterien. Beispiel: Bedienung eines Getränkeautomaten

Mehr

Opensource Lizenzen. Frank Müller Opensource Seminar HS2014 Universität Basel

Opensource Lizenzen. Frank Müller Opensource Seminar HS2014 Universität Basel Opensource Lizenzen Frank Müller Opensource Seminar HS2014 Universität Basel Übersicht Einführung Übersicht über ausgewählte Lizenzen Transitionen zwischen Lizenzen OSS ähnliche Bewegungen ausserhalb von

Mehr

import java.awt.*; import java.awt.event.*; import javax.swing.*;

import java.awt.*; import java.awt.event.*; import javax.swing.*; Swing Workshop Dieser Workshop enthält grundsätzliche Informationen über Swing und Java und regt mit einigen Beispielen und Übungen zum weiteren Erkunden dieses Themengebietes an. Kapitel 1: Das erste

Mehr

Java Kurs für Anfänger Einheit 5 Methoden

Java Kurs für Anfänger Einheit 5 Methoden Java Kurs für Anfänger Einheit 5 Methoden Ludwig-Maximilians-Universität München (Institut für Informatik: Programmierung und Softwaretechnik von Prof.Wirsing) 22. Juni 2009 Inhaltsverzeichnis Methoden

Mehr

R-Wörterbuch Ein Anfang... ein Klick auf einen Begriff führt, sofern vorhanden, zu dessen Erklärung.

R-Wörterbuch Ein Anfang... ein Klick auf einen Begriff führt, sofern vorhanden, zu dessen Erklärung. R-Wörterbuch Ein Anfang... ein Klick auf einen Begriff führt, sofern vorhanden, zu dessen Erklärung. Carsten Szardenings c.sz@wwu.de 7. Mai 2015 A 2 B 3 C 4 D 5 F 6 R 16 S 17 V 18 W 19 Z 20 H 7 I 8 K 9

Mehr

Projektarbeit: Roulette Spiel

Projektarbeit: Roulette Spiel Projektarbeit: Roulette Spiel auf dem Atmega162 Im Fach Datenverarbeitungstechnik 1. Aufgabestellung Die Aufgabe verlangte es ein Reaktionsspiel auf einem Olimex AVR USB 162 zu entwerfen. Auf dem Entwicklerboard

Mehr