grafica pe calculator
Primitivele și transformare în spațiu OpenGL de pe un exemplu de desen cub
Strict vorbind, atunci când vom scrie un program folosind OpenGL. Noi nu trage nimic. Vom descrie un model al unei scene, setați proprietățile primitivelor, din care toate celelalte obiecte, și de a gestiona statele OpenGL. Vizualizarea modelului se ocupă cu OpenGL. pe baza informațiilor pe care le-am raportat. Sistemele grafice moderne pot interfera cu procesul de formare a imaginii cu ajutorul shadere. care vă permite să programați aplicații grafice destul de flexibile și rapide.
primitivelor OpenGL
Patrulatera (Quad)
Orice restricții se aplică în poligon OpenGL. În primul rând, poligonul ar trebui să fie simplu. și anume nu au auto-intersecții. În al doilea rând, trebuie să fie convexă. Într-un segment de poligon convex care leagă oricare două puncte ale celor două interioare, nu traversează granițele sale.
Toate Primitive în OpenGL definite de următoarea structură:
glBegin (GL_QUADS);
glVertex3f (-0.5f, -0.5f, 0.0f);
glVertex3f (-0.5f, 0.5f, 0.0f);
glVertex3f (0.5f, 0.5f, 0.0f);
glVertex3f (0.5f, -0.5f, 0.0f);
glEnd ();
Tipul parametru este transmis primitivele comandă glBegin, care vor fi descrise între comenzile glBegin / glEnd. În coordonatele specificate ale vârfurile primitive.
Notă comanda glVertex 3 formatul f. Troica înseamnă că echipa a trecut trei argumente. În acest caz, coordonatele în formatul (x. Y. Z). Semnătura lui f înseamnă că parametrii echipelor au de tip float.
trage cubul
nule DrawCube (dimensiune GLfloat)
glBegin (GL_QUADS);
// fata stanga
glVertex3f (: dimensiune / 2: dimensiune / 2: dimensiune / 2);
glVertex3f (: dimensiune / 2, dimensiune / 2,: dimensiune / 2);
glVertex3f (: dimensiune / 2, dimensiune dimensiune / 2/2);
glVertex3f (: dimensiune / 2: dimensiune / 2, marimea / 2);
// marginea din dreapta
glVertex3f (dimensiune / 2,: dimensiune / 2: dimensiune / 2);
glVertex3f (dimensiune / 2,: dimensiune / 2, marimea / 2);
glVertex3f (dimensiune / 2, dimensiune / 2, marimea / 2);
glVertex3f (dimensiune / 2, marimea / 2: dimensiune / 2);
// limita inferioară
glVertex3f (: dimensiune / 2: dimensiune / 2: dimensiune / 2);
glVertex3f (: dimensiune / 2: dimensiune / 2, marimea / 2);
glVertex3f (dimensiune / 2,: dimensiune / 2, marimea / 2);
glVertex3f (dimensiune / 2,: dimensiune / 2: dimensiune / 2);
// sus legat de
glVertex3f (: dimensiune / 2, dimensiune / 2,: dimensiune / 2);
glVertex3f (: dimensiune / 2, dimensiune dimensiune / 2/2);
glVertex3f (dimensiune / 2, dimensiune / 2, marimea / 2);
glVertex3f (dimensiune / 2, marimea / 2: dimensiune / 2);
// fata spate
glVertex3f (: dimensiune / 2: dimensiune / 2: dimensiune / 2);
glVertex3f (dimensiune / 2,: dimensiune / 2: dimensiune / 2);
glVertex3f (dimensiune / 2, marimea / 2: dimensiune / 2);
glVertex3f (: dimensiune / 2, dimensiune / 2,: dimensiune / 2);
// față frontală
glVertex3f (: dimensiune / 2: dimensiune / 2, marimea / 2);
glVertex3f (dimensiune / 2,: dimensiune / 2, marimea / 2);
glVertex3f (dimensiune / 2, dimensiune / 2, marimea / 2);
glVertex3f (: dimensiune / 2, dimensiune dimensiune / 2/2);
glEnd ();
>
Aproximativ În acest exemplu, numai geometria este cub modelata. Pentru iluminarea corectă și cartografierea texturii pentru fiecare față de necesitatea de a seta proprietăți suplimentare: coordonatele normale si textura.
transformări afine
In articolul „transformările Affine în spațiu“, au fost luate în considerare în detaliu transformarea afină a spațiului. Să vedem modul în care acestea sunt prezente în OpenGL.
Aproximativ Acest articol nu se referă la combinația de transformări afine. Acest lucru va fi descris în detaliu în articolul următor.
Transformarea afină în OpenGL
Soluția la această problemă este de a roti sistemul de coordonate în direcția inversă după retrasarea:
glClear (GL_COLOR_BUFFER_BIT); // Șterge framebuffer
glRotatef (30,0 f 1,0 f 1,0 f 1,0 f ...); // Rotire 30 de grade în jurul vectorului (1, 1, 1)
glColor3f (0.7f, 0.25f, 0.55f); // Setați primitivele de culoare curent
glutWireCube (1.0f); // Desenam un cub de sârmă din partea 2
glRotatef (- 30.0 f 1,0 f 1,0 f 1,0 f ...); / / Rotire -30 grade în jurul vectorului (1, 1, 1)
Această abordare are câteva dezavantaje:
- Cod duplicarea: corectarea parametrilor de conversie directă, este necesar pentru a le corecta în sens invers;
- inexacte: în procesul de transformare se poate acumula erori minore, care, atunci când repetate vor redesena vizibile;
Această problemă poate fi rezolvată cu ușurință dacă înainte de transformările care efectuează amintesc sistemul de coordonate curent local, apoi trage-l restabiliți exact. Acest lucru se face în câteva echipe glPushMatrix / glPopMatrix. Ce matricea va fi discutată în articolul următor. Codul final va arăta așa.
glClear (GL_COLOR_BUFFER_BIT); // Șterge framebuffer
glPushMatrix (); // amintesc de un sistem de coordonate local
glRotatef (30,0 f 1,0 f 1,0 f 1,0 f ...); // Rotire 30 de grade în jurul vectorului (1, 1, 1)
glColor3f (0.7f, 0.25f, 0.55f); // Setați primitivele de culoare curent
glutWireCube (1.0f); // Desenam un cub de sârmă din partea 2
glPopMatrix (); // Restauram sistemul local de coordonate