Rajz részecskék négyzetes sokszögek

Visszatérve a játék szörnyek, részecskéket lehet használni, hogy képviselje a kis mozgó autók a város utcáin. Egyszerű mintás (a billbordinga) tértől poligon elég lesz ezeket a gépeket, és mi van, ha ehelyett kellene használni háromdimenziós háló? Egyszerűen lenne szükség vizualizációs néhány extra sokszögek minden keretben, és hidd el, amilyen hatást ezek a kis gépek mozogni a városban kerülne extra render időt.

Nos, ha ne érintse meg a képalkotó hálók, a legtöbb részecske készülő áll tér sokszög. Tudod felhívni őket különböző módon, de ebben a könyvben megmutatom, három. Az első részecske rajz módszer talán a legegyszerűbb, de hamarosan látni, megvannak a maga hátrányai.

Rajz részecske olyan egyszerű, mint a rajz sokszögek, mert a részecske - ez csak megváltoztatni a mérete a tér texturált sokszöget. Ábra. 12.4 ábra a megjelenése két háromszög létrehozásához használt a részecske. Ezen az ábrán, úgy mutatott részecske mérettel rendelkező 10 egység.

Ábra. 12.4. Egy részecske, amelynek mérete 10 egység hossza 5 egység a irányban x és y tengely

Amellett, hogy csúcskoordinátáinak használható, ha rajz a részecskék,

Kell egy pár dolgot. Először is, a szükséges textúra javítására használják a megjelenését a részecskék. Ez a struktúra a füst, a fény egy vérrög, vagy egy rémült ember, meg kell tárolni a képet a tárgy textúra. Amellett, hogy a textúra sokszögek információra van szüksége a textúra koordinátákat textúraleképezési a sokszög.

Az egyszerűség kedvéért, én csak egy textúra minden típusú részecske ebben a fejezetben. Más szóval, ha vannak részecskék a füst és tűz, felteszem a két textúrák. Bármely esetben minden részecske fogja használni a saját textúra renderelés. Érdemes lehet kombinálni az összes textúra a részecskék egyik, hogy javítsa a részecskéket.

Ezután létre kell hozni a részecskék a sokszög adatok szórt (diffúz) színes komponens. Képes megváltoztatni a színét alatt a részecskék nagyon hasznos, mert a színváltozás eltérőek lehetnek ciklusai, az élet a részecskék. Például a tűz lassan lehűtjük, és megváltoztatja a színét, mivel eltávolítják a hőforrás. Ahelyett, hogy a többszörös textúrák, hogy képviselje a különböző szintű fűtés használhatja ugyanazt a textúrát és csak változtatni a színét a szórt részecskék.

Az utolsó dolog, amire szükség van a részecskék méretének. Általában a részecskék lehetnek bármilyen méretű, egy kis porfoltok Meteor földön leesett. Ahhoz, hogy meghatározzuk a szemcseméret ki kell választania a szemcseméret, ugyanazt a világot koordinátákat használat háromdimenziós háló.

Tegyük fel, hogy a részecskék 20 egység széles 50 egység magas. Ez a méret csak a x és y tengely (azaz. A. Tény, hogy a részecske egy lapos tárgy, amely mindig irányul a néző felé). Amikor létrehoz egy részecske közepén található a világ kezdete koordinátákat. A méretei a részecskék, akkor létrehozhat egy vertex képviselő a sarkokat. Ezek a csúcsok találhatók egy részecskeméret oszlik ketté, mint az eltolás. Például, 20x50 részecskeméret 10-10 az x-tengelyen és 25 és 25-ös az y tengelyen.

Ennyi róla, most már elegendő információt a rajzolás megkezdéséhez részecskék! Összefoglalva: az szükséges, hogy a részecskeméret és csúcsainak koordinátáit (használva méretű, mint a bázis), a textúra koordinátákat és a szétszórt komponense színt minden csúcs. Menj előre, egyesít minden ezeket a komponenseket egységes szerkezetű csúcs, ahogy én is tettem itt:

D3DXVECTOR3 vecPos; // csúcskoordinátáinak részecskék D3DCOLOR Diffúz; // Elszórtan szín

float u, v; // Texture koordináták> sVertex;

#define VERTEXFVF (D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1)

A szerkezet csúcsok és FVF, akkor létrehozhat egy kis csúcsot puffert, amely tartalmazza elég csúcsot húz egy részecske. két háromszög használt részecskék, ez azt jelenti, hogy létre kell hozni a hat csúcsú (három mindegyik háromszög). Egy háromszög csík, lehetséges, hogy csökkentse a csomópontok száma négy.

Vertex puffer segítségével lehet létrehozni a következő kódot:

IDirect3DVertexBuffer9 * PVB = NULL; pDevice-> CreateVertexBuffer (4 * sizeof (sVertex), \

D3DUSAGE_WRITEONLY \ VERTEXFVF, D3DPOOL_DEFAULT \ PVB, NOLL);

Miután létrehozta a vertex buffer (ő jön létre, amikor a program), akkor töltse fel adatait a részecske. Tegyük fel, hogy szeretnénk felhívni a részecske mérete 10 egység (az x irány és az y irányban) a teljes felületen, amelynek színe fehér. Ehhez meg kell használni a következő kódot:

// Size = részecskeméret, ebben az esetben 10,0 float Size = 10,0;

// A méret oszlik ketté beállítására csúcskoordinátáinak lebegnek HalfSize = Méret / 2.0F;

// Lock a vertex puffert és töltse fel adatokkal csúcsok sVertex * Vertex = NULL;

pVB-> Lock (0, 0, (void **) Vertex, 0);

// bal felső sarokban, a felső szám 0

PVB [0] .vecPos = D3DXVECTOR3 (-SIZE, méret, 0.0f); PVB [0] .Diffuse = D3DCOLOR_RGBA (255.255.255.255); PVB [0] .u = 0.0f; PVB [0] V értékre = 0.0f;

// jobb felső sarokban, a vertex száma 1 PVB [1] .vecPos = D3DXVECTOR3 (méret, méret, 0.0f); PVB [1] .Diffuse = D3DCOLOR_RGBA (255.255.255.255); PVB [1] .u = 1.0f; PVB [1] V értékre = 0.0f;

// bal alsó sarokban csúcs száma 2 PVB [2] .vecPos = D3DXVECTOR3 (-SIZE, -SIZE, 0.0f); PVB [2] .Diffuse = D3DCOLOR_RGBA (255.255.255.255); PVB [2] .u = 0.0f; PVB [2] V értékre = 1.0f;

// jobb alsó sarkában, a vertex száma 3 PVB [3] .vecPos = D3DXVECTOR3 (Méret, -SIZE, 0.0f); PVB [3] .Diffuse = D3DCOLOR_RGBA (255.255.255.255); PVB [3] .u = 1.0f; PVB [3] V értékre = 1.0f;

// engedélyezése a vertex-puffer

Most vertex puffer kész képalkotó. Azonban kevés finomságot. Észre fogja venni, hogy a csúcsainak koordinátáit egy sokszög közepén háromdimenziós koordinátáit a világ irányában húzódó x és y tengelyt. Mivel a. Nézőpont lehet bárhol a világon, meg kell, hogy gondoskodjon a sokszög, az átalakítás a világ, mielőtt megjelenne.

Az is szükséges, hogy kapcsolja ki a poligonok, hogy azok arra irányultak, hogy a néző, hogy mint te is emlékszel, a célja billbordinga. Meg kell számítani a hirdetőtáblát átalakítani forgatni sokszögek

a nézőt. Ezzel átalakulás, akkor adjuk hozzá a koordinátákat a részecskék

olyan helyen, ahol azt kell készíteni (a világ koordináták).

Figyelmeztetés. Segítségével GetTransform funkció konvertáló Direct3D zamedlyaetrabotu erősen, és nem mindig lehetséges. Legféltettebb globalnyepreobrazovaniyamira, vidaiproektsii, kotoryemozhnopotomispolzovat.Odnako bűnbánat fogja követni a rossz utat, és használja GetTransform vuchebnyh célra.

Ahhoz, hogy hozzon létre egy hirdetőtáblát átalakulás eléréséhez szükséges mátrix típusú átalakítás és kiszámítja annak fordított mátrix (megváltoztatva így a sorrendben abban foglalt transzformációk reverz) segítségével D3DXMatrixInverse funkcióval, ahogy itt látható:

// kap a kilátás matrix transzformáció, és kapcsolja D3DXMATRIX matView;

pDevice-> GetTransform (D3DTS_VIEW, matView); D3DXMatrixInverse (matView, NULL, matView);

A fordított átalakulás lehetővé teszi a részecskék forgatni a felső ellentétes irányban, hogy az irányt a formában, ezzel egy vonalba hozzuk koordinátáit a néző. Miután megkapta az inverz transzformációt az űrlapot kell közvetlenül hozzáadjuk a koordináta helyét a részecskék a háromdimenziós világban. Ezt megteheti a megtakarítás koordinátái x, y és z az elemek _41, _42 i_43 rendre csak számítani az inverz transzformációs mátrix, és meghatározzák a kapott transzformációs mátrixot, mint globális átalakulás.

// set ParticleXPos, ParticleYPos ParticleZPos és tartalmazza a világ

// koordináták részecskék levonni. Hozzáadása koordinátákat részecskéket állítanak matView._41 = ParticleXPos;

matView._42 = ParticleYPos; matView._43 = ParticleZPos;

// Állítsa be a kapott mátrix, mint a világ átalakítását pDevice-> SetTransform (D3DTS_WORLD, matView);

Miután létrehozott egy mátrixot a világ átalakítását, akkor láthatóvá a sokszög. Annak érdekében, hogy a részecskék egyesítjük a jelenet, szükség van annak biztosítására, hogy a Z-puffert használunk, és az alfa-tesztet. Használata a z-puffer biztosítja, hogy a részecskéket pontosan jelenik meg egy jelenet, és az alfa-tesztelés biztosítja, hogy az átlátszó részek textúra részecskék nem húzott (a maradék geometria lehetővé teszi az átlátszó részek). Szintén engedélyezheti alpha blending, ha azt szeretné, hogy egyfajta hatásait színkeverés.

Ugrás a z-puffer (amennyit kellett volna, hogy korábban), akkor engedélyezze alfa tesztelés és alpha blending az alábbiak szerint:

// engedélyezése alfatesztelés

pDevice-> SetRenderState (D3DRS_ALPHATESTENABLE, TRUE); pDevice-> SetRenderState (D3DRS_ALPHAREF, 0x08); pDevice-> SetRenderState (D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL);

// engedélyezése alfa blending (egyszerű addíciós típusú) pDevice-> SetRenderState (D3DRS_ALPHABLENDENABLE, TRUE); pDevice-> SetRenderState (D3DRS_SRCBLEND, D3DBLEND_SRCCOLOR); pDevice-> SetRenderState (D3DRS_DESTBLEND, D3DBLEND_DESTCOLOR);

Ami az alfa teszt, én úgy döntött, hogy használja a szabályokat összehasonlítás nagyobb vagy egyenlő. Ez azt jelenti, hogy ha a pixelek textúra részecskék egy alfa-értéke nagyobb, vagy egyenlő, mint 8, akkor láthatóvá tesszük, egyébként, akkor elhagyhatók. A alfa-tesztet szükség D3DXCreateTextureFromFileEx funkciókat használja betölteni textúrák, amelyben a szín módot használva alfa-csatornák (mint például D3DFMT_A8R8G8B8), és a szín áttetsző fekete gombot (D3DCOLOR_RGBA (0,0,0,255)), amint az a következő kódot:

D3DX_DEFAULT, D3DX_DEFAULT, D3DX_DEFAULT, 0, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, D3DX_DEFAULT, D3DX alapértelmezés D3DCOLOR_RGBA (0,0,0,255), NULL, NULL, pTexture);