Capitolul 10 - teren de clasă

clasa de teren

În această secțiune, veți crea o clasă pentru a lucra cu peisajul numit teren. care creează mai întâi o metodă de hartă înălțime de încărcare, generând o grilă tridimensională, și trage peisajul. În viitor, adăugați această nouă clasă de metode utilizate pentru solicitarea înălțime a peisajului, la un anumit punct și verificați pentru coliziuni.

Se încarcă harta înălțimi ale terenului

Prima etapă a generației de teren - citirea datelor sale de pe hartă înălțime. Deoarece înălțimea hărții este stocată ca fișier RAW. puteți utiliza FileStream pentru a citi datele și de a le stoca într-un octet [] matrice. Rețineți că, deoarece înălțimile cardului nu are titlu, trebuie să știți dimensiunea, și trebuie să se potrivească cu mărimea nodurilor zăbrele. Pentru a citi și de a salva datele hărții elevație, utilizați următorul cod:

În codul afișat ai citit și de a salva harta înălțimea de aceeași mărime ca și vârfurile Zabrele, aveți de gând să creați. Definiți dimensiunea nodurilor cu zăbrele și variabilele vertexCountX vertexCountZ. sunt parametrii utilizați pentru harta înălțime de încărcare. VertexCountX variabilă determină numărul de noduri din bara de ochiuri (pe axa X) și vertexCountZ determină numărul de noduri din coloana cu ochiuri (în axa Z).

Stocați înălțimi variabile de card de date în heightmap. Terenul este un atribut de clasă. Rețineți că datele hărții de înălțimi ai nevoie de ele mai târziu, astfel încât să puteți cere o anumită înălțime a punctului de teren. Dupa ce a citit înălțimile de card puteți genera peisaj grilă, folosind aceste date. Vei crea metoda GenerateTerrainMesh. pentru a genera un peisaj grilă formată din indici și noduri. Metoda GenerateTerrainMesh trebuie să fie numit după heightmap încărcat.

Puteți stoca transformarea peisajului (translație, rotație și scalarea) în interiorul clasei terenului. Utilizarea creat în Capitolul 9 Clasa de transformare. Pentru a face acest lucru, se adaugă un nou atribut la tipul de transformare clasa teren și numesc transformare. Apoi, atunci când se încarcă înălțimile hărții, trebuie să creați o nouă instanță de transformare:

Și, în sfârșit, trebuie să încărcați propriul efect asupra peisajului și încapsula-l în obiectul TerrainEffect. Așa cum sa discutat în capitolul 8, ar trebui să creați o clasă ajutătoare, care creează efectul de fiecare dintre voi, care vă va ajuta să gestionați parametrii de efect și de a le modifica. Clasa TerrainMaterial - aceasta este o altă clasă pe care le creați pentru configurarea efectelor peisaj:

Proprii efectul pe care le va crea pentru peisajul, va oferi o vizualizare mai realistă folosind multitexture și cartografiere normală. Multitexturing vă permite să suprapunere pe aceeași suprafață de mai multe texturi, cartografiere normală îmbunătățește detaliile peisajului fără a crește complexitatea grilei sale. Vei crea un efect utilizat pentru a reda terenul la sfârșitul acestui capitol. Iată codul clasei Metoda de încărcare teren:

Metoda de încărcare are ca parametri numele fișierului înălțimea harta; Dimensiunea peisajului în ceea ce privește numărul de noduri (de-a lungul axelor X și Z); mărimea blocului, care este distanța dintre vârfuri adiacente; și înălțimea factor utilizat pentru scalarea înălțimii terenului de scalare. Toate aceste opțiuni, cu excepția numele fișierelor harta înălțime sunt stocate în clasă și atributele terenului vertexCountX. vertexCountZ. blockScale și heightScale. respectiv.

Generarea de plasă de teren

Pentru a genera terenul ochiurilor de plasă trebuie să generați sus și indexurile sale. Mesh Codurile comandă stocate în care nodurile trebuie combinate pentru a forma un triunghi ochiuri. Fiecare nod conține coordonatele spațiale cu ochiuri și stochează anumite atribute cerute pentru vizualizare, cum ar fi normalele și coordonatele texturii. Trebuie să creați un index grilă înainte de picuri, deoarece unele dintre atributele de noduri, cum ar fi noduri normale, puteți calcula numai dacă știi ce partea de sus utilizate în fiecare triunghi.

Rețineți că partea de sus a peisajului sunt stocate ca o serie de structuri VertexPositionNormalTangentBinormal. Trebuie să creați structura de suport pentru stocarea datelor nodurilor, deoarece aveți nevoie pentru a stoca locația, coordonatele de textură, normală, tangentă și binormal fiecare nod, și nici o clasă în XNA, care ar fi păstrat toate aceste atribute nod. Aici este codul pentru structura VertexPositionNormalTangentBinormal:

În structura VertexPositionNormalTangentBinormal au toate atributele necesare pentru vertex: poziția, coordonatele texturii, normale, tangențială și binormal. În această structură, de asemenea, a declarat matrice VertexElement. conținând formatul de date vertex specificând tipul și dimensiunea fiecărui element în descrierea nodurilor.

Generarea indicilor de rețea

În această secțiune, creați metoda GenerateTerrainIndices pentru generarea indicilor teren ochiurilor de plasă. Codurile de rețea determină, în care, pentru a fi combinate pentru a genera nodurile de triunghiuri. Fig. 10.4 prezintă indicii de noduri în rețea și modul în care acestea sunt combinate pentru a forma triunghiuri.


Capitolul 10 - teren de clasă

Fig. 10.4. Indexată pentru a crea un triunghi topuri cu ochiuri

Fiecare pătrat al peisajului este format din două triunghiuri: gri și alb. În triunghiul gri primul celulă de rețea formează nodurile 0, 1 și 7, și un triunghi alb formează nodurile 0, 7 și 6. Este de notat că ordinea indicilor triunghiului este important: ei trebuie să urmeze în sensul acelor de ceasornic, ca XNA de redare implicite conducte aruncate înapoi triunghiuri ale căror blaturi du-te invers acelor de ceasornic.

Notă șablonul de index de destinație utilizat pentru a crea triunghiuri, în cazul în care indicii din prima și a doua triunghiuri de fiecare pătrat urmează aceeași ordine așa cum se arată în următoarele formule:

În formulele ilustrate VertexCountX variabilă egală cu numărul de noduri din vârfurile rând grilă. Folosind formula de mai sus puteți itera peste toate vârfurile pătrate de rețea, generând indici de triunghiuri. Generați indici de rețea într-o serie de numere întregi, în cazul în care fiecare triunghi este dat la trei elemente. Aici este codul de GenerateTerrainIndices metoda:

Generarea de locație de noduri și coordonate de textură

În această secțiune, creați GenerateTerrainVertices metodă pentru a genera noduri ale rețelei. Puneți partea de sus a peisajului în planul XZ al lumii, centrarea pe peisajul global al poziției (0, 0). Pentru a face acest lucru, trebuie mai întâi să calculeze dimensiunea de jumătate din peisajul de-a lungul axelor X și Z, iar apoi setați poziția de pornire în a doua jumătate peisaj minus dimensiunea în X și Z (-halfTerrainWidth. -halfTerrainDepth).

Puteți calcula dimensiunea peisajului, prin atributele sale: vertexCountX. stocarea numărul de noduri ale terenului pe axa X; vertexCountZ. stocarea numărul de noduri ale axei terenului Z; și blockScale. păstrând distanța dintre nodurile învecinate în X și Z. La calcularea mărimii peisajului, pur și simplu trebuie să le împartă în două, după cum se arată mai jos:

Generați zăbrele noduri ale terenului din poziția de pornire a terenului și care trece prin fiecare vârfuri rând grila localizează vârfuri (trecerea de la X la + X), apoi trece la linia următoare grilajul (trecerea de la -Z la + Z). Astfel, nodurile cu zăbrele sunt atribuite coordonate crescătoare de-a lungul axelor X și Z, în conformitate cu o dimensiune predeterminată să blocați, așa cum se arată în Fig. 10.2. În timpul plasarea nodurilor utilizați un stocate anterior înălțimi harta de date pentru a seta înălțimea superioară a Y. axa Ai scala, de asemenea, înălțimea terenului prin înmulțirea înălțimea fiecărui nod cu un factor de scalare: clasa heightScale atribut terenului. Pentru plasarea corectă a nodurilor într-o grilă de teren, puteți folosi următorul cod:

Fiecare nod are de asemenea coordonatele U și V ale texturii, care trebuie să se schimbe de la (0, 0) până la (1, 1), unde (0, 0) este coordonată textura inițială, și (1, 1) - coordonează textura finală. Fig. 10.5 prezintă coordonatele unele textura pentru nodurile din zăbrele.


Capitolul 10 - teren de clasă

Fig. 10.5. Coordonatele texturii pentru nodurile grilajului (stânga). axa UV textura (dreapta)

Pentru a calcula coordonatele textura corectă pentru fiecare nod în peisaj, trebuie mai întâi să se calculeze creșterea texturii UV axe de coordonate. Pentru acest maxim divide textura de coordonate (1,0), la numărul de noduri ale fiecărei axe minus unu:

Apoi, va trece toate nodurile prin setarea coordonatele lor de textură și creșterea acestora. În plus față de locația și coordonatele texturii trebuie să calculeze normale, tangenta și binormal pentru fiecare nod. Pentru a face acest lucru, creați o metodă și GenerateTerrainNormals GenerateTerrainTangentBinormal. pe care le numim GenerateTerrainVertices metoda de capăt. Următoarele arată codul complet pentru o metodă de GenerateTerrainVertices:

Generation normalele Vertex

Vectorul normal al fiecărui vârf al triunghiului este egal cu vectorul normal al triunghiului. Deci, pentru a calcula nodurile normale ale triunghiului trebuie să calculeze triunghiul normal. Calculați normal triunghiului prin găsirea produsului vectorial între doi vectori generați de nodurile, (v1 - v0) și (v2 - v0), deoarece produsul cruce returnează un vector perpendicular pe cei doi vectori.

Deoarece nodurile cu zăbrele separa noduri pot partaja de la unu la șase triunghiuri, normal la fiecare nod este suma normalele triunghiuri care împart vârful. Prin urmare, trebuie să se calculeze vectorii normali pentru fiecare triunghi și le însumează pentru a obține vârful normal al acestor triunghiuri. La final, trebuie să normaliza normal la fiecare nod, asa ca a fost o unitate de lungime. Vectorii normali sunt utilizate în calculele de iluminat, și să conducă la o lumină dreapta, acestea trebuie să fie de unitatea de lungime. Utilizați următorul cod pentru metoda GenerateTerrainNormal. generând peisajul normal al vârfurilor:

Generarea de tangentele și binormals vârfuri

Proprii efectul pe care le va crea pentru peisaj, folosind o tehnica numita de cartografiere normală (cartografiere normală), ceea ce permite creșterea detaliile peisajului fără a crește complexitatea grilei sale. Pentru a utiliza tehnici normale de cartografiere, fiecare noduri ale rețelei trebuie să fie vectori tangente, binormals și normal. vectori tangente, normale și binormal perpendiculare reciproc și formează o tangentă (sau tangențial) un sistem de coordonate. Fig. 10.6 prezintă vectorii tangente, normale și binormal la diferite puncte ale celor două suprafețe diferite.


Capitolul 10 - teren de clasă

Fig. 10.6. Vectori tangentă (T), binormal (B) și normale (N)

Puteți calcula vectorul tangent al fiecărui nod în nodurile zăbrele ca vector de pornire în partea de sus și se termină la următoarea matrice vârf. Astfel, vectorii tangente sunt paralele cu axa X a grilajului. Rețineți că vectorul tangent ultimul vârf din linia de zăbrele se calculează ca un vector de pornire la rândul de sus penultima și se termină la ultimul vârf.

După calcularea vectorului tangenta, puteți obține o binormals vector prin efectuarea de multiplicare vectorul între tangenta și normală în partea superioară. Fig. 10.7 prezintă vectorii tangente, vârfuri normale și binormal plane cu zăbrele.


Capitolul 10 - teren de clasă

Fig. 10.7. Vectori tangentă (T), binormal (B) și normalele (N) a unor noduri plane cu zăbrele

Utilizați următoarea metodă de cod GenerateTerrainTangentBinormal pentru a calcula vectorii tangente și binormals vârfurilor:

articole similare