Kaip padaryti kubą „OpenGL“

Autorius: Gregory Harris
Kūrybos Data: 12 Balandis 2021
Atnaujinimo Data: 1 Liepos Mėn 2024
Anonim
OpenGL Tutorial 23 - Drawing A Cube
Video.: OpenGL Tutorial 23 - Drawing A Cube

Turinys

„OpenGL“ yra 3D programavimo įrankis, leidžiantis sukurti sudėtingus 3D vaizdus iš paprastų formų. Šiame straipsnyje jūs sužinosite, kaip su jo pagalba nupiešti paprastą kubą, kurį galima pasukti trimis matmenimis!

Žingsniai

1 dalis iš 3: Pradinis diegimas

  1. 1 Įdiekite „OpenGL“. Pradėkite nuo mokymo, kaip įdiegti „OpenGL“ savo kompiuteryje. Jei jau turite „OpenGL“ ir „C“ kompiliatorių, galite praleisti šį veiksmą ir pereiti prie kito.
  2. 2 Sukurkite dokumentą. Sukurkite naują failą savo mėgstamiausiame kodo redaktoriuje ir išsaugokite jį kaip mycube.c
  3. 3 Pridėkite #įtraukimus. Štai pagrindinės #įtraukti direktyvos, kurių jums reikės. Svarbu prisiminti, kad skirtingų operacinių sistemų direktyvos yra skirtingos, todėl jums reikia pasirinkti viską, kad programa būtų universali ir ją būtų galima paleisti bet kurioje sistemoje.

      // Apima #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 Pridėkite funkcinius prototipus ir globalius objektus. Kitas žingsnis - deklaruoti funkcinius prototipus.

      // Funkciniai prototipai void display (); void specialKeys (); // Visuotiniai kintamieji double rotate_y = 0; dvigubas sukimas_x = 0;

  5. 5 Apibrėžkite pagrindinę () funkciją.

      int main (int argc, char * argv []) // Inicijuoti GLUT ir apdoroti pasirinktinius parametrus glutInit (& argc, argv); // Prašyti lango su dvigubo buferio, Z buferio ir tikros spalvos glutInitDisplayMode (GLUT_DOUBLE) palaikymu

2 dalis iš 3: Ekrano () funkcija

  1. 1 Supraskite ekrano () funkcijos paskirtį. Visas darbas, susijęs su kubo pateikimu, priklausys trapioms šios funkcijos linijoms. Bendra idėja yra tokia: nupiešite šešis atskirus kubo veidus ir padėsite juos į atitinkamas vietas.
    • Kiekvienam veidui nustatysite keturis kampus, o „OpenGL“ sujungs juos linijomis ir užpildys pasirinkta spalva. Kaip tai padaryti, bus paaiškinta toliau.
  2. 2 Pridėkite funkciją „glClear ()“. Visų pirma, kai dirbame su šia funkcija, mums reikia skaidri spalva ir z-buferis... Jei to nebus, senas bus matomas po nauju paveikslėliu, o programos nupiešti objektai bus neteisingai išdėstyti.

      void display () // Išvalyti ekraną ir Z buferį glClear (GL_COLOR_BUFFER_BIT

    • Atkreipkite dėmesį į dvi paskutines eilutes. Tai yra funkcijos glFlush (); ir glutSwapBuffers ();, suteikiant dvigubo buferio efektą, kuris buvo aprašytas aukščiau.

3 dalis iš 3: Programos interaktyvumas

  1. 1 Pridėkite specialKeys () funkciją. Iš esmės viskas yra beveik paruošta, tačiau kubas yra tik nupieštas ir nesukamas. Norėdami tai padaryti, turite sukurti funkcija specialKeys (), kuris leis pasukti kubą paspaudus rodyklių klavišus!
    • Būtent šiai funkcijai buvo paskelbti visuotiniai kintamieji rotate_x ir rotate_y. Paspaudus rodyklių kairę ir dešinę klavišus, rotate_y reikšmė padidės arba sumažės penkiais laipsniais. „Rotate_x“ reikšmė keisis taip pat, tačiau šį kartą paspaudus rodyklių aukštyn ir žemyn klavišus.
    • void specialKeys (int klavišas, int x, int y) {// Rodyklė į dešinę - padidinkite sukimąsi 5 laipsniais, jei (klavišas == GLUT_KEY_RIGHT) rotate_y + = 5; // Rodyklė į kairę - Sumažinti sukimąsi 5 laipsniais, jei (klavišas == GLUT_KEY_LEFT) rotate_y - = 5; else if (raktas == GLUT_KEY_UP) rotate_x + = 5; else if (raktas == GLUT_KEY_DOWN) rotate_x - = 5; // Prašyti ekrano atnaujinimo glutPostRedisplay (); }

  2. 2 Pridėkite „glRotate“ (). Paskutinis dalykas, kurį mes padarysime, yra pridėti eilutę, kuri leis mums pasukti objektą. Grįžti į funkciją rodyti () ir prieš FRONT pusės aprašymą pridėkite:

      // Atstatyti transformuoja glLoadIdentity (); // Pasukti, kai vartotojas pasikeičia Vertės rotate_x ir rotate_y glRotatef (rotate_x, 1.0, 0.0, 0.0); glRotatef (pasukti_y, 0,0, 1,0, 0,0); // Daugiaspalvė pusė - PRIEŠ ....

    • Atminkite, kad sintaksė glRotatef ()kuri yra panaši į glColor3f () ir glVertex3f () sintaksę, tačiau visada reikalauja keturių parametrų. Pirmasis yra sukimosi kampas laipsniais. Kiti trys yra ašys, išilgai kurių vyksta sukimasis, tvarka x, y, z. Kol kas turime pasukti kubą išilgai dviejų ašių, x ir y.
    • Visoms transformacijoms, kurias mes apibrėžiame programoje, reikia panašių eilučių. Iš esmės mes vaizduojame objekto sukimąsi išilgai x ašies kaip rotate_x vertės pasikeitimą, o sukimąsi išilgai y ašies-kaip rotate_y vertės pasikeitimą. Tačiau „OpenGL“ sujungs viską į vieną transformacijos matricą. Kiekvieną kartą, kai skambinate ekranui, sukursite transformacijos matricą ir glLoadIdentity () leis kiekvieną kartą pradėti nuo naujos matricos.
    • Kitos transformacijos funkcijos, kurias galbūt naudojote, yra glTranslatef () ir glScalef (). Jie yra panašūs į „glRotatef“ (), išskyrus tai, kad jiems reikia tik trijų parametrų: x, y ir z reikšmių, kad pakeistų objekto dydį ir mastelį.
    • Kad viskas būtų rodoma teisingai, kai visos trys transformacijos taikomos vienam objektui, turite nustatyti transformacijas tinkama tvarka, būtent glTranslate, glRotate, glScale - ir niekada kitaip. „OpenGL“ paverčia objektą skaitydamas programą iš apačios į viršų. Kad geriau tai suprastumėte, įsivaizduokite, kaip 1x1x1 kubas atrodytų po visų transformacijų, jei „OpenGL“ juos pritaikytų nurodyta tvarka (iš viršaus į apačią), o tada pagalvokite, kaip „OpenGL“ apdorotų kubą, skaitydami instrukcijas iš apačios į viršų.
  3. 3 Pridėkite šias komandas, kad kubą padidintumėte du kartus x ir y kryptimis, kubą pasuktumėte 180 laipsnių y ašimi, o kubą - 0,1 ašies. Įsitikinkite, kad visos svarbios komandos, įskaitant anksčiau duotas „glRotate“ () komandas, yra teisingos eilės. Jei bijote suklysti, galutinę programos versiją rasite straipsnio pabaigoje.

      // Daugiau transformacijų glTranslatef (0,1, 0,0, 0,0); glRotatef (180, 0,0, 1,0, 0,0); „glScalef“ (2,0, 2,0, 0,0);

  4. 4 Sudarykite ir paleiskite kodą. Tarkime, kad kompiliatoriumi naudojate gcc, todėl į terminalą įveskite šias komandas:

      „Linux“: gcc cube.c -o kubas -lglut -lGL ./ mycube „Mac“: gcc -o foo foo.c -framework GLUT -framework OpenGL ./ mycube „Windows“: gcc -Wall -ofoo foo.c -lglut32cu - lglu32 -lopengl32 ./ mycube

  5. 5 Patikrinkite galutinį kodą. Čia yra galutinis straipsnio autoriaus sukurtas kodas, kuris neišverčia komentarų.

      // Failas: mycube.c // Autorius: Matt Daisley // Sukurta: 2012.04.25 // Projektas: „Open agl“ kubo kūrimo šaltinio kodas // Aprašymas: sukuria „OpenGL“ langą ir piešia 3D kubą/ / Kad vartotojas galėtų pasukti naudodami rodyklių klavišus // // Valdikliai: rodyklė į kairę -pasukti į kairę // rodyklė į dešinę -pasukti į dešinę // rodyklė aukštyn -pasukti aukštyn // rodyklė žemyn -pasukti žemyn // ------ -------------------------------------------------- -// Apima // ------------------------------------------- -------------- #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 // ---------------------------------------- ------------------ // Funkcijų prototipai // -------------------------- -------------------------------- tuščias ekranas (); void specialKeys (); // ------------------------------------------------ ---------- // Pasauliniai kintamieji // ---------------------------------- ------------------------ dviguba rotacija_y = 0; dvigubas sukimas_x = 0; // ------------------------------------------------ ---------- // display () atgalinio ryšio funkcija // ------------------------------- --------------------------- tuščias ekranas () // Išvalyti ekraną ir Z-buferį glClear (GL_COLOR_BUFFER_BIT // ------ -------------------------------------------------- -// specialKeys () Atšaukimo funkcija // ---------------------------------------- ------------------ void specialKeys (int klavišas, int x, int y) {// rodyklė į dešinę-padidinkite sukimąsi 5 laipsniais, jei (klavišas == GLUT_KEY_RIGHT) rotate_y + = 5; // rodyklė į kairę - sumažinkite sukimąsi 5 laipsniais, jei (klavišas == GLUT_KEY_LEFT) pasukite_y - = 5; kitaip, jei (klavišas == GLUT_KEY_UP) pasukite_x + = 5; kitaip, jei (klavišas == GLUT_KEY_DOWN) rotate_x - = 5; // Pateikti ekrano atnaujinimo užklausą glutPostRedisplay ();} // ----------------------------------- ---------------------- // pagrindinė () funkcija // -------------------- -------------------------------------- int main (int argc, char * argv [] ) GLUT_RGB