c536e97876ba0172bb3d92551a5e6c4d.ppt
- Количество слайдов: 16
Realisierung eines 3 D-Spiels mittels Lightwave 3 D und Java 3 D Cactus Systemprogrammierung WS 03/04 Hristo Matev
Lightwave 3 D Animation • Motion Designer • FX_Particles • Displacement Mapping • Lichteinstellungen • Morphing
Spielprogrammierung (Überblick) n n n Terrainmodellierung (Raumauswahl) Modellierung der Roboter Andere Objekte in der Szene Object Loader Collision Detection Terrain Following Texturen Navigation (Tastatur, Maus) Spiel. Logic Fullscreen Konfigurationsdatei Programmparameter
Raumauswahl (Objekten) "terrain. obj" "robot. obj" "house. obj" "rockterrain. obj" "rockcollide. obj" "tree. obj" "spikey. obj" - Alle Polygone auf die man gehen darf (terrain following) - Der Gegner (collision avoidance) - Gebäuden (collision avoidance) - Felsen (terrain following) - Felsen (collision avoidance) - Bäume (collision avoidance) - Das Ziel (die Waffe - (collision avoidance))
Raumauswahl (Texturen) textures/ - Verzeichnis "terrain. obj" "robot. obj" "house. obj" "rockterrain. obj" "rockcollide. obj" "tree. obj" "spikey. obj" - "terrain. jpg " "robot. jpg " "house. jpg " "rock. jpg " "tree. jpg" "rock. jpg "
Object Loader (. obj Dateiaufbau) • Warum einen neuen Objekt-Loader? . . . //. obj Dateiaufbau v 0. 492718 0. 380423 -0. 855566 v 0. 602765 0. 200857 -1. 03957 v 0. 399957 0. 567413 -0. 963151 v 0. 363275 0. 444858 -1. 14095 # Face list g usemtl Default f 321 g f 431 g f 541. . . // Vertex Index // Face Structure
Object Loader (Aufbau) while ((line = br. read. Line()) != null){ if (line. starts. With("v")){. . . v. add. Element(new Point 3 f(x, y, z)); } else if (line. starts. With("f")){ String. Tokenizer st = new String. Tokenizer(line. substring(1)); while (st. has. More. Tokens()) { int point = Integer. value. Of(st. next. Token()). int. Value() - 1; ta. set. Coordinate(index++, (Point 3 f) v. element. At(point)); ta. set. Color(index - 1, (index % 2 == 0) ? new Color 3 f(1 f, 1 f) : new Color 3 f(0 f, 0 f)); . . . ta. set. Capability(Triangle. Array. ALLOW_INTERSECT); ta. set. Capability(Triangle. Array. ALLOW_COUNT_READ); ta. set. Capability(Triangle. Array. ALLOW_FORMAT_READ); ta. set. Capability(Triangle. Array. ALLOW_COORDINATE_READ);
Collision Detection Collision Avoidance n n 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. Java 3 D stellt aber lediglich ein Collision Detection System zur Verfügung, alles anderes muss vom Programmierer übernommen werden.
Collision Detection Terrain Following n Terrain Eigenschaften n Terrain Änderungen n n (Positive) Änderung (Negative) Änderung
Collision Detection n Eine Branch. Group für jeden Typ der Kollisionsabfrage Folge: Unterteilung der Gesamtszene auf nicht zusammengehörige Objekten n
Collision Detection n n Collision Avoidance Terrain Following private final Vector 3 d AHEAD = new Vector 3 d (0. 0, -1. 0); private final Vector 3 d BACKWARD = new Vector 3 d (0. 0, 1. 0); private final Vector 3 d RIGHT = new Vector 3 d (1. 0, 0. 0); private final Vector 3 d LEFT = new Vector 3 d (-1. 0, 0. 0); . . picktool. set. Shape. Ray (kamera. Point, future. Vector); pr = picktool. pick. Closest (); if (pr != null) { pi = pr. get. Intersection (0); intersection. Points [direction. Index] = pi. get. Point. Coordinates. VW();
Bewegung des Spielers mit Tasten und Maus (Key-Navigation) public KNBehavior(Transform. Group tg, Mouse. Behavior mouse. Beh, Collision global. Collision){ this. tg = tg; this. mouse. Beh = mouse. Beh; this. global. Collision = global. Collision; conditions[0] = new Wakeup. On. AWTEvent(Key. Event. KEY_PRESSED); conditions[1] = new Wakeup. On. AWTEvent(Key. Event. KEY_RELEASED); w = new Wakeup. Or(conditions); }. . . case Key. Event. VK_UP : if (!global. Collision. get. AHEAD()) { tg. get. Transform(tu); tu. mul(translate. U); tg. set. Transform(tu); }; break;
Bewegung des Spielers mit Tasten und Maus (Maus-Navigation) if (usermove == true) { Mouse. Event evt = (Mouse. Event) evts[last]; new. Point. set. Location(evt. get. X(), evt. get. Y()); tg. get. Transform(transform 3 D); transform 3 Dtmp. Y. rot. Y(Math. to. Radians(center. x - new. Point. x)); transform 3 D. mul(transform 3 Dtmp. Y); tg. set. Transform(transform 3 D); center. set. Location(canvas. get. Width()/2, canvas. get. Height()/2); usermove = false; robot. mouse. Move(center. x, center. y); } else if (usermove == false) { usermove = true; };
Fullscreen (Open. GL) if (fullscreen. Mode. OGL == true){ Display. Mode mode = new Display. Mode (1280, 1024, 32, Display. Mode. REFRESH_RATE_UNKNOWN); boolean is. Full. Screen = device. is. Full. Screen. Supported(); set. Undecorated (is. Full. Screen); set. Resizable (!is. Full. Screen); if (is. Full. Screen){ device. set. Full. Screen. Window(this); fullscreen. Is. On = true; validate(); . . . mouse. Beh. set. Fullscreen. Game (fullscreen. Is. On); . . . // Mouse. Behavior - Klasse new. Point. set. Location(evt. get. X(), evt. get. Y()); if (fullscreen. Is. On == false){ // auch fuer D 3 D Swing. Utilities. convert. Point. To. Screen(new. Point, canvas); . . .
Programmparameter n n n n -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 Java 3 D für Open. GL) -Mfullscreen. D 3 D (Setzt den Fullscreen – Mode auf Java 3 D für Direct 3 D -> mit ALT+ENTER aktivieren) -Mnocursor (macht den Mauscursor unsichtbar) -Mnomouse (Mausereignisse werden nicht berücksichtigt) -Mtextures (Aktiviert die Texturen für diesen Level) -D
Literatur n 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 Light. Wave http: //j 3 d. org // Allgemein zu Java 3 D http: //java. sun. com/docs/books/tutorial/extra/fullscreen/ // Der Fullscreen Exclusive Mode


