2010. február 12., péntek

...it burns, burns, burns, the ring of fire...

Lassan két hete nem írtunk semmit, ugyhogy gyorsan bepótolom a lemaradást. Az elmúlt napokban sikerült jobban haladni, emiatt sem volt időm, energiám eddig jelentkezni.
A mostani újdonságok - merthogy több területtel is foglalkoztam párhuzamosan - közül a részecskrendszerről szeretnék írni egy kicsit.
Ahogy a bejegyzés címe is utal rá, részecskékkel, pontosabban egy úgynevezett részecskerendszerrel fogunk megjeleníteni a játékban mindenféle effekteket, úgy mint füst, tűz, robbanások, stb. Valljuk meg, egy ilyen klasszikus akciójátékban, ami a Hind-ünk tervezett zsánere, bizony előfordul, hogy ezt-azt fel kell gyújtani, robbantani, stb. Hogy is fog működni ez a gyakorlatban? Ahogy a neve is utal rá, a részecskerendszer részecskékkel dolgozik. Mielőtt jobban belemélyednénk ebbe a témakörbe, érdemes egy kis kitérőt tenni a billboard-ok irányába. De mi is az a billboard? Abból induljunk ki, hogy a háromdimenziós motorunk feladata a játék "működtetése" valós idóben. A valós idejű képszintézis azonban, különösen összetett objektumok esetén, problémás. Néhány esetben kisebb trükkökkel csalhatunk. Ez alatt azt értem, hogy bizonyos objektumokat nem modellezünk le, hanem egyszerűen csak kétdimenziós képként (textúra) jelenítjük meg őket. Az elgondolás abból ered, hogy egy kétdimenziós kép megjelenítése esetén teljesen mindegy, hogy bonyolultabb, vagy egyszerűbb objektumot ábrázol. A legkézenfekvőbb példa egy fa lombkoronájának megjelenítése. A levelek nagy száma miatt azok egyenkénti lemodellezése és megjelenítése rendkívül drága lenne, viszont egy fényképpel elfogadhatóan és nagy sebességgel megjeleníthető tetszőleges számú levél. A trükk arra épít, hogy ezek a jelenségek közelítőleg szimetrikusok, azaz a fontos irányokból tekintve őket, hasonló képet mutatnak. Ezeket a fontos irányokat mindig az alkalmazás határozza meg. Például egy gyalogost szimuláló játékban elegendő a hengerszimmetria, hiszen egy fa esetén sem alá nem mászhatunk, se fölé nem repülhetünk. Ha ezekre a megjelenítési nézetekre is szükség lehet, gömbszimmetriát kell használni. Ha egy bonyolult geometriájú tárgyat a fényképével akarunk helyettesíteni, elegendő az összetett és bonyolult háromszögháló helyett csupán egy téglalapot kirajzolnunk, ami épp az adott fényképpel van megfelelően textúrázva. A képet tároló téglalap nem lehet a játéktérben rögzített, ugyanis ebben az esetben ha laposabb szögben tekintünk rá, akkor az észrevehetően elvékonyodik és máris lelepleződik a „csalás”. Sőt, ha a szem éppen a téglalap síkjában van, el is tűnhet a téglalap. Ez a módszer csak abban az esetben adna korrekt megoldást, ha a néző folyamatosan merőlegesen tekint a téglalapra, amire egy háromdimenziós játék esetén kevés az esély. Két megoldás adódik. Az egyik megoldás, hogy két egymásra merőleges képet használunk, a másik, hogy egyetlen képet forgatunk dinamikusan, azaz hogy mindig merőleges legyen a nézeti irányra. Ez így leírva kicsit száraznak tűnik, de aki játszott az első FPS-ként számontartott Wolfenstein3D-vel, vagy az azt követő forradalmi Doom sorozat játékaival, annak ismerős lehet a technológia. Ezekben a játékokban minden ellenfél, tárgy ezzel a módszerrel lett megjelenítve a raycasting render-el generált labirintusokban. Sőt, ha jól emlékszem az első Quake-ben, ami egyben az első full 3D FPS is, a robbanások, vér is billboard technikával jelent meg.
A játékunkban tehát a billboard egy olyan kétdimenziós kép, amely a háromdimenziós térben mindig a kamera felé van fordítva. Egy plakát kép elkészítésénél figyelembe kell venni, hogy a természeti jelenségek nem téglalap alakúak, a határuk általában szabálytalan. A megoldás, hogy a képeken átlátszó színeket is használunk és a megjelenítendő ábrán kívül minden pontot ezzel az átlátszó színnel definiálunk. A plakátokon általában csat teljesen átlátszatlan és teljesen átlátszó színek találhatók. Az a cél, hogy ahol a szín átlátszó, ott a rasztertár tartalmát a plakát ne változtassa meg, ahol pedig átlátszatlan ott pedig írja felül függetlenül az eredeti értékektől.
Lassan el is érkeztünk a részecskerendszer témakörhöz. Egy billboard nem csak állóképet, hanem akár "mozgást" is megjeleníthet, ha nem csak egyetlen képet, hanem egy képsorozatot rendelünk hozzá. Ha ezeket a képeket időben változtatjuk, animációt hozhatunk létre. Másik megoldás - és ezt használjuk a Hind-ban jelenleg -, hogy a plakát négyszög méretét, színét, pozícióját változtatjuk időben és ezzel egy részecskét hozunk létre. Sok ilyen részecske pedig egy részecskerendszert alkot. Egy részecskét egy textúrázott téglalappal reprezentáltam, mivel az még közelről is elfogadható látványt nyújt. Egy részecskét megadó textúra szinte mindig tartalmaz átlátszó képelemeket, mivel a részecskék a legritkább esetben téglalapok, ráadásul többnyire maguk is átlátszók (egy lángnyelven keresztül általában látható a háttér is).
Egy részecskeobjektum tehát rendelkezik néhány tulajdonsággal, úgymint pozíció, gyorsulás, sebesség, tömeg, tömegváltozás, élettartam, szín, színváltozás és méret. Ezekkel az értékeket állítgatva nagyon sokféle, és nagyon látványos effekteket hozhatunk létre. Hú, megint elég sokat írtam, de még meg akarom említeni a részecskerendszer emitter fogalmát. Az emitter használatával tudunk részecskéket generálni és kibocsájtani valamilyen irányba. Úgy kell elképlezni, mint egy ágyú, ami a megadott irányba lövöldöz adott tulajdonságú részecskéket. Természetesen ezzel az iránnyal is trükközhetünk. Véletlen generált irányvektorokkal ugyanis nagyszámú részecske esetén akár egy tüzijátékszerű "gömböt", azonos irányvektorral pedig például rakéta "kondenzcsíkot" is rajzolhatunk.
Egy teljes részecskerendszer tehát sok részecskeobjektum halmaza. Ezek dinamikusan születnek meg, majd tűnnek el haláluk után. Mindenesetre azért érdemes a részecskéket óvatosan használni, egy-két látványos effekt ugyanis akár több 1000 részecskéből állhat, ami máris több ezer négyszöget, illetve háromszöget jelent.

Lássuk, hogy néz ki mindez a játékunkban jelenleg:



Végül mai címadónk digitális avatárja:

Nincsenek megjegyzések:

Megjegyzés küldése