Realisierung eines 3D-Spiels mittels Lightwave3D und Java3D Hristo Matev Cactus WS 03/04...

Post on 05-Apr-2015

103 views 0 download

Transcript of Realisierung eines 3D-Spiels mittels Lightwave3D und Java3D Hristo Matev Cactus WS 03/04...

Realisierung eines 3D-Spiels mittels Lightwave3D und

Java3D

Hristo Matev

Cactus

WS 03/04

Systemprogrammierung

Lightwave3D Animation

• Motion Designer

• FX_Particles

• Displacement Mapping

• Lichteinstellungen

• Morphing

Spielprogrammierung (Überblick) Terrainmodellierung (Raumauswahl) Modellierung der Roboter Andere Objekte in der Szene Object Loader Collision Detection Terrain Following Texturen Navigation (Tastatur, Maus) SpielLogic Fullscreen Konfigurationsdatei Programmparameter

Raumauswahl (Objekten)

"terrain.obj" - Alle Polygone auf die man gehen darf

(terrain following)

"robot.obj" - Der Gegner (collision avoidance)

"house.obj" - Gebäuden (collision avoidance)

"rockterrain.obj" - Felsen (terrain following)

"rockcollide.obj" - Felsen (collision avoidance)

"tree.obj" - Bäume (collision avoidance)

"spikey.obj" - Das Ziel (die Waffe - (collision avoidance))

Raumauswahl (Texturen)

textures/ - Verzeichnis

"terrain.obj" - "terrain. jpg "

"robot.obj" - "robot. jpg "

"house.obj" - "house. jpg "

"rockterrain.obj" - "rock. jpg "

"rockcollide.obj" - "rock. jpg "

"tree.obj" - "tree.jpg"

"spikey.obj" - "rock. jpg "

Object Loader (.obj Dateiaufbau)

... // .obj Dateiaufbauv 0.492718 0.380423 -0.855566 // Vertex Indexv 0.602765 0.200857 -1.03957v 0.399957 0.567413 -0.963151v 0.363275 0.444858 -1.14095# Face listg usemtl Defaultf 3 2 1 // Face Structureg f 4 3 1g f 5 4 1...

• Warum einen neuen Objekt-Loader?

Object Loader (Aufbau)

while ((line = br.readLine()) != null){ if (line.startsWith("v")){ ... v.addElement(new Point3f(x, y, z)); } else if (line.startsWith("f")){ StringTokenizer st = new StringTokenizer(line.substring(1)); while (st.hasMoreTokens()) { int point = Integer.valueOf(st.nextToken()).intValue() - 1; ta.setCoordinate(index++, (Point3f) v.elementAt(point)); ta.setColor(index - 1,(index % 2 == 0) ? new Color3f(1f, 1f, 1f) : new Color3f(0f, 0f, 0f));...

ta.setCapability(TriangleArray.ALLOW_INTERSECT); ta.setCapability(TriangleArray.ALLOW_COUNT_READ); ta.setCapability(TriangleArray.ALLOW_FORMAT_READ); ta.setCapability(TriangleArray.ALLOW_COORDINATE_READ);

Collision Detection Collision Avoidance

Collision Avoidance ist ein Mechanismus bei dem man die zukünftige Position basierend auf der momentanen Bewegung des Benutzers ermittelt und vermeidet das der Benutzer zufällig z.B. durch die Wand geht.

Java3D stellt aber lediglich ein Collision Detection System zur Verfügung, alles anderes muss vom Programmierer übernommen werden.

Collision Detection Terrain Following

Terrain Eigenschaften

Terrain Änderungen (Positive) Änderung (Negative) Änderung

Collision Detection

Eine BranchGroup für jeden Typ der Kollisionsabfrage

Folge:

Unterteilung der

Gesamtszene auf nicht

zusammengehörige

Objekten

Collision Detection

Collision Avoidance Terrain Followingprivate final Vector3d AHEAD = new Vector3d (0.0, 0.0, -1.0);private final Vector3d BACKWARD = new Vector3d (0.0, 0.0, 1.0);private final Vector3d RIGHT = new Vector3d (1.0, 0.0, 0.0);private final Vector3d LEFT = new Vector3d (-1.0, 0.0, 0.0);..picktool.setShapeRay (kameraPoint, futureVector);pr = picktool.pickClosest (); if (pr != null) { pi = pr.getIntersection (0); intersectionPoints [directionIndex] =

pi.getPointCoordinatesVW();

Bewegung des Spielers mit Tasten und Maus (Key-Navigation)

public KNBehavior(TransformGroup tg,MouseBehavior mouseBeh,Collision globalCollision){

this.tg = tg; this.mouseBeh = mouseBeh; this.globalCollision = globalCollision; conditions[0] = new WakeupOnAWTEvent(KeyEvent.KEY_PRESSED); conditions[1] = new WakeupOnAWTEvent(KeyEvent.KEY_RELEASED); w = new WakeupOr(conditions);}...case KeyEvent.VK_UP : if (!globalCollision.getAHEAD()) { tg.getTransform(tu); tu.mul(translateU); tg.setTransform(tu); };break;

Bewegung des Spielers mit Tasten und Maus (Maus-Navigation)

if (usermove == true){ MouseEvent evt = (MouseEvent) evts[last]; newPoint.setLocation(evt.getX(), evt.getY()); tg.getTransform(transform3D); transform3DtmpY.rotY(Math.toRadians(center.x - newPoint.x)); transform3D.mul(transform3DtmpY); tg.setTransform(transform3D); center.setLocation(canvas.getWidth()/2, canvas.getHeight()/2); usermove = false; robot.mouseMove(center.x, center.y);}else if (usermove == false){ usermove = true;};

Fullscreen (OpenGL)if (fullscreenModeOGL == true){

DisplayMode mode = new DisplayMode (1280, 1024, 32, DisplayMode.REFRESH_RATE_UNKNOWN);

boolean isFullScreen = device.isFullScreenSupported(); setUndecorated (isFullScreen); setResizable (!isFullScreen); if (isFullScreen){ device.setFullScreenWindow(this); fullscreenIsOn = true; validate();...mouseBeh.setFullscreenGame (fullscreenIsOn);... // MouseBehavior - KlassenewPoint.setLocation(evt.getX(), evt.getY()); if (fullscreenIsOn == false){ // auch fuer D3D SwingUtilities.convertPointToScreen(newPoint, canvas);...

Programmparameter -Mpdebug

(Macht den ersten Punkt, der nach vorne von der Picking-Routine gefunden wird, sichtbar. Man setzt an dieser Stelle einfach eine kleine Sphäre)

-Mfullscreen(Setzt den Fullscreen – Mode auf Java3D für OpenGL)

-MfullscreenD3D(Setzt den Fullscreen – Mode auf Java3D für Direct3D -> mit ALT+ENTER aktivieren)

-Mnocursor(macht den Mauscursor unsichtbar)

-Mnomouse(Mausereignisse werden nicht berücksichtigt)

-Mtextures(Aktiviert die Texturen für diesen Level)

-D<dir-name>(Aktiviert einen neuen Level und erwartet ein Verzeichnis z.B. -Dnexus)

-C<count>(Erwartet die Anzahl von Roboter-Gegner. Dieser Parameter überschreibt den Wert in der Konfigurationsdatei. Wenn nicht vorhanden, wird die Konfigurationsdatei benutzt)