Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

3D Játékok készítése OpenGL környezetben Szirmay-Kalos László Irányítástechnika és Informatika Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem email:

Hasonló előadás


Az előadások a következő témára: "3D Játékok készítése OpenGL környezetben Szirmay-Kalos László Irányítástechnika és Informatika Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem email:"— Előadás másolata:

1 3D Játékok készítése OpenGL környezetben Szirmay-Kalos László Irányítástechnika és Informatika Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem Web:

2 3D játékok Self Enemy AI Field objects

3 Virtuális valóság Virtuális világ avatar vezérlés képszintézis interakció

4 Játékok feladatai l Képszintézis az avatár nézőpontjából l Az avatár vezérlése a beviteli eszközökkel (keyboard, mouse) l Az „intelligens” virtuális objektumok vezérlése (AI) l A fizikai világ szimulációja

5 Játékok Virtuális világ avatár vezérlés képszintézis interakció AnimateIt(dt), DrawIt() ControlIt(dt) ProcessInput(), SetCameraTransform()

6 Játékobjektumok l ControlIt: –„gondolkodik” és a lehetséges vezérléséket alkalmazza (pl. rakéták) l InteractIt: –Társalog másokkal, tájékoztat az állapotáról l AnimateIt: –A következő helyre és orientációba megy l DrawIt: –Felrajzolja magát a képernyőre

7 Szimulációs hurok (Game loop) void IdleFunc( ) { // idle call back float old_time = time; time = glutGet( GLUT_ELAPSED_TIME ); float dt = time - old_time; avatar -> ProcessInput( ); world -> Control( dt ); world -> Animate( dt ); glClearColor(0, 0, 0, 0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); avatar -> SetCameraTransform(); world -> Draw(); glutSwapBuffers( ); } dt

8 A virtuális világ (Scene graph) l Objektumok dinamikusak (öldöklés) l Különböző objektumtípusok (heterogén kollekció) l Láncolt lista (fák) ship1ship2 avatar spacesun world bullet explosion Join: új elem hozzávétele KillIt: egy elem eltávolítása

9 Bolygó l Geometria: gömb l Textúra l Fizikai vagy képletanimáció

10 Gömbfelület mint háromszög háló: Tesszelláció 1. Paraméteres egyenlet: x = x0 + r cos 2  u sin  v y = y0 + r sin 2  u sin  v z = z0 + r cos  v u,v  [0,1] 2. Paramétertér háromszögesítése + behelyettesítés

11 GLU kvadratikus felület // definition GLUquadricObj * quadric = gluNewQuadric( ); gluQuadricTexture(quadric, GL_TRUE); // draw gluSphere(quadric, R, 16, 10);

12 Forog a Föld: Animate, Draw void Planet :: AnimateIt( float dt ) { rot_angle += rot_speed * dt; if (angle > 360.0) rot_angle -= 360.0; } void Planet :: DrawIt( ) { glBindTexture(GL_TEXTURE_2D, earth_texture); glPushMatrix( ); glRotatef( rot_angle, 0, 0, 1 ); gluSphere( quadric, radius, 16, 10 ); glPopMatrix( ); }

13 A Föld kering a Nap körül dist rot_angle rev_angle void Planet::AnimateIt(float dt){ rot_angle += rot_speed * dt; rev_angle += rev_speed * dt; } void Planet::DrawIt( ) { glBindTexture(GL_TEXTURE_2D, earth_texture); glPushMatrix( ); glRotatef(rev_angle, 0, 0, 1); glTranslatef(dist, 0, 0 ); glRotatef(rot_angle, 0, 0, 1); gluSphere(quadric, 1, 16, 10); glPopMatrix( ); }

14 Az űr void Space :: DrawIt( ) { glBindTexture(GL_TEXTURE_2D, space_texture); glBegin(GL_QUADS); glTexCoord2f(0, 0); glVertex3i(-SS, -SS, -SS); glTexCoord2f(0, 1); glVertex3i(-SS, SS, -SS); glTexCoord2f(1, 1); glVertex3i( SS, SS, -SS); glTexCoord2f(1, 0); glVertex3i( SS, -SS, -SS);... glEnd(); } SS,SS,SS -SS,-SS,-SS

15 Az űrhajó l Komplex geometria –négyszögháló l Komplex textúra l Fizikai animáció –erők (gravitáció, rakéták) –ütközések l Viselkedés (AI) –A rakéták vezérlése l Ütközés elkerülés, avatártól menekülés, avatár üldözése

16 Űrhajó geometria

17 Poligon modellezés: 1. extruding

18 Poligon modellezés: 2. extruding

19 Poligon modellezés: 4. és 5. extruding

20 Poligon modellezés: 6. extruding

21 Subdivision simítás: 1 szint

22 Subdivision simítás: 2. szint

23 Textúra függvény definíciója (0,0) (1,1)

24 Textúra függvény definíciója

25 Textúrázott űrhajó

26 Animate: Newton mozgástörvényei force m void Ship :: AnimateIt( float dt ) { acceleration = force/m; velocity += acceleration * dt; position += velocity * dt; } void Ship :: DrawIt() { glPushMatrix( ); glTranslatef(position.x, position.y, position.z); glBegin( GL_QUADS );... ; glEnd( ); glPopMatrix(); } velocity position

27 Orientáció beállítása void Ship :: DrawIt() { glPushMatrix( ); glTranslatef(position.x, position.y, position.z); Vector modell_head( 0, 0, 1 ); Vector world_head = velocity.UnitVector(); Vector rotate_axis = modell_head % world_head; float cos_rotate_angle = world_head * modell_head; glRotatef( acos(cos_rotate_angle)* 180 / M_PI, rotate_axis.x,rotate_axis.y,rotate_axis.z); glBegin( GL_QUADS );... ; glEnd( ); glPopMatrix( ); } modell_head world_head = velocity.UnitVector();

28 Ship :: ControlIt void Ship :: ControlIt( float dt ) { force = Vector(0, 0, 0); Interact( world ); } ship1ship2 avatar spacesun world bullet explosion void Ship::InteractIt( GameObject * object )

29 Ship: InteractIt void Ship :: InteractIt( GameObject * object ) { if ( object->GetType( ) == PLANET ) { } if ( object->GetType( ) == AVATAR ) { } F = f m·M r 2 avatar bullet aiming angle

30 Ütközésdetektálás lassú objektumok között dist = obj1.position - obj2.position min = obj1.BoundingRadius() + obj2.BoundingRadius() if (dist.Length() < min) Collision! adott t Probléma, ha az objektum gyors t t +  t

31 Lövedék l Nagyon komplex geometria l Hasonló kinézet minden irányból l Könnyebb a képét használni l Ütközésdetektálás = gyors mozgás transparent

32 Plakátok: Billboards l Egyetlen félig átlátszó textúra egy téglalapon pos QUAD TmodellTviewTperspective xyzxyz XYZXYZ pozíció orientáció kamera pozíció kamera orientáció

33 Bullet :: DrawIt void Bullet :: DrawIt() { A modell transzformáció forgatási részével a nézeti transzformáció forgatási részét kompenzáljuk glEnable(GL_BLEND);// transparency glBlendFunc(GL_SRC_ALPHA, GL_ONE); glBegin(GL_QUADS); glTexCoord2f(0, 0); glVertex2f(-size, -size); glTexCoord2f(1, 0); glVertex2f(size, -size); glTexCoord2f(1, 1); glVertex2f(size, size); glTexCoord2f(0, 1); glVertex2f(-size, size); glEnd(); glDisable(GL_BLEND); }

34 Gyors ütközésdetektálás: ray-tracing velocity rel_velocity = velocity - vel2 ray: position + rel_velocity ·t If (ray intersects bounding sphere first AND tintersect < dt) Collision! hit_object = world->Intersect(position,velocity,t); ship1ship2 avatar spacesun world bullet explosion position vel2

35 Robbanás l Nagyon komplex geometria l Hasonló kinézet minden irányból l Plakátgyűjtemény l Részecske rendszer

36 Részecske rendszerek position:position += velocity * dt velocity:velocity += acceleration * dt acceleration:acceleration = force / weight lifetime age:age += dt; if (age > lifetime) Kill(); size, dsize:size += dsize * dt; weight, dweight:weight += dweight * dt color, dcolor:color += dcolor * dt Globális erőtér (szél fújja a füstöt) Véletlen Kezdeti értékek

37 Robbanás paraméterei position = center; // initially focused lifetime = Rand(2, 1); size = 0.001; // initially small dsize = Rand(0.5, 0.25) / lifetime; velocity = Vector(Rand(0,0.4),Rand(0,0.4),Rand(0,0.4)); acceleration = Vector(Rand(0,1),Rand(0,1),Rand(0,1)); // from yellow opaque animate to reddish transparent color = Color(1, Rand(0.5, 0.25) 0, 1 ); dcolor = Color(0, -0.25, 0, -1) / lifetime; Rand(mean, var) mean var

38 Avatár l A viselkedését a klaviatúra vezérli: –ProcessInput l A helye és iránya viszi a kamerát –SetCameraTransform l Olyan mint egy űrhajó, de nem rajzoljuk –Control: gravitáció, lövedék ütközés

39 Klaviatúra kezelés KeyboardFunc KeyboardUpFunc SpecialKeysFunc SpecialKeysUpFunc input IdleFunc: GameLoop virtual world IsSpace, IsLeft, IsRight, IsUp, IsDown

40 Avatar :: ProcessInput Avatar :: ProcessInput( GLUTWindow * input ) { if ( input->IsSpace( ) )// shoot world -> Join(new Bullet(position, velocity)); Vector head = velocity.UnitVector(); if ( input->IsUp() ) force += up * (-1); if ( input->IsDown() ) force += up; if ( input->IsLeft() ) force += up % head; if ( input->IsRight() ) force += head % up; }

41 Avatar :: SetCameraTransform Avatar :: SetCameraTransform( ) { glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(position.x, position.y, position.z, position.x + head.x, position.y + head.y, position.z + head.z, up.x, up.y, up.z); } eye lookat up = [0, 1, 0] vagy a gyorsulásból és a korábbi up átlagából

42 Játékmotor GameObject position, velocity, acceleration ControlIt(float dt ) AnimateIt(float dt) InteractIt( GameObject * o) DrawIt( ) IntersectIt(Ray r, float& t) Member Control, Animate, Draw Interact, Intersect, Join TexturedObject next Avatar ProcessInput() SetCameraTransform() Texture Load( char * fname) BillBoard DrawIt() ParticleSystem Emit(int n) Particle GLUTWindow GameEngine DisplayFunc IdleFunc KeyPress world avatar 500 C++ sor

43 Űrjáték TexturedObject Avatar BillBoard Space DrawIt Planet DrawIt AnimateIt Self ProcessInput ControlIt InteractIt Bullet ControlIt Ship DrawIt InteractIt ControlIt GameEngine SpaceGame 350 C++ sor

44 Egy földi lövöldözős játék

45 Terepek l Komplex geometria –magasságmező l Bonyolult textúra l Nem gondolkodik l Nem mozog l Ütközés detektálás kell l Megemeli az objektumokat

46 Terep geometria z x,y x y z z = height(x,y) Magasságmező: Diszkrét minták + Lineáris interpoláció

47 Diszkrét minták = FF kép Magasság mezőHáromszög háló

48 Háromszögek számának csökkentése: Level of detail Balogh Z., Jakab G.

49 Magasságmező textúrázás: vetítés felülről y x u v

50 Tereptextúra javítás: Multitextúrázás, Detail map Balogh Z., Jakab G.

51 Terep ütközés detektálás if (height(x,y) > z) Collision! Séta a terepen: Position(x, y) = (x, y, height(x,y) + legsize) z x,y

52 Bi-lineáris magasságmező interpoláció float Terrain :: Height( float x, float y ) { x += wwidth/2; y += wlength/2; x = x / wwidth * w; y = y / wlength * l; int X = (int)x, Y = (int)y; float h1 = height_field[X][Y] * wheight; float h2 = height_field[X+1][Y] * wheight; float h3 = height_field[X][Y+1] * wheight; float h4 = height_field[X+1][Y+1] * wheight; float xd = x - X; float yd = y - Y; float hx1 = h1 + xd * (h2 - h1); float hx2 = h3 + xd * (h4 - h3); return (hx1 + yd * (hx2 - hx1)); } x,y X,Y

53 Ég l Valamire textúrázott kép: –gömb l Geometria: dóm, gömb, téglatest l Nincs –vezérlés, –animáció, –ütközésdetektálás

54 GLU kvadratikus felület GLUquadricObj * quadric; // definition quadric = gluNewQuadric( ); gluQuadricTexture(quadric, GL_TRUE); // draw glBindTexture(GL_TEXTURE_2D, sky_texture_id); gluSphere(quadric, sky_radius, 32, 20);

55 Ellenség l Animált geometria –Kulcskeretekkel mozgásonként (clip) l Áll, fut, támad, meghal – poligonháló deformáció l Textúrák (animált) l AI l Ütközés detektálás

56 Kulcskeret animáció: futás

57 Interpoláció: Keretek a kulcskeretekből kulcskeretek t Nem lineáris interpoláció lineáris interpoláció

58 Mit interpoláljunk? l Minőségi animáció: –Newton törvények: C 2 C 1 spline interpoláció –Interpolált keretekre is a fiziológiai tv. betartása: l Csont animáció l Játékok: –Lineáris interpoláció –A poligonháló csúcspontjait interpoláljuk l Poligonháló deformáció (Mesh morphing)

59 Mesh morphing: t= 0 t= 1 Két közrefogó kulcskeret Idő: t Aktuális csúcspontok Minden csúcsra lineáris interpoláció

60 Futás poligonháló deformációval + pozíció animáció: position += velocity * dt

61 Mozgás definíció l Clip-ek definíciója kulcskeretekkel l Összes clip összes kulcskeretek fájlban: MD2, MD3 l Tipikus clip-ek: –Run, stand, attack, die, pain, salute, crouch, wave, point, taunt, etc.

62 Clip-ek Áll 40 kulcskeret Fut 5 kulcskeret Szalutál 11 kulcskeret

63 Mozgásvezérlés AI state AI motor Keyframe animation Clip = start, stop keyframe Keyframe-ek MD2 fájlban Idő: t A háromszög háló csúcspontjai

64 Ellenség AI Dont CareEscape Chase Attack Dying Dist < 4 && Avatar_angle > 60 Dist < 4 && Avatar_angle < 40 Collision with the bullet Dist < 1 Dist > 1 Dist > 6 Avatar_angle < 20 Avatar_angle Avatar

65 Textúrázás

66 Golyó l Geometria: gömb l Textúrázott l Nem intelligens l Fizikai animáció

67 Lövedék fizikai animációja t t+dt acceleration = (0, 0, -g) velocity += acceleration * dt position += velocity * dt force, acceleration velocity

68 Röpül a lövedék: Animate, Draw void Bullet::AnimateIt( float dt ) { acceleration = Vector(0,0,-g); velocity += acceleration * dt; position += velocity * dt; } void Bullet::DrawIt( ) { glPushMatrix( ); glTranslate(position.x, position.y, position.z); glBindTexture(GL_TEXTURE_2D, bullet_texture); gluSphere(quadric, 1.0, 16, 10); glPopMatrix( ); }


Letölteni ppt "3D Játékok készítése OpenGL környezetben Szirmay-Kalos László Irányítástechnika és Informatika Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem email:"

Hasonló előadás


Google Hirdetések