I - Phone 3D 3D Spielentwicklung für das I-Phone
Gliederung Allgemein Open GL ES Arbeitsschritte / 3D Grafik Ein Spiel entsteht Ein Beispiel
Vorgehensweise Allgemein Erzeugen von Modellen Komplexe Modelle in externen Programmen Positionierung dieser Modelle im Raum Bewegung / Animation der Modelle Kollisionsprüfung untereinander Positionierung der Kamera (Blickwinkel des Betrachters) >>> egal ob Rennspiel oder Egoshooter
Open GL ES Open Graphics Library for Embedded Systems Vereinfachte Version von Open GL für mobile Systeme Khronos.org Apple, Sony, Google, Nokia, Samsung,... Für 3D Spiele absolut notwendig 3D Koordinatensystem (x, y, z) Bei 2D Spielen wir z = 0 gesetzt Hardware und Open GL ES arbeiten über spezielle Schnittstelle zusammen EGL (Bei ios EAGL)
Open GL ES MyGameAppDelegate initiallisiert MainView, startet Spielschleife MainView initiallisiert OpenGL, GameManager, leitet den Touch-Input an den GameManager weiter GameManager Perspektive, "drawstateswithframes"- Methode (Rendern des Spiels), Verarbeitung > Touch-Input, Koordinierung OpenGLES Framework nicht vergessen!
Vorgehensweise Allgemein - (void) setoglprojection {... //Set View glmatrixmode(gl_projection); Objekte vor oder hinter znear & zfar nicht sichtbar Ist zfar zu groß gewählt leidet die Performence ZNear = 0.1; // muss größer 0 sein! zfar = 2500; FieldOfViewAngle = 45; // Blickwinkel float top = znear * tan(m_pi * fieldofviewangle / W); float bottom = -top; float left = bottom * W / H; //Seitenverhaeltnis: W / H; float right = top * W / H; glfrustumf(left, right, bottom, top, znear, zfar); // Perspektive d. Spielgeschehens...
Das 3D-Koordinatensystem 0-Punkt liegt in der Mitte Negative Z-Achse läuft in Bildschirm hinein Gegensatz zu DirectX Ein Punkt P(10,30,-20) bezieht sich nicht auf Pixelangaben man spricht von Einheiten Pixel sich erst aufgrund der Perspektive & Kameraposition
Einfache Objekte (void) drawrectangle { GLbyte vertices [ ] = { // Koordinatenpunkte -1, 1, 0, // Vertex 1 // links oben 1, 1, 0, // Vertex 2 // rechts oben -1, -1,0, // links unten 1, -1, 0 } // rechts unten glpushmatrix(); // verschiebt das Koordinatensystem ins Sichtfeld glcolor4f(1, 0, 0, 1); // Zeichenfarbe (Rot, Grün, Blau, Helligkeit) glvertexpointer(3, GL_BYTE, 0, vertices); // Werte pro Eckpunkt gltranslatef(0, 0, -6); // Verschiebung um 6 vor Sichtgrenze static int angle = 0; angle += 2; glrotatef (angle, 1, 0, 0); // Rotation um x Achse gldrawarrays(gl_triangle_strip, 0, 4); // 4 = Anzahl der Eckpunkte glpopmatrix(); }
Formen in OpenGL ES
Objekte importieren Möglich! >> Obj-Format Zum Beispiel mit 3Ds Max, Maya, Blender,... Vertex-Array Eckpunkt eines Dreiecks Normal-Array Rechter Winkel zur Fläche Texturkoordinaten-Array Faces-Array Platzsparende Speichermethode von Punkten, bezieht diese aufeinander
Quellcode Tex *tex = [[GameManager getinstance] gettex: @"asteroid.png" isimage: YES]; textureid = [tex gettextureid]; GLfloat verticesobjdata[ ] = { -0.207126, -0.066316, 23.264721,... }; GLfloat texturecoordsobjdata[ ] = { 0.511933, 0.499667, 0.753190,... }; GLfloat normalsobjdata[ ] = { 0.003697, -0.091516, 0.960635,... }; GLushort facesobjdata[ ] = { 0, 6, 8, 56, 57, 30, 56, 30, 58, 58, 30,... }; glenable(gl_cull_face); // nicht sichtbare Flächen ignorieren glcullface(gl_back); glenable(gl_texture_2d); // alle Flächen werden nun texturiert... gldisable(gl_texture_2d); // nach Abschluss, Clean up gldisable(gl_cull_face);
Licht hinzufügen Verschiedene Lichtarten GL_AMBIENT Richtungsloses Licht GL_DIFFUSE Gerichtetes Licht oberflächenreflektion gering, immer gleich GL_SPECULAR Spot mit klarer Reflektion, super z.b. für Billardkugeln Maximal 8 Lichtquellen GL_LIGHT0,...
Licht hinzufügen Im GameManager > in die (void) setoglprojection glenable(gl_lighting); //Licht ermoeglichen glenable(gl_color_material); //Standard-Material-Reflektion glenable(gl_light0); GLfloat color0[ ] = {1, 1, 1, 1}; //Farbe des Lichts gllightfv(gl_light0, GL_DIFFUSE, color0); //Art des Lichts = "diffus" GLfloat light_position0[ ] = {0, 1, 0, 0}; //Licht kommt von oben gllightfv(gl_light0, GL_POSITION, light_position0); //Lichtquelle positionieren
Kamera / Betrachter Kriterien die wir erfüllen wollen... 1. Kamera soll an jeder Position aufgestellt werden können 2. Von dort soll Blick-Richtung frei veränderbar sein Pro Frame müssen Position und Blickrichtung veränderbar sein Methode: Matrizenoperation > Transformierung der 3D Szene Nicht Kamera wird durch die Szene bewegt, sondern Objekte in Szene werden bewegt Vorgefertigte GLU-Blibliothek wie für OpenGL gibt es für die mobile Variante nicht Folge: eigene Implementierung oder Orientierung an freien Algorithmen
Ein Spiel entsteht Steuerung Bewegungssensor / Touchscreen Spielelemente Spieler, Laser-Geschosse, Asteroiden, Spionagesateliten, Texteinblendungen Aufteilung der einzelnen "Sprites"* unter eine Hauptklasse *einzelne Objekte > z.b.: Positionierungsmethoden Besonderheiten festlegen Behandlung der unterschiedliche States vorbereiten LOAD_GAME, PLAY_GAME, GAME_OVER
Spielzustände / Spielschleife - (void) drawstateswithframe: (CGRect) frame { switch (state) { // Spielstatus wird abgefragt case LOAD_GAME: [self loadgame]; // loadgame wird ausgeführt [self createogltext: @"GOOD LUCK" offsetx: 2 offsety: 2 selfdestroy: YES]; state = PLAY_GAME; break; // Status wird auf "PLAY_GAME" gesetzt case PLAY_GAME: [self playgame]; break; // playgame wird ausgeführt case GAME_OVER: [self gameover]; break; // gameover wird ausgeführt default: NSLog(@"ERROR: Unbekannter Spielzustand: %i", state); break; } }
Kollisionsprüfung - (void) checksprite: (Sprite *) sprite { Player *player = [self getplayer]; if ([sprite gettype] == ASTEROID [sprite gettype] == OBSTACLE) { if ([player checkcolwithsprite: sprite]) { [self createogltext: @"DAMAGED!!" offsetx: 2 offsety: 1 selfdestroy: YES]; [sprite hit]; [player hit]; } } if ([sprite gettype] == OBSTACLE) { for (Sprite *bullet in sprites) { if ([bullet gettype] == BULLET) { if ([bullet checkcolwithsprite: sprite]) { [self createogltext: @"DESTROYED" offsetx: 2 offsety: 1 selfdestroy: YES]; [sprite hit]; [bullet hit];...
Das Beispiel...
Vielen Dank für's zuhören!
Quellenangaben Informationen: Vgl. Spiele entwickeln für ipad, iphone und ipod touch, von: Thomas Lucka, Carl Hanser Verlag, München 2011 http://www.khronos.org/opengles/ http://www.informit.com/articles/article.aspx?p=461848 http://www.qioo.de/projekte/buch/iphonegames/ Bilder: http://www.macazin.de/wp-content/uploads/2009/03/vw-polo-spiel.jpg http://www.prlog.org/11571220-iphone-3d-game.jpg http://www.vitsly.ru/lj-shaken/lj-shaken-obj-export.jpg http://ptgmedia.pearsoncmg.com/images/chap2_0321336798/elementlinks/02fig01.gif