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ó.

Slides:



Advertisements
Hasonló előadás
Osztály leszármaztatás
Advertisements

Grafikus tervezőrendszerek programozása 10. 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.
Számítógépes geometriai leíró nyelvek
Számold meg a fekete pontokat!
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
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.
Geometriai modellezés
Számítógépes grafika Szirmay-Kalos László
3D Játékok készítése OpenGL környezetben
3D képszintézis fizikai alapmodellje
Bevezetés.  A számítógépes grafika inkrementális képszintézis algoritmusának hardver realizációja  Teljesítménykövetelmények:  Animáció: néhány nsec.
GPGPU labor I. OpenGL, Cg.
A korlátozott síkbeli háromtestprobléma
Számítógépes Grafika 6. gyakorlat Programtervező informatikus (esti)‏ 2009/2010 őszi félév.
Szabó Tamás Károly G6HT12 A Ruby programozási nyelv.
Bevezetés a Java programozásba
C# tagfüggvények.
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.
1 Szoftvertechnológia alapjai Java előadások Förhécz András, doktorandusz tárgy honlap:
Térfogatvizualizáció Szirmay-Kalos László. Térfogati modellek v(x,y,z) hőmérséklet sűrűség légnyomás potenciál anyagfeszültség... v(x,y,z) tárolás: 3D.
Térfogatvizualizáció
Fraktálok és csempézések
Motor I. Scene graph XML Rendering Szécsi László.
Sugárkövetés: ray-casting, ray-tracing
Térfogatvizualizáció
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.
2. gyakorlat DirectX 2007/2008 tavasz Klár Gergely
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 4. gyakorlat Programtervező informatikus (esti)‏ 2009/2010 őszi félév.
Számítógépes grafika OpenGL 5. gyakorlat.
Web-grafika (VRML) 1. gyakorlat Nyitrai Erika Varga Balázs alapján Kereszty Gábor.
Web-grafika (VRML) 2. gyakorlat Nyitrai Erika Varga Balázs.
Képek, képfeldolgozás Szirmay-Kalos László.
Grafikus szoftver Szirmay-Kalos László. Interaktív programok felépítése input csővezeték output csővezeték.
3D Játékok készítése OpenGL környezetben
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.
Platformer játék Pálya generálás. Új projekt Csináljunk új 2D projektet Neve legyen Platformer Kép asseteket töltsük le, és importáljuk a projektbe Majd.
Sprite animáció, kamera követés, háttér mozgás
JátékLogika.
„Designer-barát” játéklogika
Unity 3D alapok + gyakorlás.
Grafikus Rendszerek 6. Camera.
Vizualizáció és képszintézis
03. GYAKORLAT Szervó motor.
Szécsi László 3D Grafikus Rendszerek 6. előadás
Vizualizáció és képszintézis
Multiplayer böngészőben
Ruletták a Minkowski síkon
Unity.
Material+ kioptimalizált uniformok
Sw2 PhysX.
JavaScript a böngészőben
Sugármetszés implicit szintfelülettel
Ghost Hunter Game logic/HUD.
Bevezetés GPGPU Alkalmazások.
JAVA programozási nyelv NetBeans fejlesztőkörnyezetben I/13. évfolyam
Folyamatok.
Számold meg a fekete pontokat!
Függvénysablonok használata
Előadás másolata:

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ó

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, Wii, gépi látás, Kinect, stb.) Az „intelligens” objektumok vezérlése (AI) A fizikai világ szimulációja

Virtuális világ avatár vezérlés képszintézis Animate(dt), Draw( ) Control(dt) ProcessInput( ) SetCameraTransform( ) Interact( ) Játék OO

Játékobjektum (GameObject) class GameObject { protected: Shader * shader; Material * material; Texture * texture; Geometry * geometry; vec3 pos, velocity, acceleration; public: GameObject(Shader* s, Material* m, Texture* t, Geometry* g) { … } virtual void Control(float dt) { } virtual void Animate(float dt) { } virtual void Draw(RenderState state) { } }; std::vector objects; Virtuális világ

Szimulációs hurok (Game loop) void onIdle ( ) { // idle call back static float tend = 0; float tstart = tend; tend = glutGet(GLUT_ELAPSED_TIME)/1000.0f; avatar->ProcessInput( ); for(float t = tstart; t < tend; t += dt) { float Dt = min(dt, tend – t); for (GameObject * obj : objects) obj->Control(Dt); for (GameObject * obj : objects) obj->Animate(Dt); } glutPostRedisplay(); } void onDisplay(){ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); avatar->SetCameraTransform(state); for (GameObject * obj : objects) obj->Draw(state); glutSwapBuffers( ); } tstarttend dt

Bolygó: Planet Geometria: gömb Textúra Fizikai vagy – Tájékozódik majd követi a gravitációs törvényt Képletanimáció: – „beégetett pálya” – Többiek érdektelenek – Nincs respektált törvény

class Planet : public GameObject { float rotAngle; // animation state float rotSpeed; // animation parameter public: Planet(Gouraud* s, Diffuse* m, Texture* t, Sphere* s) : GameObject(s, m, t, s) { rotAngle = 0; rotSpeed = …;} void Animate(float dt) { rotAngle += rotSpeed * dt; } void Draw(RenderState state) { state.M = Rotate(rotAngle, 0, 0, 1) state.Minv = Rotate(-rotAngle, 0, 0, 1) state.material = material; state.texture = texture; shader->Bind(state); geometry->Draw(); } }; Planet class

A Föld kering a Nap körül dist rotAngle revAngle void Planet::Animate(float dt){ rotAngle += rotSpeed * dt; revAngle += revSpeed * dt; } void Planet::Draw(RenderState state) { state.M = Rotate(rotAngle,0,0,1)* Translate(dist, 0, 0) * Rotate(revAngle,0,0,1); state.Minv = …; state.material = material; state.texture = texture; shader->Bind(state); geometry->Draw(); }

Az űrhajó Komplex geometria – 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

(0,0) (1,1) Textúrához paraméterezés

Textúrázott űrhajó

OBJ formátumban v v v vt vt vt vn vn vn … f 65/1/1 37/2/2 62/3/3 61/4/4 f 70/8/5 45/217/6 67/218/7 66/241/8 f 75/9/9 57/10/10 72/11/11 71/12/12...

Animate: Newton mozgástörvényei force m void Ship :: Animate( float dt ) { acceleration = force/m; velocity += acceleration * dt; pos += velocity * dt; } void Ship :: Draw(RenderState state) { state.M = Translate(pos.x, pos.y,pos.z); shader->Bind(state); geometry->Draw(); } velocity position

void Ship :: Draw(RenderState state) { vec3 modelHead( 0, 0, 1 ); vec3 worldHead = velocity.normalize(); vec3 rotAxis = cross(modelHead, worldHead); float rotAng = acos(dot(worldHead, modelHead)); state.M = Rotate(rotAng,rotAxis.x,rotAxis.y,rotAxis.z)* Translate(pos.x, pos.y, pos.z); shader->Bind(state); geometry->Draw(); } modelHead worldHead = velocity.normalize(); Orientáció beállítása

Ship :: Control void Ship :: Control( float dt ) { force = vec3(0, 0, 0); for (GameObject * obj : objects) { if (dynamic_cast (obj)) { } if (dynamic_cast (obj)) { } F = f m·M r 2 avatar bullet aiming angle

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

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 átlátszó Foton torpedó

Egyetlen félig átlátszó textúra egy téglalapon pos QUAD Billboard

void Bullet :: Draw(RenderState state) { Vector w = eye - pos; Vector r = w % Vector(0, 1, 0); Vector u = r % w; r = r.normalize() * size; u = u.normalize() * size; glEnable(GL_BLEND);// átlátszóság glBlendFunc(GL_SRC_ALPHA, GL_ONE); // hozzáadás state.M = mat4(r.x, r.y, r.z, 0, u.x, u.y, u.z, 0, 0, 0, 1, 0, pos.x, pos.y, pos.z, 1); shader->Bind(state); geometry->Draw(); glDisable(GL_BLEND); } w r u eye pos

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

pos:pos += 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 Részecske rendszerek

Robbanás paraméterei pos = center; // kezdetben fókuszált lifetime = Rand(2, 1); size = 0.001; // kezdetben kicsi 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)); // Planck törvény: sárga átlátszatlanból vörös átlátszóba color = Color(1, Rand(0.5, 0.25), 0, 1 ); dcolor = Color(0, -0.25, 0, -1) / lifetime; Rand(mean, var) mean var

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

KeyboardFunc KeyboardUpFunc SpecialKeysFunc SpecialKeysUpFunc keys IdleFunc: GameLoop virtual world Klaviatúra kezelés bool keys[256];// is pressed? void onKeyboard(unsigned char key, int pX, int pY) { keys[key] = true; } void onKeyboardUp(unsigned char key, int pX, int pY) { keys[key] = false; }

Avatar :: ProcessInput Avatar :: ProcessInput() { if ( keys[‘ ‘] ) // fire! objects.push_back(new Bullet(pos, velocity)); // Kormányzás: az avatár koordinátarendszerében! vec3 head = velocity.normalize( ); vec3 right = cross(wVup, head).normalize(); vec3 up = cross(head, right); if (keys[KEY_UP]) force -= up; if (keys[KEY_DOWN]) force += up; if (keys[KEY_LEFT]) force -= right; if (keys[KEY_RIGHT]) force += right; } head up right

Avatar :: SetCameraTransform(RenderState& state) { Camera camera(pos, pos + velocity, wVup, fov, asp, fp, bp); state.V() = camera.V(); state.P() = camera.P(); } eye lookat wVup = [0, 1, 0] vagy a gyorsulásból és a korábbi wVup átlagából Avatar::SetCameraTransform

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

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

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

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

Ellenség Animált geometria – Kulcskeretekkel (clip-enként) Á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

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

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 state AI motor Keyframe animation Clip = start, stop keyframe Keyframe-ek MD2 fájlban Idő: t A háromszög háló csúcspontjai

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