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

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

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

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

Realisierung eines 3D-Spiels mittels Lightwave3D und

Java3D

Hristo Matev

Cactus

WS 03/04

Systemprogrammierung

Page 2: 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

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

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

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

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))

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

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 "

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

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?

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

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);

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

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.

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

Collision Detection Terrain Following

Terrain Eigenschaften

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

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

Collision Detection

Eine BranchGroup für jeden Typ der Kollisionsabfrage

Folge:

Unterteilung der

Gesamtszene auf nicht

zusammengehörige

Objekten

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

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();

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

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;

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

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;};

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

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);...

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

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)