Programarea grafică tridimensională
tri-dimensională de programare grafică. Partea a 3.
Nodurile (puncte în spațiu) - este fundația (cadru) a tuturor obiectelor tridimensionale. Din vârfurile sunt destinate depozitelor de deșeuri și de depozite de deșeuri - complexe obiecte tridimensionale.
Ce este un poligon? Aruncati o privire la imaginea (3.1.1.).
Figura 3.1.1. Tipuri de poligoane.
Ie pe figură arată că depozitul de deșeuri - o figură geometrică constând din segmente conectate în serie, la capetele lor într-o formă închisă. Triunghi, pătrat, dreptunghi, poligon sunt cazuri speciale.
Poligon (poligon), în traducere din engleză - un poligon. Avem doar termenul de „poligon“ - utilizat în principal în geometrie. Și termenul „poligon“, se atașează la conceptele de grafică tridimensională. Și, de fapt - e același lucru.
Ce-ar defini triunghiul nostru va crea următoarea structură:
Structura TVertex definește un punct în spațiu, și TTriangle matrice - descrie gama noastră. Pentru a construi un triunghi, cele trei puncte este suficient. Prin urmare, gama noastră este formată din trei elemente care determină coordonatele vârfurile triunghiului.
Acum să definim triunghiul nostru. Pentru a face acest lucru, creați o variabilă de tip TTriangle și întrebați-i următoarele coordonate:
Coordonatele noi sunt definite după cum urmează: din moment (0,0,0) - este centrul ecranului, primul vertex am oY se află pe axa și are o valoare Y = 100; al doilea vârf se află în partea din stânga jos a graficului si are coordonatele: X = -100; Y = - 100; al treilea punct, respectiv, situată vizavi de al doilea, și are coordonatele: X = 100; Y = - 100.
După cum se poate observa, Z coordonate, nu iau în considerare (acesta este setat la zero), adică triunghiul nostru este paralelă cu planul XY de coordonate. A se vedea. Figura (3.1.2.).
Figura 3.1.2. Triangle.
Rulați programul și veți vedea că nu a funcționat foarte bine. Faptul că poligoane noastre sunt desenate în ordinea greșită. De exemplu, poligonul din spate vin dintr-o dată în prim-plan, dar, de fapt, el a atras cel mai primul. Ie cea mai îndepărtată de poligoane de ecran ar trebui să fie trase primul, și mai aproape de ecran, mai târziu. Când desena poligoane mai aproape trebuie să fie suprapuse pe desenate deja gropile de gunoi mai îndepărtate, în timp ce scena tridimensională care urmează să fie afișate corect. Pentru a face acest lucru, și există poligoane metoda de mai îndepărtat de pe ecran la cel mai apropiat de sortare. Sau altfel este numit - îndepărtarea fețelor invizibile.
Din fericire, cubul - o figură foarte simplu. De aceea sorta poligoane este foarte simplu.
În primul rând, un pic modifica tipurile noastre de date:
Am adăugat un nou tip - TVector. Este același lucru ca și TVertex. Acest tip am adăugat doar pentru comoditate programare. Am schimbat, de asemenea, tipul de TQuad. Acum, acest lucru nu este doar o matrice, și structura. Acestea au inclus trei câmpuri noi. Culoare - poligon de culoare. proiecție -dvuhmernaya Point2D de topuri noastre. Acum vom merge după partea de sus a traducerii în 2D, trebuie doar să le introduceți în acest domeniu. Normal - depozit de deșeuri normale.
La ultima oprire în detaliu. Ceea ce este normal și ce este pentru? În primul rând, normal - este perpendiculară. Ie în acest caz, perpendicular pe groapa de gunoi noastre. În al doilea rând - este un vector. Și în al treilea, lungimea acestui vector este întotdeauna egal cu unu.
În grafica tridimensionale normale sunt utilizate în principal pentru calcularea obiectelor de iluminat. Ie cu atât mai mare unghiul dintre vectorul normal și lumină, astfel încât depozitul de deșeuri nostru va fi acoperit mai mult. Un rezultat că normală la lungimea unității este necesară simplificarea calculelor matematice în timp ce desenați grafice.
Să presupunem că avem doi vectori A1 (x1, y1, z1) și B1 (x2, y2, z2). Unghiul Formula petrecut între ele este următoarea:
Ie produsul scalar al vectorilor trebuie împărțit la produsul lungimilor acestor vectori. Dar, ca lungimea vectorului ne este egal cu unu, apoi partea de jos a formulei poate fi ușor îndepărtată. Will este o astfel de formulă simplă:
Prin urmare, normală pentru toate poligoane sunt calculate în avans, ceea ce ar apoi în timpul redarea graficii, alocând mai puțin de resurse de calcul pentru a calcula unghiul dintre normalele.
La inițializarea cubului, fiecare parte a acestuia este perpendicular una dintre axele de coordonate, prin urmare, pot fi stabilite următoarele coordonate ale normalele:
Cu aceste normalele vom sorta gropile de gunoi noastre. Mai precis coordonate Z - fiecare normală. Ie poligoane cu valoarea mai mică va fi tras primul, și poligoane cu valori mari ale coordonatelor sunt trase ultimul.
Acesta este cel mai simplu mod de a sorta poligoane, dar este potrivit doar pentru obiecte simple. Cub, sferă și alte forme convexe. Pentru modelele tridimensionale este structura mai mult sau mai puțin complexe, această metodă nu va mai funcționa. În astfel de cazuri, trebuie să folosim algoritmi sofisticați elimina fețele invizibile, de exemplu - algoritmul artistului.
Sortarea gropile de gunoi noastre, vom cu ajutorul metodei de sortare rapidă. Când avem un pic de poligoane, în cazul nostru, șase dintre ele - aceasta metoda nu da câștig apreciabil în performanță. Dar când numărul lor este de peste o mie, câștigul de performanță este deja tangibil. Prin urmare, vom folosi doar acest tip.
Acum, ia în considerare procedura de desen cub nostru:
După cum puteți vedea procedura de cub de desen, am devenit mult mai complexe. Acum, nu ne întoarcem doar nodurile de cub, dar, de asemenea, toate normale sale. Ie groapa de gunoi normală trebuie să fie rotit în aceeași direcție ca și depozitul de deșeuri în sine.
Apoi ne-am traduce toate noastre de top de vedere bidimensională. Ie umple un Points2D array - fiecare poligon. Apoi vom sorta poligoane în coordonate Z. Și, în cele din urmă le afișează pe ecran.
Metoda setcolor stabilește RGB noastre de culoare - componenta. Și atribuit unei clase FRGB variabilă privată. variabilă privată (câmp) - o variabilă care va fi disponibil numai în clasa noastră (în calea clasei noastre).
Dar, în metoda GetColor se întâmplă foarte interesant. În această metodă, vom converti culoarea RGB din nou într-un tip de TColor. În această pre-înmulțirea fiecărei componente de culoare pentru intensitatea acesteia. Iar intensitatea culorii, vom fi determinată de Normal.Z variabilă, adică Z - coordonarea depozitului de deșeuri nostru normal.
De ce? Este foarte simplu! Suntem de acord că sursa de lumină, ne vom concentra pe ecranul monitorului. Ie Razele de lumină vor fi trimise ca și în cazul în care de la ochii omului stau în fața monitorului. Prin urmare, vectorul fascicul de lumină este paralelă cu un Z. axe de coordonate Aceasta este, coordonatele vectoriale fascicul de lumină sunt următoarele: (0, 0, 1);
Acest vector este de asemenea unic. Și, după cum am învățat să găsească unghiul dintre doi vectori pot fi izolați de formula unghiul = X1X2 + Y1Y2 + Z1Z2.
Substitut vectorii noștri în această ecuație și obține: Normal.X * 0 + Normal.Y * 0 + Normal.Z * 1. Aceasta arată o Normal.Z variabilă și va influența unghiul dintre intervalul normal și vectorul fasciculului luminos. E simplu!
Cu cat mai mare Normal.Z valoare va apropia unitatea, mai mic unghiul dintre normal și raza de lumină și cu atât mai mare este intensitatea culorii.
Am considerat cel mai simplu tip de iluminat, și, probabil, o modalitate de a lumina singura care poate fi pus în aplicare folosind clase grafice Delphi. Dar sper că era suficient să se înțeleagă că, pe ce bază sunt calculate în grafica 3D surse de lumină.