Grafica tridimensională cu propriile mâini, lumea PC-urilor, editura "sisteme deschise"

ARUBA INSTANT WI-FI: SIMPLĂ, PUTERNICĂ, DISPONIBILĂ

Informații privind funcționarea bibliotecii
Biblioteca OpenGL poate fi percepută ca un automat, care în orice moment se află într-o anumită stare și, în conformitate cu acesta, efectuează interogările primite. Cu alte cuvinte, biblioteca are un set de variabile interne a căror valori sunt folosite la apelarea funcțiilor sale. Valorile acestor variabile pot fi modificate, realizând astfel acțiunea dorită a funcției corespunzătoare. De exemplu, procedura







va schimba valoarea de culoare curentă în albastru. După executarea acestei comenzi, toate obiectele create vor fi albastre.
Pentru a asigura efectul animației, adică mișcarea obiectelor și schimbarea proprietăților, imaginea este actualizată constant. Viteza de repetare a scenei (de câte ori pe secundă) depinde în primul rând de performanța procesorului grafic și, bineînțeles, de sarcinile care îi sunt atribuite. În consecință, viteza de redare variază. Pentru a asigura redarea chiar a clipului, actualizarea poate fi încetinită artificial prin legarea acestuia de ceasul sistemului.
Mecanismul de actualizare în buclă este implementat folosind patru funcții:
void init (void); - acestea sunt acțiunile efectuate în prealabil, înainte de începerea ciclului principal, de exemplu, inițializarea variabilelor, setarea parametrilor;
void reshape (int, int); - acestea sunt acțiuni legate de scalarea scenei, efectuate atunci când fereastra este redimensionată;
void display (vid); - partea principală, desenul tuturor obiectelor de pe scenă;
void inactiv (gol); - funcția este apelată pe fiecare buclă a buclă. În mod obișnuit, sarcina sa este de a mări contorul, echivalentul timpului și de afișare.
Apoi, treceți cursorul la aceste funcții în bibliotecă și porniți bucla principală.
Fișierele de proiect și codul în sine (fișierul OpenGLSample.cpp) pot fi găsite în jurnalul "World of PC-disk".

Derivarea principalelor forme
În primul rând, vom crea cerul și pământul.
Pentru a face acest lucru, folosim metoda de creare a primitivelor grafice prin seturi de vârfuri. Coordonatele vârfurilor sunt specificate de procedură
glVertex3d (GLdouble x, GLdouble y, GLdouble z),
unde GLdouble este un tip care se convertește în dublu și înapoi.
Vertexele sunt combinate într-un obiect utilizând construcția:
glBegin (modul GLenum);
glVertex3d (x1, y1, z1);
.
glVertex3d (xn, yn, zn);
glEnd ();

Aici, parametrul mod specifică modul de tratare a listei de vârfuri. Iată câteva dintre semnificațiile sale:
GL_POINTS - creează un set de puncte;
GL_TRIANGLES - tripletele de noduri definesc triunghiuri individuale;
GL_QUADS - Patru dintre vârfuri specifică quadrangles individuale.

Observați despre coordonate
Fără a intra în teorie, putem spune că, de fapt, suntem indiferenți față de valorile absolute ale coordonatelor, dar numai relațiile dintre ele sunt esențiale. Scenele de design pot fi în numerele cele mai convenabile. Reglați poziția camerei utilizând glViewPort ().
Pământul va fi un dreptunghi situată în planul y = 0, avem nevoie de cer ca două dreptunghiuri - una în planul z = -lungime, celălalt orizontal în planul z = înălțime. Și așa,

void DrawGround () glColor3f (1,0,1,0,1,0);
glBegin (GL_QUADS);
glVertex3d (lățime, -1,0, lungime);
glVertex3d (lățime, -1,0, lungime);
glVertex3d (-width, -1,0, -length);






glVertex3d (-width, -1,0, lungime);

glVertex3d (lățime, -1,0, lungime);
glColor3f (0,10,0,20,0,30);
glVertex3d (lățime, înălțime, lungime);
glVertex3d (-lălțime, înălțime, lungime);
glColor3f (0,35,0,65,0,99);
glVertex3d (-width, -1,0, -length);

glColor3f (0,10,0,20,0,30);
glVertex3d (lățime, înălțime, lungime);
glVertex3d (- lățime, înălțime, lungime);
glVertex3d (- lățime, înălțime, lungime);
glVertex3d (lățime, înălțime, lungime);
glEnd ();
>
Aici culoarea este specificată în format RGB în numere reale din intervalul [0,1]. Când se folosește transparența, este posibilă setarea culorii în formatul RGBA folosind glColor4d (r, g, b, alpha).
De fapt, pe acest principiu - sarcina vârfurilor și înțelegerea grupurilor de vârfuri ca anumite obiecte - și modelarea grafică se bazează. Pentru a crea obiecte complexe, cum ar fi modele de oameni, nori, iarbă, trebuie să setați un număr mare de noduri (uneori astronomice) și să calculați manual coordonatele. Dar nu disperați, automatizarea acestui proces este deja în curs de desfășurare.

iluminat
Sub iluminare se înțelege o schimbare a culorii vopsirii obiectului, în funcție de amplasarea sa în raport cu sursa de lumină. În mod implicit, există o sursă de lumină împrăștiată, dar puteți adăuga altele noi, cu poziția, unghiul de împrăștiere, culoarea și alți parametri. Iluminarea este activată de glEnable (GL_LIGHTING) și dezactivată cu glDisable (GL_LIGHTING).
Iluminarea unui obiect, tipul de umbre aruncate de el și propria lui umbrire depind de direcția normalelor la vârfuri și de materialul obiectului.
Normele sunt specificate prin procedura glNormal3d (x, y, z) folosită înainte de glVertex3d ().
Pentru a atribui un obiect unui material, trebuie să apelați următoarele proceduri înainte de a desena vârfuri:

GLfloat emissive [4] = <0.0f,0.0f,0.0f,0.0f>;
GLfloat difuz [4] = <0.98f,0.836f,0.35f,1.0f>;
GL oglindă [4] = <0.0f,0.0f,0.0f,0.0f>;
GLfloat ambient [4] = <0.98f,0.836f,0.35f,1.0f>;
glMaterialfv (GL_FRONT_AND_BACK, GL_EMISIE, emisiv);
glMaterialfv (GL_FRONT_AND_BACK, GL_DIFFUSE, difuz);
glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, specular);
glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT, ambient);
glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, 10);
glEnable (GL_COLOR_MATERIAL);

După desenarea obiectului trebuie să dezactivați parametrul:

Când utilizați biblioteca OpenGL, trebuie să urmați o regulă simplă - pentru a readuce toate caracteristicile modificate la starea inițială imediat după utilizare. Aceasta va salva o mulțime de timp și efort, și optimizarea și eliminarea comenzilor inutile le puteți face în etapa finală, atunci când este sigur că orice modificare adusă proiectului, nu vor fi făcute.

texturare
Suprapunerea texturii face ca obiectul să fie realist și colorat și vă permite, de asemenea, realizarea unor efecte speciale. Ca textură, puteți utiliza imagini în format BMP. Vom folosi funcțiile de încărcare a texturii, implementarea cărora este dată în fișierul BmpLoad.cpp. Iată cum să lucrați cu textura:

  1. Este creată o serie de texturi [NTEXT] de valori GLuint, unde identificatorii sunt scrise folosind procedura glGenTextures (NTEXT, textures). Ei vor fi mai târziu numiți "legați" de texturile lor.
  2. Matricea octet citi conținutul fișierului, apoi matrice este încărcat într-o bibliotecă de resurse interne (a se vedea. OpaqTexture procedură), acesta din urmă stabilește o conexiune cu valoare de identificator de id textura selectată.
  3. Când apelați glBindTexture (GL_TEXTURE_2D, id); în bibliotecă este acest obiect textura care este instalat.

Vom transforma pământul într-un deșert.
Avem un fișier BMP cu o imagine de nisip. Încărcați-l conform algoritmului de mai sus și trageți-l pe dreptunghiul pământului. Pentru a utiliza această procedură glTexCoord2d (i, j), unde i și j - coordonatele texturii, textură arătând pătrat [0,1] x [0,1]. Apoi, trebuie să sunați glVertex, iar acest punct va fi "fixat" la acest vârf. Apoi va fi "smirgat" de-a lungul unui dreptunghi mare. Dar trebuie să facem textura înmulțită de mai multe ori pe întreg pământul. Pentru aceasta, este necesar să tragem pământul nu cu un dreptunghi solid, ci sub forma unei matrice constând din mici dreptunghiuri, fiecare cu o textura "întinsă". Vom descrie dungile de dreptunghiuri prin setarea GL_QUAD_ STRIP la glBegin. Această acțiune reunește o pereche de puncte din segment, le atașează la perechea anterioară, și tratează toate patru ca un patrulater, iar apoi să i se alăture următoarea pereche etc. Rezultatul este o trupa.
Descrierea terenului este după cum urmează:

glNormal3d (0,0, 1,0, 0,0);
int k = (int) (lățime / lungime);
glBindTexture (GL_TEXTURE_2D, texturi [0]);
pentru (int i = 0; i Locația fișierelor necesare în sistem







Articole similare

Trimiteți-le prietenilor: