Kā izveidot kubu OpenGL

Autors: Gregory Harris
Radīšanas Datums: 12 Aprīlis 2021
Atjaunināšanas Datums: 1 Jūlijs 2024
Anonim
DIY kā uztaisīt papīra kubu pildītu ar gaisu! 😜 | Rashuks Arbzons 🍉
Video: DIY kā uztaisīt papīra kubu pildītu ar gaisu! 😜 | Rashuks Arbzons 🍉

Saturs

OpenGL ir 3D programmēšanas rīks, kas ļauj jums izveidot sarežģītus 3D attēlus no vienkāršām formām. Šajā rakstā jūs uzzināsit, kā ar viņa palīdzību uzzīmēt vienkāršu kubu, kuru var pagriezt trīs dimensijās!

Soļi

1. daļa no 3: Sākotnējā uzstādīšana

  1. 1 Instalējiet OpenGL. Sāciet ar apmācību par OpenGL instalēšanu datorā. Ja jums jau ir OpenGL un C kompilators, varat izlaist šo darbību un pāriet uz nākamo.
  2. 2 Izveidojiet dokumentu. Izveidojiet jaunu failu savā iecienītākajā koda redaktorā un saglabājiet to kā mycube.c
  3. 3 Pievienojiet #ietver. Šeit ir nepieciešamās #iekļaut pamatdirektīvas. Ir svarīgi atcerēties, ka dažādu operētājsistēmu direktīvas ir atšķirīgas, un tāpēc jums ir jāizvēlas viss, lai programma būtu universāla un to varētu palaist jebkurā sistēmā.

      // Ietver #include stdio.h> #include stdarg.h> #include math.h> #define GL_GLEXT_PROTOTYPES #ifdef __APPLE__ #include GLUT / glut.h> #else #include GL / glut.h> #endif

  4. 4 Pievienojiet funkcionālos prototipus un globālos. Nākamais solis ir deklarēt funkcionālos prototipus.

      // Funkcionālie prototipi void display (); void specialKeys (); // Globālie mainīgie double rotate_y = 0; divreiz pagriezt_x = 0;

  5. 5 Definējiet galveno () funkciju.

      int main (int argc, char * argv []) // Inicializēt GLUT un apstrādāt pielāgotus parametrus glutInit (& argc, argv); // Pieprasīt logu ar dubultas buferizācijas, Z buferizācijas un patiesas krāsas glutInitDisplayMode (GLUT_DOUBLE) atbalstu

2. daļa no 3: Displeja () funkcija

  1. 1 Izprotiet displeja () funkcijas mērķi. Viss darbs pie kuba atveidošanas nonāks šīs funkcijas trauslajās līnijās. Vispārējā ideja ir šāda: jūs uzzīmēsit sešas atsevišķas kuba sejas un novietosiet tās attiecīgajās pozīcijās.
    • Katrai sejai jūs definēsit četrus stūrus, un OpenGL tos savienos ar līnijām un aizpildīs ar jūsu izvēlēto krāsu. Kā to izdarīt, tiks paskaidrots turpmāk.
  2. 2 Pievienojiet funkciju glClear (). Pirmkārt, strādājot ar šo funkciju, mums ir nepieciešams skaidra krāsa un z buferis... Bez tā vecais būs redzams zem jaunā attēla, un programmas zīmētie objekti tiks novietoti nepareizi.

      void display () // Notīrīt ekrānu un Z buferi glClear (GL_COLOR_BUFFER_BIT

    • Pievērsiet uzmanību pēdējām divām rindām. Šīs ir funkcijas glFlush (); un glutSwapBuffers ();, radot dubultas buferizācijas efektu, kas tika aprakstīts iepriekš.

3. daļa no 3: Programmas interaktivitāte

  1. 1 Pievienojiet funkciju specialKeys (). Principā viss ir gandrīz gatavs, bet kubs ir tikai uzzīmēts, nevis pagriezts. Lai to izdarītu, jums ir jāizveido funkcija specialKeys (), kas ļaus pagriezt kubu, nospiežot bulttaustiņus!
    • Tieši šai funkcijai tika deklarēti globālie mainīgie rotate_x un rotate_y. Nospiežot kreiso un labo bulttaustiņu, rotate_y vērtība palielināsies vai samazināsies par pieciem grādiem. Rotate_x vērtība mainīsies tādā pašā veidā, bet šoreiz, nospiežot augšup un lejup vērstos bulttaustiņus.
    • void specialKeys (int taustiņš, int x, int y) {// Labā bultiņa - palieliniet rotāciju par 5 grādiem, ja (taustiņš == GLUT_KEY_RIGHT) rotate_y + = 5; // Kreisā bultiņa - Samazināt rotāciju par 5 grādiem, ja (taustiņš == GLUT_KEY_LEFT) rotate_y - = 5; cits if (taustiņš == GLUT_KEY_UP) rotēt_x + = 5; cits if (taustiņš == GLUT_KEY_DOWN) rotate_x - = 5; // Pieprasīt ekrāna atsvaidzināšanu glutPostRedisplay (); }

  2. 2 Pievienojiet glRotate (). Pēdējā lieta, ko mēs darīsim, ir pievienot līniju, kas ļaus mums pagriezt objektu. Atgriezties pie funkcijas displejs () un pirms priekšpuses apraksta pievienojiet:

      // Atiestatīt pārveido glLoadIdentity (); // Pagriezt, kad lietotājs mainās Vērtības rotate_x un rotate_y glRotatef (rotate_x, 1.0, 0.0, 0.0); glRotatef (rotēt_y, 0,0, 1,0, 0,0); // Daudzkrāsaina puse - FRONT ....

    • Lūdzu, ņemiet vērā, ka sintakse glRotatef ()kas ir līdzīga glColor3f () un glVertex3f () sintaksei, bet vienmēr prasa četrus parametrus. Pirmais ir griešanās leņķis grādos. Nākamās trīs ir asis, pa kurām notiek rotācija, secībā x, y, z. Pagaidām mums jāpagriež kubs pa divām asīm, x un y.
    • Visām pārvērtībām, kuras mēs definējam programmā, ir vajadzīgas līdzīgas rindas. Būtībā mēs attēlojam objekta rotāciju gar x asi kā rotate_x vērtības izmaiņas un rotāciju gar y asi kā rotate_y vērtības izmaiņas. Tomēr OpenGL visu apvienos vienā transformācijas matricā. Katru reizi, kad zvanāt uz displeju, jūs izveidosit transformācijas matricu un glLoadIdentity () ļaus jums katru reizi sākt ar jaunu matricu.
    • Citas transformācijas funkcijas, kuras esat izmantojis, ir glTranslatef () un glScalef (). Tie ir līdzīgi glRotatef (), izņemot to, ka tiem ir nepieciešami tikai trīs parametri: x, y un z vērtības, lai mainītu objekta lielumu un mērogu.
    • Lai viss tiktu pareizi parādīts, kad visas trīs transformācijas tiek lietotas vienam objektam, jums ir jāiestata transformācijas atbilstošā secībā, proti glTulkot, glotēt, glScale - un nekad citādi. OpenGL pārveido objektu, lasot programmu no apakšas uz augšu. Lai to labāk saprastu, iedomājieties, kā 1x1x1 kubs izskatītos pēc visām pārvērtībām, ja OpenGL tos piemērotu parādītajā secībā (no augšas uz leju), un tad padomājiet, kā OpenGL apstrādātu kubu, izlasot norādījumus no apakšas uz augšu.
  3. 3 Pievienojiet šādas komandas, lai divreiz mērogotu kubu x un y virzienos, lai pagrieztu kubu par 180 grādiem y asī un pārvietotu kubu 0,1 pa x asi. Pārliecinieties, vai visas atbilstošās komandas, ieskaitot iepriekš dotās glRotate () komandas, ir pareizā secībā. Ja jūs baidāties kļūdīties, skatiet programmas galīgo versiju raksta beigās.

      // Vairāk transformāciju glTranslatef (0,1, 0,0, 0,0); glRotatef (180, 0,0, 1,0, 0,0); glScalef (2,0, 2,0, 0,0);

  4. 4 Apkopojiet un palaidiet kodu. Pieņemsim, ka kā kompilatoru izmantojat gcc, tāpēc terminālī ievadiet šādas komandas:

      Operētājsistēmā Linux: gcc cube.c -o kubs -lglut -lGL ./ mycube Operētājsistēmā Mac: gcc -o foo foo.c -framework GLUT -framework OpenGL ./ mycube Operētājsistēmā Windows: gcc -Wall -ofoo foo.c -lglut32cu - lglu32 -lopengl32 ./ mycube

  5. 5 Pārbaudiet galīgo kodu. Šeit ir raksta autora izveidotais gala kods, kas komentārus netulko.

      // // Fails: mycube.c // Autors: Matt Daisley // Izveidots: 25.04.2012 // Projekts: Avota kods Izveidot kubu OpenGL // Apraksts: izveido OpenGL logu un uzzīmē 3D kubu/ / Lai lietotājs varētu pagriezties, izmantojot bulttaustiņus // // Vadīklas: kreisā bultiņa -pagriezt pa kreisi // labā bultiņa -pagriezt pa labi // augšupvērstā bultiņa -pagriezt uz augšu // lejupvērstā bultiņa -pagriezt uz leju // ------ -------------------------------------------------- -// Ietver // ------------------------------------------- -------------- #include stdio.h> #include stdarg.h> #include math.h> #define GL_GLEXT_PROTOTYPES #ifdef __APPLE__ #include GLUT / glut.h> #else #include GL / glut.h> #endif // ---------------------------------------- ------------------ // Funkciju prototipi // -------------------------- -------------------------------- tukšs displejs (); void specialKeys (); // ------------------------------------------------ ---------- // Globālie mainīgie // ---------------------------------- ------------------------ dubultā rotācija_y = 0; divreiz pagriezt_x = 0; // ------------------------------------------------ ---------- // display () atzvanīšanas funkcija // ------------------------------- --------------------------- tukšs displejs () // Notīrīt ekrānu un Z buferi glClear (GL_COLOR_BUFFER_BIT // ------ -------------------------------------------------- -// specialKeys () atzvanīšanas funkcija // ---------------------------------------- ------------------ void specialKeys (int taustiņš, int x, int y) {// labā bultiņa-palieliniet rotāciju par 5 grādiem, ja (taustiņš == GLUT_KEY_RIGHT) rotate_y + = 5; // kreisā bultiņa - samaziniet rotāciju par 5 grādiem, ja (taustiņš == GLUT_KEY_LEFT) pagrieziet_y - = 5; citādi, ja (taustiņš == GLUT_KEY_UP) pagrieziet_x + = 5; citādi, ja (taustiņš == GLUT_KEY_DOWN) rotate_x - = 5; // Pieprasīt displeja atjauninājumu glutPostRedisplay ();} // ------------------------------------ ---------------------- // galvenā () funkcija // -------------------- -------------------------------------- int main (int argc, char * argv [] ) GLUT_RGB