Cum să faci un cub în opengl

OpenGL este un instrument de programare 3D care vă permite să creați imagini tridimensionale complexe de la formulare simple. Din acest articol, veți învăța cum să atrageți cu acesta va ajuta un cub simplu care poate fi rotit în trei dimensiuni!

Pași

Partea 1 din 3:
Instalare inițială
unu. Instalați OpenGL. Start S Ghiduri de instalare OpenGL pe calculatorul tau. Dacă OpenGL și compilatorul cu dvs. aveți deja, puteți sări peste acest pas și mergeți la următorul.
  • 2. Creați un document. Creați un fișier nou în editorul dvs. de cod preferat și salvați-l ca MyCube.C
  • 3. Adăugați #include. Iată principalele directive #inlude de care aveți nevoie. Este important să ne amintim că directivele pentru diferite sisteme de operare sunt diferite și, prin urmare, este necesar să alegeți totul astfel încât programul să fie universal și poate fi lansat în orice sistem.
    // include # includ #Include #Include #Define gl_Gelxt_protypes # ifdef __apple __ # includ # altcineva # includ #endif
  • 4. Adăugați prototipuri funcționale și variabile globale. Următorul pas va declara prototipuri funcționale.
    // Afișaj de prototipov () - VOID Specialyys () - // Global VariableSdeble Rotate_y = 0-Double Rotate_x = 0-
  • cinci. Setați funcția principală ().
    INT Main (INT Argc, Char * Argv []) // Inițializați Parameters GLUT și PROCES Parametersglutinit (& argc, argv) - // Solicitați o fereastră de tamponare dublă, Z-Bufferizare și Schema de culori Adevărat ColorglutinitDisplaymode (GLT_DOLEL 
  • Partea 2 din 3:
    Afișaj () Funcție
    unu. Înțelegeți atribuirea funcției afișajului (). Toate lucrările la desenul Cubei vor cădea pe linii fragile ale acestei funcții. Ideea în general este după cum urmează: Desenați șase fețe separate ale cubului și plasați-le în pozițiile corespunzătoare.
    • Pentru fiecare față veți defini patru unghiuri, iar OpenGL le conectează cu linii și umple culoarea pe care o alegeți. Mai jos va spune cum să o facă.
  • 2. Adăugați funcția gllear (). În primul rând, care lucrează cu această funcție, avem nevoie Culoare clar și tampon z. Fără acest lucru, sub noul model va fi văzut vechi, iar obiectele trase de program vor fi aranjate incorect.
    VOID Afișaj () GL_DEPTH_BUFFER_BIT)-
  • 3. Adăugați Glbel () și Glend (). Obiectele OpenGL sunt combinații de diverși poligoane. Echipă glbel () Permiteți-ne să tragem un obiect cu dvs. - este ca un creion, pe care îl trageți o figură fără să o rupeți de hârtie. Pentru a rupe creionul din foaie și a începe să desenați ceva nou, aveți nevoie de o echipă Glend (). În acest articol, vom folosi GL_Polygon pentru a desena fiecare margine a cubului, deși este posibilă utilizarea altor parametri, cum ar fi Gl_line, Gl_Quad sau Gl_Trienglen pentru a crea alte forme.
  • Începeți cu partea din față a cubului. Mai târziu vom adăuga culoarea fiecăruia dintre cele șase fețe.
  • // lateral multicolor - frontglbegin (gl_polygon) - // versuri Adăugați în următorul Stepglend ()-
  • 4. Adăugați funcția GLVVERTEX3F (). Acum că ați explicat programul pe care doriți să-l începeți să desenați un poligon, aveți nevoie Setați vârfurile Obiect. Funcția GLVVENTEX are mai multe forme, utilizarea căreia depinde de ceea ce intenționați să faceți cu obiectul dvs.
  • În primul rând - câte măsurători veți lucra? Figura 3 din Glvertex3F indică trei dimensiuni. Cu toate acestea, puteți lucra în 2 și în 4 măsurători. Scrisoarea F, la rândul său, indică faptul că lucrăm cu punct și virgulă plutitoare. Cu toate acestea, aici puteți utiliza tipuri întregi, duble sau scurte.
  • Rețineți că toate punctele sunt setate în sens invers acelor de ceasornic Săgeți. Deși nu este foarte important, dar când începeți să lucrați la iluminat, texturarea, tratamentul fețelor non-tarifare, obiceiul de a prescrie totul în sens invers acelor de ceasornic va fi foarte util pentru dvs.
  • Adăugați vârfurile dintre liniile Glbel () și Glend ().


  • // lateral multicolor - frontglbegin (gl_polygon) -glvertex3f (-0.cincizeci.cincizeci.5) - // p1glvertex3f (-0.5.0.cincizeci.5) - // p2glvertex3f (0.5.0.cincizeci.5) - // p3glvertex3f (0.cincizeci.cincizeci.5) - // p4glend ()-
  • cinci. Adăugați funcția GLCOLOR3F (). Glcolor acționează în multe moduri similare cu glvertexul. Puncte Puteți seta tipurile de date de scurtă, număr întreg, dublu sau float. Fiecare culoare are o valoare de la 0 la 1. Toate zerourile sunt negre, toate unitățile - respectiv, alb. Figura 3 din GLCOLOR3F () indică schema de culori RGB fără canalul alfa. Culorile canalelor alfa sunt responsabile de transparența sa. Pentru a schimba valoarea canalului alfa, utilizați GLCOLOR4F () cu ultimul parametru de la 0 la 1, adică de la opac la transparență.
  • Apelarea GLCOLOR3F (), facem fiecare vertex din punctul specificat în culoarea specificată. Cu alte cuvinte, dacă toate cele patru vârfuri ar trebui să fie roșii, atunci doar o singură dată setați valoarea de culoare înainte de a apela comenzile GLVVERTEX3F () și toate vor fi roșii.
  • Pe exemplul părții din față de mai jos, puteți vedea cum este setată noua culoare a fiecărui vertex. Când o faci, te poți familiariza cu o caracteristică interesantă a florilor OpenGL. Deoarece fiecare vârf al poligonului are propria culoare, OpenGL combină automat culorile! Codul plasat arată cum se creează patru vârfuri cu aceeași culoare.
  • // lateral multicolor - frontglbegin (gl_polygon) -glcolor3f (1.0, 0.0, 0.0) -GLVERTEX3F (0.cincizeci.cincizeci.5) - // P1 Redglcolor3F (0.0, 1.0, 0.0) -GLVERTEX3F (0.5.0.cincizeci.5) - // P2 GREENGLCOLOR3F (0.0, 0.0, 1.0) -GLVERTEX3F (-0.5.0.cincizeci.5) - // P3 BLUEGLCOLOR3F (1.0, 0.0, 1.0) -GLVERTEX3F (-0.cincizeci.cincizeci.5) - // P4 Purpleglend ()-
  • 6. Desenați alte fețe Cuba. Mai bine, bineînțeles, dacă tu găsești locația restului cubului și a fiecăruia dintre vârfuri, dar de dragul simplității le-am calculat pentru dvs. Codul este dat B Afișajul final al funcției () de mai jos.
    // lateral alb - spate (gl_polygon) -glcolor3f (1.0.1.0, 1.0) -GLVERTEX3F (0.cincizeci.cincizeci.5) -Glvertex3F (0.5.0.cincizeci.5) -Glvertex3F (-0.5.0.cincizeci.5) -Glvertex3F (-0.cincizeci.cincizeci.5) -glend () - // lateral violet - RuralglBegin (GL_Polygon) -GLColor3F (1.0,0.0.1.0) -GLVERTEX3F (0.cincizeci.cincizeci.5) -Glvertex3F (0.5.0.cincizeci.5) -Glvertex3F (0.5.0.5.0.5) -Glvertex3F (0.cincizeci.5.0.5) -glend () - // verde lateral - stânga (gl_polygon) -glcolor3f (0.0.1.0,0.0) -GLVERTEX3F (-0.cincizeci.5.0.5) -Glvertex3F (-0.5.0.5.0.5) -Glvertex3F (-0.5.0.cincizeci.5) -Glvertex3F (-0.cincizeci.cincizeci.5) -Gend () - // albastru - Sideglbegin (GL_Polygon) -GLColor3F (0.0,0.0.1.0) -GLVERTEX3F (0.5.0.5.0.5) -Glvertex3F (0.5.0.cincizeci.5) -Glvertex3F (-0.5.0.cincizeci.5) -Glvertex3F (-0.5.0.5.0.5) -glend () - // roșu lateral - NizhnyglBegin (GL_Polygon) -GLColor3F (1.0,0.0,0.0) -GLVERTEX3F (0.cincizeci.cincizeci.5) -Glvertex3F (0.cincizeci.5.0.5) -Glvertex3F (-0.cincizeci.5.0.5) -Glvertex3F (-0.cincizeci.cincizeci.5) -Glend () - GLFLUSH () - GLUTWAPFFORS ()-
  • Acordați atenție ultimelor două linii. Acestea sunt funcții glflush ()- și Glucswapbuffers ()-, Dând efectul de tamponare dublă, care a fost spus mai sus.
  • Partea 3 din 3:
    Program interactiv
    unu. Adăugați funcția SpecialKeys (). În principiu, totul este aproape gata, dar cubul este desenat numai și nu se rotește. Pentru a face acest lucru, creați Funcția SpecialKeys (), care va roti cubul apăsând tastele săgeată!
    • A fost pentru această funcție, au fost anunțate variabilele globale Rotire_x și Rotate_y. Când apăsați tastele săgeți "stânga" și "dreapta", valoarea rotate_y va crește sau va scădea cu cinci grade. În mod similar, vom schimba valoarea ROTTER_X, dar deja apăsând tastele săgeată "up" și jos.
    Speciali de speciali (Int Key, Int X, Int Y) {// Săgeată dreapta - Creșterea rotației de 5 gradezif (tasta == GLUT_KEY_RIGHT) ROTTER_Y + = 5 - / / // Săgeata din stânga - Reducerea rotației de 5 GREDYSELSE IF (tasta == GLT_KEY_LEFT) ROTTER_Y - = 5-ALTICE IF (tasta == GLUT_KEY_UP) ROTTER_X + = 5-ALTY IF (tasta == GLUT_KEY_DOWODOWNY) ROTATE_X - = 5 - / // Solicitarea pentru actualizarea ScreenglutpostredSplay () -}
  • 2. Adăugați glrotat (). Ultimul lucru pe care îl vom face este să adăugăm un șir care să ne permită să rotească obiectul. Reveniți la funcție Afișaj () Și înainte de a descrie frontul, adăugați:
    // resetare transformăriGlloadidentitate () - // rotație la schimbarea valorilor utilizatorului RoTate_x și Rotate_yglrotatef (Rotate_x, 1.0, 0.0, 0.0) -Glrotatef (Rotate_y, 0.0, 1.0, 0.0) - // lateral multicolor - front....
  • Rețineți că sintaxa Glrotatef (), care este similar cu sintaxa lui Glcolor3F () și GLVVERTEEX3F (), dar întotdeauna necesită indicarea a patru parametri. Mai întâi - unghiul de rotație în grade. Următoarele trei axe pentru care se rotește rotația, în ordinea X, Y, Z. Până acum, trebuie să roteam cubul pe două axe, x și y.
  • Pentru toate transformările pe care le specificăm programul, sunt necesare linii similare. De fapt, reprezentăm rotația obiectului de-a lungul axei x ca o schimbare a valorii Rotate_x și rotația axei axei - ca o schimbare a valorii rotitului_y. Cu toate acestea, OpenGL va uni totul într-o matrice de transformare. Fie că apelați funcția de afișare, veți crea o matrice de transformare și Gloadidentitatea () vă va permite să începeți de fiecare dată cu o nouă matrice.
  • Alte funcții de transformare pe care le puteți utiliza este GLTRANSALLF () și GLCALEF (). Ele sunt similare cu glrotatef (), cu excepția faptului că doar trei parametri necesită: valorile x, y și z pentru a schimba și a scala obiectul.
  • Astfel încât totul este afișat corect când toate cele trei transformări sunt aplicate la un obiect, trebuie să setați transformări în ordinea corespunzătoare, și anume GLTRANSLATE, GLROTAT, glscale - Și niciodată altfel. OpenGL transformă un obiect care citește programul de jos în sus. Pentru a înțelege mai bine acest lucru, imaginați-vă că cubul 1x1x1 va avea grijă de toate transformările dacă OpenGL le-a aplicat într-o comandă ca cele indicate (de sus în jos), apoi gândiți-vă la modul în care OpenGL tratează cubul, citirea instrucțiunilor de la partea de jos în sus.
  • 3. Adăugați următoarele comenzi pentru scalarea cubului de două ori de-a lungul axelor X și Y, pentru a roti un cub de 180 de grade de-a lungul axei axei, precum și pentru a deplasa cubul cu 0,1 de-a lungul axei X. Asigurați-vă că toate comenzile relevante, inclusiv comenzile de gigotate specificate anterior (), sunt specificate în ordinea corectă. Dacă vă este frică să vă confundați, consultați versiunea finală a programului la sfârșitul articolului.
    // alte transformăriGlTtranslatef (0.10.0, 0.0) -Glrotatef (180, 0.0, 1.0, 0.0) -GLSCALEF (2.0, 2.0, 0.0)-
  • 4. Compilați și rulați codul. Să presupunem că utilizați GCC ca un compilator, deci introduceți următoarele comenzi la terminal:
    Pe Linux: CUBE GCC.C -O CUBE -LGLUT -LGL./ MyCuben Mac: Gcc -o foo foo.C -Framework Glut -Framework OpenGL./ MyCube Windows: GCC -Wall-Foooo Foo.C -lglut32Cu -Lglu32 -Lopengl32./ Mycube
  • cinci. Verificați codul final. Aici este codul finală creat de autorul articolului, în care observațiile nu au fost traduse.
    //// fișier: mycube.C // Autor: Matt Daisley // Creat: 4/25 / 2012 // Proiect: Codul sursă pentru a face un cub în OpenGL // Descriere: Creează un OpenGL Window și atrage un cub 3D // pe care utilizatorul le poate roti cu ajutorul Tastele săgeată // // Controale: stânga Rotire la stânga Arrow // Săgeată dreapta - Rotire la dreapta // sus Rotire sus // Arrow DOWN Rotire în jos // Arrow -------------- -------------------------------------------- // include // - -------------------------------------------------- - ------- # includ #Include #Include #Define GL_GELXT_PROTOTYPES # ifdef __apple __ # includ # # ELSE includ # endif // --------------------------------- - ------------------------ // Functia Prototipuri // ------------------- --- -------------------------------------- afișare void () - void specialkeys () - // ----------------------------------------------- ----- -------- // variabile globale // ------------------------------- ------- ---------------------- dublu Rotate_Y = 0-dublu Rotate_x = 0 - // --------- ------- ------------------------------------------ / / afișaj () Funcția Callback / / ------------------------------------------ ------- --------- display nu apare () // Clear Screen și Z-BufferglClear (GL_COLOR_BUFFER_BIT // ------------------ ------- --------------------------------- // SpecialKeys () Callback // Funcția - ------- ------------------------------------------- --------- specialkeys void (tasta int, int x, int y) {// Săgeată dreapta - Creșterea rotatia 5 Degreeif (element == glut_key_right) rotate_y + = 5 - // Săgeată stânga - micșorarea rota DE 5 DEGREEELSE IF (cheie == glut_key_ Stânga) rotate_y - = 5-else if (element == glut_key_up) rotate_x + = 5-else if (element == glut_key_down) rotate_x - = 5 - // Cerere de afișare UpdateglutRodisPlay () -} // ------ -------------------------------------------------- - - // principal) funcţia (// --------------------------------------- --- ------------------ int main (int argc, char * argv []) glut_depth) - // Creare WindowGlutcreateWindow ("Cube Awesome") - // Activarea Z-tampon de profunzime Testglenable (GL_DEPTH_TEST) - // Callback FunctionsGlutdisplayFunc (Display) -GlutspecialFunc (SpecialKeys) - // Pass control la Glut pentru eventsglutmainloop () - // Revenire la Osreturn 0-
  • Publicații similare