3D Játékok készítése OpenGL környezetben

Slides:



Advertisements
Hasonló előadás
BSP-fák használata játék- engine fejlesztésében a nagy kiterjedésű zárt terek megjelenítéséhez Előadó: Boromissza Gergely Konzulens: dr. Szirmay-Kalos.
Advertisements

Számold meg a fekete pontokat!
Grafika. 2 Mértékek és koordináta rendszer Használjuk a RGB és QBColor függvényeket a színekhez Grafika létrehozása Load/change picture futási időben.
 Árnyalási egyenlet  Saját emisszió  Adott irányú visszaverődés.
2D képszintézis Szirmay-Kalos László.
Globális illumináció (GI)
2D grafikus rendszerek Szirmay-Kalos László. 2D grafikus editor: GUI, use-case, dinamikus modell L L L R LD LU MouseLDown első pont MouseLDown második...
Inkrementális 3D képszintézis
Geometriai modellezés
2D grafikus rendszerek Szirmay-Kalos László.
Sugárkövetés: ray-casting, ray-tracing
Animáció Szirmay-Kalos László. Animáció = időfüggés T1(t)T1(t) T2(t)T2(t) TV(t)TV(t) Transzformációk alak szín megjelenítési attribútumok, stb.
OpenGL Szirmay-Kalos László In theory, there is no difference
2D képszintézis Szirmay-Kalos László. Számítógépes grafika feladata képszintézis Virtuális világ modell modellezés Metafórák: 2D rajzolás világ = sík.
Geometriai modellezés
Számítógépes grafika Szirmay-Kalos László
Sugárkövetés: ray-casting, ray-tracing Szirmay-Kalos László.
3D Játékok készítése OpenGL környezetben
Számítógépes grafika Szirmay-Kalos László
3D képszintézis fizikai alapmodellje
Grafikus játékok fejlesztése Szécsi László g11-physics
GPGPU labor I. OpenGL, Cg.
Számítógépes Grafika 6. gyakorlat Programtervező informatikus (esti)‏ 2009/2010 őszi félév.
STÍLUSOK Tulajdonságok és értékek. Színek megadási módjai H1 {color: #CCF150} H1 {color: rgb(204,241,80)} H1 {color: rgb(80%,95%,30%)} H1 {color: red}
Transzformációk kucg.korea.ac.kr.
Számítógépes grafika, PPKE-ITK, Benedek Csaba, D képszintézis 4. előadás.
Számítógépes grafika, PPKE-ITK, Benedek Csaba, 2010 Geometriai modellezés 2. előadás.
A számítógépes grafika céljai és feladatai
A virtuális technológia alapjai Dr. Horv á th L á szl ó Budapesti Műszaki Főiskola Neumann János Informatikai Kar, Intelligens Mérnöki Rendszerek.
2D képszintézis és textúrák
4.7. Textúra A felület anyagszerűsége Sík-képek ráborítása a felületre
Térfogatvizualizáció
Fraktálok és csempézések
Sugárkövetés: ray-casting, ray-tracing
1.Labor : Modellezés. Blender D:\GameDev\Blender3D\blender.exe D:\GameDev\Blender3D\blender.exe Ismerkedjünk az interface-el!!!
Játékfejlesztés Szirmay-Kalos László.
Számítógépes grafika Bevezetés
3D képszintézis fizikai alapmodellje Szirmay-Kalos László Science is either physics or stamp collecting. Rutherford.
Animáció Szirmay-Kalos László.
2D grafikus rendszerek Szirmay-Kalos László.
Plakátok, részecskerendszerek Grafikus játékok fejlesztése Szécsi László g09-billboard.
1 Mivel foglalkozunk a laborokon? 7. hét: Do-Loop-Until Do-Until-Looptömbök Function 7. hét: Do-Loop-Until és Do-Until-Loop ciklusok. Egy indexes tömbök,
Számítógépes Grafika 6. gyakorlat Programtervező informatikus (esti)‏ 2009/2010 őszi félév.
Fotorealisztikus képszintézis valós időben Szirmay-Kalos László, Csébfalvi Balázs BME IIT.
Számítógépes grafika, PPKE-ITK, Benedek Csaba, 2010 Geometriai modellezés 2. előadás.
Informatikai eszközök a virtuális valóság szolgálatában Hapák József ELTE-IK X. Eötvös Konferencia.
Web-grafika (VRML) 1. gyakorlat Nyitrai Erika Varga Balázs alapján Kereszty Gábor.
4.6. A Fénysugár-követés módszere (ray-tracing) Mi látható a képernyőn, egy-egy képpontjában ? És az ott milyen színű ? (4.7. Árnyalás)
A számítógépes grafika alapjai, PPKE-ITK, Benedek Csaba, 2010 Tanagyag forrás © Szirmay-Kalos László, BME A számítógépes grafika céljai és feladatai 1.
Képek, képfeldolgozás Szirmay-Kalos László.
Számítógépes grafika, PPKE-ITK, Benedek Csaba, 2010
Grafikus szoftver Szirmay-Kalos László. Interaktív programok felépítése input csővezeték output csővezeték.
Bemutatkozás Magdics Milán Született: Budapest, augusztus 30.
Realtime 3D rendszerek, Unity 3D Témalabor, 2016.
Játékfejlesztés Szirmay-Kalos László. Virtuális valóság Virtuális világ = objektumok + törvények avatár vezérlés képszintézis interakció.
Karakter Animáció és Kontroller Unity. Kezdeti lépések Alap projekt letöltése Egy statikus geometriát láthatunk Meg vannak a fizikai befoglalók is.
Sprite animáció, kamera követés, háttér mozgás
3D grafika összefoglalás
Unity 3D alapok + gyakorlás.
Grafikus Rendszerek 6. Camera.
Vizualizáció és képszintézis
03. GYAKORLAT Szervó motor.
Átlátszóság, csipkézettség, köd
Vizualizáció és képszintézis
Multiplayer böngészőben
GPGPU – CUDA 2..
JavaScript a böngészőben
World map.
C/C++, hobbi játékprogramozás
Függvénysablonok használata
Előadás másolata:

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: szirmay@iit.bme.hu Web: http://www.iit.bme.hu/~szirmay

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

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

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

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

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

Szimulációs hurok (Game loop) dt 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( ); }

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

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

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

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

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

A Föld kering a Nap körül 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( ); rot_angle rev_angle dist

Az űr void Space :: DrawIt( ) { glBindTexture(GL_TEXTURE_2D, SS,SS,SS 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

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

Űrhajó geometria

Poligon modellezés: 1. extruding

Poligon modellezés: 2. extruding

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

Poligon modellezés: 6. extruding

Subdivision simítás: 1 szint

Subdivision simítás: 2. szint

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

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

Textúrázott űrhajó

Animate: Newton mozgástörvényei force m position velocity 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();

Orientáció beállítása modell_head Orientáció beállítása world_head = velocity.UnitVector(); 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( ); }

Ship :: ControlIt void Ship :: ControlIt( float dt ) { force = Vector(0, 0, 0); Interact( world ); } void Ship::InteractIt( GameObject * object ) world avatar ship1 ship2 space sun bullet explosion

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

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

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

Plakátok: Billboards Egyetlen félig átlátszó textúra egy téglalapon X pos pos QUAD X Y Z x y z Tmodell Tview Tperspective QUAD pozíció orientáció kamera pozíció kamera orientáció

Bullet :: DrawIt a nézeti transzformáció forgatási részét kompenzáljuk 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); }

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

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

Részecske rendszerek Globális erőtér (szél fújja a füstöt) 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 Véletlen Kezdeti értékek

Robbanás paraméterei var Rand(mean, var) mean 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;

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

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

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

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 up = [0, 1, 0] vagy a gyorsulásból és a korábbi up átlagából lookat

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Kulcskeret animáció: futás

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

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

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

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

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

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

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

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

Textúrázás

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

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

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