Realisierung eines 3D-Spiels mittels Lightwave3D und Java3D Hristo Matev Cactus WS 03/04...
-
Upload
adelonda-mundis -
Category
Documents
-
view
103 -
download
0
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)
Literatur
Internet:
http://developer.nvidia.com/object/understanding_w.htm// Was ist die w-Koordinate
http://www.animationartist.com/2000/Tutorials/LWTrees/lwtrees.html// Bäume mit LightWave
http://j3d.org// Allgemein zu Java3D
http://java.sun.com/docs/books/tutorial/extra/fullscreen/// Der Fullscreen Exclusive Mode