gtemata.com

Cum se creează un cub în OpenGL

OpenGL este un instrument puternic de programare 3D folosit pentru a desena scenele complexe tridimensionale de la primitive simple. Acest articol vă va învăța cum să desenați un cub simplu pe care îl puteți roti și afișa în trei dimensiuni.

Pentru acest proiect veți avea nevoie de un editor de cod și de anumite noțiuni de programare.

paşi

Partea 1

Setările inițiale și funcția principal ()

Instalați OpenGL

  • Pentru a începe, urmați-le pași pentru a instala OpenGL pe sistemul dvs. Dacă ați instalat deja pe calculatorul OpenGL și pe un compilator C, puteți trece peste acest pas.

Creați documentul

  • Creați un fișier nou cu editorul de cod preferat și salvați-l ca ilmiocubo.c

#includes

  • Acestea sunt cele de bază de care vom avea nevoie pentru programul nostru. Este important să înțelegeți că diferitele sisteme de operare necesită includerea diferită. Asigurați-vă că le includeți pe toate pentru a vă asigura versatilitatea maximă pentru programul dvs.

// Include # include #include #include #define GL_GLEXT_PROTOTYPES # ifdef __APPLE __ # include # altceva # include #endif

Prototipuri de funcții și variabile globale

  • Următorul pas este să declarăm câteva prototipuri ale funcțiilor.

    // Prototipurile funcțiilor display () - void specialKeys () - // Variabile Globalidouble rotate_y = 0-double rotate_x = 0-
  • Ulterior, toate aceste funcții și variabile vor fi explicate în detaliu, în momentul implementării lor. Pentru moment, este important să le declarați.

Setați funcția principal ()

  • int principal (int argc, char * argv []) GLUT_RGB 

Partea 3

Funcția de afișare ()
  • Toate operațiunile de desenare a cubului nostru vor fi efectuate în această funcție. Ideea generală de a face cubul este să desenezi toate cele șase fețe în mod individual și să le poziționezi în mod corespunzător.

  • Conceptual, fiecare parte va fi desenată definind cele 4 colțuri și lăsând OpenGL să conecteze liniile și să le umple cu o culoare definită de utilizator. Mai târziu veți găsi pașii necesari pentru această operație.

glClear ()

  • Primul pas pe care trebuie să-l urmezi în această funcție este resetați culoarea și tamponul Z. Fără acești pași, vechiul design poate fi încă vizibil sub cel nou și obiectele ar putea să nu fie în poziția corectă pe ecran.

void display () // Ștergeți ecranul și ștergeți bufferul ZglClear (GL_COLOR_BUFFER_BIT
  • Trebuie să inserăm încă două linii de cod pentru această funcție. acestea sunt glFlush () - și glutSwapBuffers () -, care introduce efectul dublu de tamponare pe care l-am descris mai devreme.
  • Partea 4

    Interactivitate pentru utilizator

    specialKeys ()

    • Aproape am terminat, dar în acest moment putem trage un cub și nu avem nici o posibilitate de a ne roti. Pentru a face acest lucru, vom crea o funcție specialăKeys () care ne va permite să folosim săgețile pentru a roti cubul!

    • Această funcție este motivul pentru care am declarat variabilele globale rotate_x și rotate_y. Când apăsăm săgețile stânga și dreapta, vom mări sau micșora valoarea rotate_y cu 5 grade. De asemenea, când apăsăm săgețile în sus și în jos, rotate_x va varia în mod corespunzător.



    specialKeys void (element int, int x, int y) {// Săgeată dreapta - crește rotirea 5 gradiif (cheie == GLUT_KEY_RIGHT) rotate_y + 5 = - // Săgeată stânga - reduce rotirea 5 gradielse if (key = =) rotate_y GLUT_KEY_LEFT - = 5-else if () rotate_x = 5-else if (element cheie == GLUT_KEY_UP + == GLUT_KEY_DOWN) rotate_x - 5 = - // Cerere actualizare dell`immagineglutPostRedisplay () -}

    glRotate ()

    • Ultima piesă de cod este de a adăuga instrucțiunea care ne va roti obiectul. Reveniți la funcție "display ()" și înainte de partea FRONTĂ, adăugați următoarele rânduri:

      // Resetarea trasformazioniglLoadIdentity () - // Rotire când se schimbă utilizatorul rotate_x și rotate_yglRotatef (rotate_x, 1,0, 0,0, 0,0) -glRotatef (rotate_y, 0.0, 1.0, 0.0) - multicolor // Side - FRONT ....
    • Mai întâi observați că sintaxa din glRotatef () este similară cu cea a glColor3f () și glVertex3f (), dar necesită întotdeauna 4 parametri. Primul parametru este gradul de rotație care trebuie aplicat. Următorii trei parametri definesc axele care se rotesc, cu x prima, a a doua și a a treia. În acest moment trebuie să rotim cubul numai de-a lungul axelor x și y.

    • Toate transformările pe care le scriem în programul nostru au nevoie de linii similare cu acestea. Conceptual, interpretăm această operație ca o rotație a obiectului în jurul axei x a cantității definite de rotate_x și apoi o rotire în jurul axei y a rotate_y. OpenGL, cu toate acestea, combină toate aceste declarații într-o transformare matrice. Ori de câte ori numim funcția de afișare, construim o matrice de transformare e glLoadIdentity () ne garantează să începem cu o nouă matrice în fiecare pas.

    • Celelalte funcții de transformare pe care le-am putea aplica sunt glTranslatef () și glScalef (). Aceste funcții sunt similare cu glRotatef (), cu excepția faptului că acceptă numai 3 parametri, adică valorile de-a lungul axelor x, y și z pentru a traduce sau a scala obiectul.

    • Pentru a obține efectul corect când aplicăm toate cele trei transformări unui obiect, trebuie să le aplicăm în ordinea corectă. Scrie-le întotdeauna în această ordine: glTranslate, glotate, apoi glScale. OpenGL aplică în mod esențial aceste transformări de la ultimul la primul. Pentru a înțelege acest concept încercați să vă imaginați diferențele în vizualizarea unui simplu cub 1x1x1 dacă OpenGL le-a aplicat de la primul la ultimul și apoi de la ultimul la primul.

    • Adăugați următoarele comenzi pentru a scala cubul cu 2 de-a lungul axei x, cu 2 de-a lungul axei y, rotiți cubul la 180 de grade de-a lungul axei y și traduceți-l cu 0,1 de-a lungul axei x. Asigurați-vă că le scrieți în ordinea corectă descrisă mai sus. (Dacă aveți vreo îndoială, veți găsi ordinea corectă în codul final la sfârșitul ghidului)

      // Alte transformări ale lui Translatef (0.1, 0.0, 0.0) -glRotatef (180, 0.0, 1.0, 0.0) -glScalef (2.0, 2.0, 0.0)

    compilare

    • Ultimul pas pentru finalizarea primului proiect OpenGL este de a completați și executați codul. Presupunând că utilizați gcc ca un compilator, executați aceste comenzi de la terminalul dvs. pentru a vă compila și testa programul.

      Pe Linux: gcc cube.c cub -lglut o- -lGL./ ilmiocuboSu Mac: gcc foo foo.c -Framework o- GLUT -Framework OpenGL./ ilmiocuboSu Ferestre: GCC -Wall -ofoo foo.c -lglut32cu -lglu32 - lopengl32./ ilmiocubo

    Partea 5

    Codul final
    • Aici, în sfârșit ați creat primul program OpenGL! Mai jos veți găsi codul sursă ca punct de referință.

    //// fișier: ilmiocubo.c // Autor: Matt Daisley // Creat: 25/4/2012 // proiect: cod sursă pentru a crea un cub în OpenGL // Descriere: Creează o fereastră de OpenGL și desena un cub 3D / / Ce puteți roti folosind săgețile direcționale // // Controale: săgeată stânga - dreapta // va roti spre stânga Arrow - roti dreapta Arrow // - // rotiți în sus în jos Arrow - roti în jos // ------------------------------------------------ ----------- // Include // ----------------------------------- ----------------------- #include #include #include #define GL_GLEXT_PROTOTYPES # ifdef __ __APPLE altceva # # # includ includ # endif // ----- -------------------------------------------------- --- // Prototipuri de funcții // ---------------------------------------- ------------------ void display () - void specialKeys () - // -------------------- -------------------------------------- // Variabile globale // ------ -------------------------------------------------- - dublă rotate_y = 0-dublu rotate_x = 0 - // ----- -------------------------------------------------- --- // Afișați funcția de rechemare () // ------------------------------------- --------------------- afișare void () // clar ecranul și clar tamponul ZglClear (GL_COLOR_BUFFER_BIT // ----------- ----------------------------------------------- // Funcție memento specialeKeys () // ------------------------------------------- --------------- specialKeys void (element int, int x, int y) {// dreapta Arrow - crește rotirea 5 gradiif (cheie == GLUT_KEY_RIGHT) rotate_y + = 5- // stânga Arrow - reduce rotația 5 gradielse dacă rotate_y (cheie == GLUT_KEY_LEFT) - în cazul în care (cheie == GLUT_KEY_UP) rotate_x (cheie == GLUT_KEY_DOWN) = 5-else + = 5 else if rotate_x - = 5 / / cerere de actualizare dell`immagineglutPostRedisplay () -} // ------------------------------------ ---------------------- // function main () // -------------------- -------------------------------------- int principal (int argc, char * argv []) GLUT_RGB 

    Afișați mai multe ... (1)
    Distribuiți pe rețelele sociale:

    înrudit