10. fejezet - class terep

osztály Terrain

Ebben a részben, akkor létrehoz egy osztály dolgozik a táj nevű Terrain. amelyek először egy módszert rakodási magasság térkép, így egy háromdimenziós rácsot, és felhívni a táj. A jövőben, akkor ezt az új osztályát használt módszerek magassága kérésére a táj egy adott ponton, és ellenőrizze, hogy az ütközések.

Betöltése térkép terep magasságát

Az első szakasz a terep generáció - olvasás adatait a magasból térképet. Mivel a magasság térkép tárolja a RAW fájlt. használhatja FileStream olvasni az adatokat, és tárolja azokat a byte [] tömb. Vegye figyelembe, hogy mivel a magasban a kártya nincs címe, meg kell tudni, hogy a méret és meg kell egyeznie a méret a rács csúcsot. Olvasni, és mentse el a magassági térkép adatokat, használja az alábbi kódot:

A bemutatott kódot olvasni és menteni a magasság térképen az azonos méretű, mint a rács csúcsok, akkor fog létrehozni. Ön határozza meg a méret a rács csúcsok és a változók vertexCountX vertexCountZ. az alkalmazott paraméterek rakodási magasság térképet. VertexCountX változó meghatározza a csúcsok száma a háló sáv (X tengely), és vertexCountZ meghatározza a csúcsok száma a háló oszlopon (a Z tengely).

Tárolja az adatkártya változó magasságú a heightmap. Terep egy attribútum osztály. Megjegyezzük, hogy a térkép adatait a magasságtól később szüksége lesz rájuk, így akkor kérjen egy bizonyos magasságban a terep pontot. Miután elolvasta a kártyát magasságokba tud generálni rács táj, ezeket az adatokat. Akkor jön létre GenerateTerrainMesh módszer. hogy létrehoz egy rács táj alkotja indexek és csúcsok. GenerateTerrainMesh eljárás után meg kell hívni a betöltött heightmap.

Akkor tárolja az átalakulás a táj (eltolás, forgatás, skálázás) belül a terep osztályban. Using létre 9. fejezet Class átalakítás. Ehhez egy új attribútumot az osztály Terep típusú átalakítás, és hívja meg az átalakulás. Aztán, amikor a magasban a térkép betöltésekor, akkor létre kell hozni egy új példányt Transformation:

És végül, be kell töltened a saját hatása a táj és ezt párosítani a TerrainEffect objektumot. Amint azt a 8. fejezetben, akkor létre kell hozni egy helper osztályt, amely megteremti a hatása minden van, ami segít kezelni a hatás paramétereket és módosíthatja azokat. Class TerrainMaterial - ez egy másik osztályba, hogy hozzon létre a konfiguráció a táj hatások:

Saját miszerint akkor jön létre a táj, ad reálisabb megjelenítés segítségével multitexture és normal mapping. Multitextúrás lehetővé teszi, hogy overlay ugyanazon a felületen több textúrák, normal mapping fokozza a táj részletesen növelése nélkül összetettségét rács. Lesz hatást keltsen alkalmaznak, hogy a terep végén ebben a fejezetben. Itt a kód a módszer Load Terep osztály:

Load metódus paraméterként a magasságot térkép fájl neve; táj mérete szempontjából a csúcsok száma (a tengelyek mentén X és Z); blokkméret, amely a távolság a szomszédos csúcsok; és magassága mérettényezővel használt méretezés a terep magassága. Mindezek a lehetőségek, csak a neve a magasság térkép fájlok tárolása az osztályban és attribútumok Terrain vertexCountX. vertexCountZ. blockScale és heightScale. volt.

Generation terep háló

Generálni a háló terepen kell létrehoznia a felső és az indexek. Mesh kódok tárolt sorrendet, amely csúcsokat kell kombinálni, hogy egy háromszög háló. Minden csúcs tartalmaz háló térbeli koordinátáit és tárolja bizonyos szükséges a megjelenítéshez attribútumok, mint például merőlegesek és a textúra koordinátákat. Létre kell hoznia egy rács index előtt tetőzik, mert néhány attribútum csúcsok, mint a vertex normál, akkor lehet számolni, ha tudod, mi a legjobb a mindenkor alkalmazott háromszög.

Megjegyzendő, hogy a tetején a táj tárolja tömbként struktúrák VertexPositionNormalTangentBinormal. Meg kell teremteni a tartószerkezet tárolására vertex adatokat, mert meg kell tárolni hely, struktúra koordinátákat, normál, tangens és binormal minden csúcsba, és nem osztály XNA, ami megtartotta volna az összes ilyen vertex attribútumok. Itt van a kód a VertexPositionNormalTangentBinormal szerkezete:

A szerkezet VertexPositionNormalTangentBinormal minden szükséges vertex attribútumok: pozíció, textúra koordinátákat, normál, érintőleges és binormal. Ebben a szerkezetben is kijelentette tömb VertexElement. tartalmazó vertex adatformátum típusát és méretét az egyes elemek a leírása a csúcsok.

Generációs grid indexek

Ebben a részben, akkor létrehozhat GenerateTerrainIndices létrehozó eljárást indexek terep háló. rács kódok meghatározására, hogy milyen célból, hogy kombináljuk generálni csúcsainak háromszögek. Ábra. 10.4 ábra a indexek a csúcsok a hálózatban, és hogyan vannak kombinálva alkotnak háromszögek.


10. fejezet - class terep

Ábra. 10.4. Indexelt, hogy hozzon létre egy háromszög háló tetejét

Minden téren a táj alkotja két háromszög: szürke és fehér. Az első rácscellában szürke háromszög alkotják a csúcsok 0, 1 és 7, valamint egy fehér háromszög formában csúcsai 0, 7 és 6 Megjegyzendő, hogy a sorrendben a háromszög indexek fontos: követniük kell az óramutató járásával megegyező irányban, ahogy az XNA rendering pipeline alapértelmezett eldobja háromszög, amelynek felsők megy az óramutató járásával ellentétes.

Megjegyzés: a cél index sablon létrehozásához használt háromszögek, ahol az indexek az első és a második háromszög minden téren követni ugyanabban a sorrendben, ahogy azt az alábbi képlet:

A képletekben bemutatott VertexCountX változó egyenlő a csúcsok száma a rács sorban csúcsok. A fenti képlet segítségével lehet végighaladni a négyzetrács csúcsok generáló indexek háromszögek. Te generál rács indexek egy sor egész számok, ahol minden egyes háromszög kap három elem. Itt van a kód a módszer GenerateTerrainIndices:

Generation helye csúcsok és textúra koordinátákat

Ebben a részben, akkor létrehozhat GenerateTerrainVertices eljárás generálni csúcsai a háló. Akkor tegyük a tetejére a táj az XZ síkban a világ, központosító a globális táj a helyzet (0, 0). Ehhez először be kell számítani a mérete fele a táj a tengelyek mentén X és Z, majd állítsa be a kiindulási helyzet a táj mínusz fele a mérete az X és Z (-halfTerrainWidth. -halfTerrainDepth).

Lehet számítani a méret a táj keresztül attribútumok: vertexCountX. tárolása a csúcsok száma a terep az X tengelyen; vertexCountZ. tárolása a csúcsok száma a terep Z tengely; és blockScale. tartása az egymással szomszédos csúcsok X és Z. kiszámításakor a méret a táj, akkor egyszerűen el kell osztani őket két, az alábbiak szerint:

Te generál rács terep csúcsai a kiindulási helyzet a terep és áthaladó egyes rács sorban csúcsok elhelyezi csúcsok (átmegy -X + X), majd áthaladva a következő vonalrasztert (átmegy -Z és + Z). Így a rács csúcsok vannak rendelve koordinátákat növekszik a tengelyek mentén X és Z, egy előre meghatározott blokkolja méretű, ábrán látható. 10.2. Az elhelyezési csúcsok használata korábban tárolt térképi adatok magasságát állítani a magasságát a felső tengely Y. Azt is méretezni a magassága a terep megszorozzuk a magasság minden csúcsa egy skálázási tényező: heightScale class attribútum Terrain. A helyes elhelyezése csúcsok egy terep rács, akkor a következő kódot:

Minden csúcs is U és V koordinátáit textúra, amelynek meg kell változtatni a (0, 0) az (1, 1), ahol a (0, 0) a kezdeti textúra koordináta, és (1, 1) - a végső textúra koordináta. Ábra. 10.5 mutat néhány textúra koordinátákat csúcsok a rács.


10. fejezet - class terep

Ábra. 10.5. A textúra koordinátái csúcsai a rács (bal oldalon). UV tengely textúra (jobbra)

Ahhoz, hogy kiszámítható legyen a megfelelő textúra koordinátákat minden csúcsának a táj, akkor először meg kell számítani a növekedés UV textúra koordináta-tengely. Erre a szakadék maximális textúra koordináta (1.0) a csúcsok száma az egyes tengelyekre mínusz egy:

Akkor át az összes csúcsot a beállítást a textúra koordinátákat és megnöveli őket. Amellett, hogy a helyszín és koordinátáit a textúra meg kell kiszámítani a normális, tangens és binormal minden csúcs. Ehhez egy olyan eljárás és GenerateTerrainNormals GenerateTerrainTangentBinormal. hogy hívja a végén módszer GenerateTerrainVertices. Az alábbi ábra mutatja a teljes kódot eljárás GenerateTerrainVertices:

Generation vertex normals

A normál vektort minden csúcsa a háromszög egyenlő a normál vektor a háromszög. Tehát, hogy kiszámítja a normális, a háromszög csúcsait kell számítani a háromszög normális. Kiszámítani a szokásos háromszög, találd meg a vektor termék két vektor keletkezik a csúcsokat (v1 - v0) és (v2 - v0), mivel a határokon terméket vissza vektor merőleges a két vektor.

Mivel a rács csúcsok külön csúcsot megoszthatja egytől hat háromszögek normális minden csúcsa az összege normals a háromszögek hogy megosszák a csúcs. Ezért meg kell kiszámítani a normál vektorokat minden háromszög és összefoglalni őket, hogy a vertex normál e háromszögek. A végén meg kell, hogy normalizálja a normális minden csúcs, így volt egy egységnyi hosszúságú. Normál vektorokat használjuk megvilágítási számításokat, és ahhoz, hogy egy megfelelő fényben kell lenniük egységnyi hosszúságú. Használd a következő kódot a GenerateTerrainNormal módszer. során normál táj csúcsok:

Generation érintők és binormals csúcsok

Saját miszerint akkor jön létre a táj, nevezett technikával egy normal mapping (normal mapping), amely lehetővé teszi, hogy növelje a részleteket a táj növelése nélkül összetettségét rács. Ahhoz, hogy használni normal mapping technika minden csúcsa a hálót kell tangens vektorok, binormals és normális. Tangens vektorok, normál és binormal egymásra merőleges, és alkotnak egy érintő (vagy érintőleges) koordináta-rendszerben. Ábra. 10.6 ábra a tangens vektorok, normális és binormal különböző pontok a két különböző felületeken.


10. fejezet - class terep

Ábra. 10.6. Vektorok tangens (T), binormal (B) és a normál (N)

Lehet számítani az érintő vektor minden csúcsa a rács csúcsok, mint egy vektor kezdve a felső és befejezve a következő vertex tömb. Így a tangens vektorok párhuzamosak a X tengely a rács. Megjegyezzük, hogy az érintő vektor az utolsó csúcs a rács sorban számítjuk vektorként kezdve az utolsó előtti felső sorban, és befejezve az utolsó csúcs.

Kiszámítása után az érintő vektor, akkor kaphat egy vektor binormals elvégzésével vektor szorzatát az érintő és a normális felső. Ábra. 10.7 ábra az érintő vektor, normál és binormal sík rács csúcsot.


10. fejezet - class terep

Ábra. 10.7. Vektorok tangens (T), binormal (B) és normals (N) az egyes rácsos sík csúcsú

A következő kód GenerateTerrainTangentBinormal számítási módjára az érintő vektor és binormals csúcsok:

Kapcsolódó cikkek