OpenGL je výkonný 3D programovací nástroj, ktorý sa používa na kreslenie zložitých trojrozmerných scén z jednoduchých primitívov. Tento článok vás naučí, ako nakresliť jednoduchú kocku, ktorú môžete otáčaním zobraziť v troch rozmeroch!
Na tento projekt budete potrebovať editor kódu a určité znalosti programovania v jazyku C.
Kroky
Časť 1 z 3: Počiatočné nastavenie
Krok 1. Inštalácia OpenGL Ak chcete začať, pri inštalácii OpenGL do vášho systému postupujte podľa týchto krokov
Ak už máte OpenGL a nainštalovaný kompatibilný kompilátor C, môžete tento krok preskočiť a prejsť na ďalší.
Krok 2. Vytvorte dokument
Vytvorte nový súbor vo svojom obľúbenom editore kódu a uložte ho ako mycube.c
Krok 3. Pridajte #obsahuje
Toto sú základné položky, ktoré budete pre svoj program potrebovať. Je dôležité si uvedomiť, že v skutočnosti existujú rôzne zahrnutia potrebné pre rôzne operačné systémy. Nezabudnite zahrnúť všetky tieto položky, aby bol váš program univerzálny a mohol bežať pre akéhokoľvek používateľa.
// Zahŕňa #include #include #include #define GL_GLEXT_PROTOTYPES #ifdef _APPLE_ #include #else #include #endif
Krok 4. Pridajte funkčné prototypy a globálne premenné
Ďalším krokom je deklarovanie niektorých prototypov funkcií.
// Funkčné prototypy void display (); neplatné špeciálne klávesy (); // Globálne premenné double rotate_y = 0; dvojité otočenie_x = 0;
Krok 5. Nastavte funkciu main ()
int main (int argc, char* argv ) {// Inicializácia GLUT a spracovanie užívateľských parametrov glutInit (& argc, argv); // Požiadajte okno s dvojitou vyrovnávacou pamäťou o skutočnú farbu pomocou Z-bufferu glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
Krok 6. Vytvorte okno
Ďalším krokom je vytvorte okno v rámci ktorého nakreslíte kocku. V tomto návode sa toto okno nazýva „Úžasná kocka“.
// Vytvorenie okna glutCreateWindow ("Úžasná kocka");
Krok 7. Povoliť test hĺbky
OpenGL je striktný jazyk, pretože nepredpokladá, že sú povolené akékoľvek špeciálne funkcie. Aby sa váš program správne zobrazoval v 3-rozmeroch pomocou vyrovnávacej pamäte Z, na ktorú ste sa pozerali predtým, musíte povoliť hĺbkový test. Ako budete pokračovať v skúmaní OpenGL, objavíte mnoho funkcií, ktoré budete musieť povoliť, vrátane osvetlenia, textúr, orientácie na porážku a mnohých ďalších.
// Povoliť test hĺbky Z-buffera glEnable (GL_DEPTH_TEST);
Krok 8. Pridajte funkcie spätného volania
Tu sú funkcie spätného volania, pre ktoré ste predtým napísali prototypy. Zakaždým, keď prejdete hlavnou slučkou, budú tieto funkcie vyvolané. Funkcia zobrazenia prekreslí scénu na základe akýchkoľvek zmien premenných, ktoré boli vykonané od predchádzajúceho hovoru. Funkcia specialKeys nám umožňuje interakciu s programom.
// Funkcie spätného volania glutDisplayFunc (zobrazenie); glutSpecialFunc (specialKeys);
Krok 9. Spustite MainLoop
Tým sa vyvolá hlavná funkcia, kým program neukončíte, aby sa umožnili animácie a interakcia s používateľom.
// Odovzdanie kontroly GLUT pre udalosti glutMainLoop (); // Návrat do OS návrat 0; }
Časť 2 z 3: Funkcia displeja ()
Krok 1. Pochopte účel tejto funkcie
V tejto funkcii bude vykonaná všetka práca pri kreslení vašej kocky. Všeobecnou myšlienkou vašej kocky je nakresliť všetkých šesť strán jednotlivo a umiestniť ich do príslušnej polohy.
Koncepčne bude každá strana nakreslená definovaním štyroch rohov a nechaním OpenGL spojí čiary a vyplní ju vami definovanou farbou. Nasledujú kroky, ako to urobiť
Krok 2. Pridajte glClear ()
Prvým krokom, ktorý musíte v tejto funkcii urobiť, je vymažte farbu a Z buffer. Bez týchto krokov môžu byť pod novými kresbami stále viditeľné staré kresby a nakreslené objekty by neboli na správnom mieste na obrazovke.
void display () {// Čistá obrazovka a Z-buffer glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
Krok 3. Pridajte glBegin () a glEnd ()
OpenGL definuje objekty ako kombinácie rôznych polygónov. Pomocou glBegin () príkaz, efektívne odložíte ceruzku, ktorá nakreslí tvar. Ak chcete zdvihnúť ceruzku a začať nový tvar, musíte použiť glEnd () príkaz. V tomto návode použijete GL_POLYGON na nakreslenie každej strany kocky, ale na vytvorenie ďalších tvarov je možné použiť aj ďalšie možnosti parametrov, ako napríklad GL_LINE, GL_QUAD alebo GL_TRIANGLE.
- Tu budete začínať od prednej časti svojej kocky. Neskôr pridáte farbu na všetkých 6 strán.
// Viacfarebná strana - PREDNÁ glBegin (GL_POLYGON); // V ďalšom kroku budú pridané vrcholy glEnd ();
Krok 4. Pridajte glVertex3f ()
Keď ste povedali, že chcete začať s mnohouholníkom, musíte definujte vrcholy predmetu. glVertex má niekoľko foriem v závislosti od toho, čo chcete s objektom robiť.
- Prvá je, v koľkých dimenziách pracujete. 3 vyššie v glVertex3f hovorí, že kreslíte v 3 dimenziách. Je tiež možné pracovať v 2 alebo 4 rozmeroch. F vyššie v glVertex3f hovorí, že pracujete s číslami s pohyblivou rádovou čiarkou. Môžete tiež použiť krátke, celé alebo dvojité čísla.
- Všimnite si, že tieto body sú definované v a proti smeru hodinových ručičiek spôsobom. V tejto chvíli to nie je veľmi dôležité, ale keď začnete pracovať s osvetlením, textúrami a orientáciou na porážku, bude to veľmi dôležité, takže si zvyknite definovať svoje body teraz proti smeru hodinových ručičiek.
- Pridajte sčítanie vrcholov medzi riadky glBegin () a glEnd ().
// Viacfarebná strana - PREDNÁ glBegin (GL_POLYGON); glVertex3f (-0,5, -0,5, -0,5); // P1 glVertex3f (-0,5, 0,5, -0,5); // P2 glVertex3f (0,5, 0,5, -0,5); // P3 glVertex3f (0,5, -0,5, -0,5); // P4 glEnd ();
Krok 5. Pridajte glColor3f ()
glColor funguje podobným spôsobom ako glVertex. Body môžete definovať ako šortky, celé čísla, štvorhry alebo plávajúce čísla. Každá farba má hodnotu od 0 do 1. Všetky 0 spôsobia, že bod bude čierny a všetky 1 body budú biele. 3 v glColor3f () odkazuje na farebný systém RGB bez kanála alfa. Alfa farby definuje jej priehľadnosť. Ak chcete zmeniť úroveň alfa, použite glColor4f () s tým, že posledný parameter bude mať hodnotu 0 až 1 pre nepriehľadné až priehľadné.
- Keď zavoláte glColor3f (), každý vrchol nakreslený od tohto bodu bude mať túto farbu. Ak teda chcete, aby všetky štyri vrcholy boli červené, jednoducho nastavte farbu raz pred príkazmi glVertex3f () a všetky vrcholy budú červené.
- Predná strana definovaná nižšie ukazuje, ako definovať novú farbu pre každý vrchol. Keď to urobíte, môžete vidieť zaujímavú vlastnosť farieb OpenGL. Pretože každý vrchol mnohouholníka má svoju vlastnú farbu, OpenGL farby automaticky zmieša! Ďalší krok ukáže, ako priradiť štyri vrcholy s rovnakou farbou.
// Viacfarebná strana - PREDNÁ glBegin (GL_POLYGON); glColor3f (1,0, 0,0, 0,0); glVertex3f (0,5, -0,5, -0,5); // P1 je červená glColor3f (0,0, 1,0, 0,0); glVertex3f (0,5, 0,5, -0,5); // P2 je zelená glColor3f (0,0, 0,0, 1,0); glVertex3f (-0,5, 0,5, -0,5); // P3 je modrá glColor3f (1,0, 0,0, 1,0); glVertex3f (-0,5, -0,5, -0,5); // P4 je purpurový glEnd ();
Krok 6. Zaobchádzajte s ostatnými stranami
Zistite, aké bude umiestnenie každého vrcholu pre ostatných päť strán kocky, ale pre jednoduchosť tieto boli vypočítané za vás a sú zahrnuté v konečná funkcia display () nižšie.
// Biela strana - SPÄŤ glBegin (GL_POLYGON); glColor3f (1,0, 1,0, 1,0); glVertex3f (0,5, -0,5, 0,5); glVertex3f (0,5, 0,5, 0,5); glVertex3f (-0,5, 0,5, 0,5); glVertex3f (-0,5, -0,5, 0,5); glEnd (); // Fialová strana - SPRÁVNE glBegin (GL_POLYGON); glColor3f (1,0, 0,0, 1,0); glVertex3f (0,5, -0,5, -0,5); glVertex3f (0,5, 0,5, -0,5); glVertex3f (0,5, 0,5, 0,5); glVertex3f (0,5, -0,5, 0,5); glEnd (); // Zelená strana - VĽAVO glBegin (GL_POLYGON); glColor3f (0,0, 1,0, 0,0); glVertex3f (-0,5, -0,5, 0,5); glVertex3f (-0,5, 0,5, 0,5); glVertex3f (-0,5, 0,5, -0,5); glVertex3f (-0,5, -0,5, -0,5); glEnd (); // Modrá strana - TOP glBegin (GL_POLYGON); glColor3f (0,0, 0,0, 1,0); glVertex3f (0,5, 0,5, 0,5); glVertex3f (0,5, 0,5, -0,5); glVertex3f (-0,5, 0,5, -0,5); glVertex3f (-0,5, 0,5, 0,5); glEnd (); // Červená strana - BOTTOM glBegin (GL_POLYGON); glColor3f (1,0, 0,0, 0,0); glVertex3f (0,5, -0,5, -0,5); glVertex3f (0,5, -0,5, 0,5); glVertex3f (-0,5, -0,5, 0,5); glVertex3f (-0,5, -0,5, -0,5); glEnd (); glFlush (); glutSwapBuffers (); }
Chceme tiež pridať dva posledné riadky kódu pre túto funkciu. Toto sú glFlush ();
a glutSwapBuffers ();
ktoré nám poskytujú efekt dvojitého ukladania do vyrovnávacej pamäte, o ktorom ste sa dozvedeli skôr.
Časť 3 z 3: Interaktivita používateľov
Krok 1. Pridajte specialKeys ()
Ste takmer hotoví, ale v súčasnosti môžete kocku nakresliť, ale nemôžete ju otáčať. Ak to chcete urobiť, urobíte to vytvoriť špeciálne klávesy () funkcia, ktorá nám umožňuje stláčať klávesy šípok a otáčať kockou!
- Z tohto dôvodu ste deklarovali globálne premenné rotate_x a rotate_y. Keď stlačíte šípku doprava a doľava, funkcia rotate_y sa zvýši alebo zníži o 5 stupňov. Podobne, keď stlačíte klávesy so šípkou nahor a nadol, rotate_x sa zodpovedajúcim spôsobom zmení.
void specialKeys (int key, int x, int y) {// Šípka doprava - zvýši rotáciu o 5 stupňov, ak (kláves == GLUT_KEY_RIGHT) rotate_y += 5; // Šípka doľava - zníženie rotácie o 5 stupňov inak, ak (kláves == GLUT_KEY_LEFT) rotate_y - = 5; else if (key == GLUT_KEY_UP) rotate_x += 5; else if (key == GLUT_KEY_DOWN) rotate_x -= 5; // Žiadosť o aktualizáciu displeja glutPostRedisplay (); }
Krok 2. Pridajte glRotate ()
Vaše posledné vyhlásenie je pridať príkaz, ktorý bude otáčať váš objekt. Vráťte sa na funkciu display () a pred PREDNÚ stranu pridajte tieto riadky:
// Reset transformácií glLoadIdentity (); // Rotate when user changes rotate_x and rotate_y glRotatef (rotate_x, 1.0, 0.0, 0.0); glRotatef (rotate_y, 0,0, 1,0, 0,0); // Viacfarebná strana - PREDNÁ …
Krok 3. Pridajte nasledujúce príkazy na zmenu veľkosti kocky o 2 pozdĺž osi x, 2 pozdĺž osi y, otočte kockou o 180 stupňov okolo osi y a preložte kocku o 0,1 pozdĺž osi x
Uistite sa, že ste ich usporiadali rovnako ako predchádzajúce príkazy glRotate () v správnom poradí, ako je popísané vyššie. (Ak si nie ste istí, urobí sa to v konečnom kóde na konci tutoriálu.)
// Ostatné transformácie glTranslatef (0,1, 0,0, 0,0); glRotatef (180, 0,0, 1,0, 0,0); glScalef (2,0, 2,0, 0,0);
Krok 4. Skompilujte a spustite kód
Za predpokladu, že ako kompilátor používate gcc, spustite tieto príkazy z terminálu na kompiláciu a testovanie programu.
V systéme Linux: gcc cube.c -o cube -lglut -lGL./ mycube V systéme Mac: gcc -o foo foo.c -framework GLUT -framework OpenGL./ mycube V systéme Windows: gcc -Wall -ofoo foo.c -lglut32cu - lglu32 -lopengl32./ mycube
Krok 5. Skontrolujte svoj úplný kód
Malo by to byť takto:
// // Súbor: mycube.c // Autor: Matt Daisley // Vytvorené: 25. 4. 2012 // Projekt: Zdrojový kód pre Make a Cube in OpenGL // Popis: Vytvorí okno OpenGL a nakreslí 3D kocku/ / Že sa používateľ môže otáčať pomocou klávesov so šípkami // // Ovládacie prvky: Šípka doľava -Otočiť doľava // Šípka doprava -Otočiť doprava // Šípka hore -Otočiť nahor // Šípka nadol -Otočiť nadol // ------ ---------------------------------------------------------- -// Obsahuje // ------------------------------------------- --------------- #include #include #include #define GL_GLEXT_PROTOTYPES #ifdef _APPLE_ #include #else #include #endif // ------------- --------------------------------------------- // Funkčné prototypy / / ------------------------------------------------- --------- neplatné zobrazenie (); neplatné špeciálne klávesy (); // ------------------------------------------------ ---------- // Globálne premenné // ---------------------------------- ------------------------ double rotate_y = 0; dvojité otočenie_x = 0; // ------------------------------------------------ ---------- // display () Funkcia spätného volania // ------------------------------- --------------------------- neplatné zobrazenie () {// Čistá obrazovka a Z-buffer glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Reset transformácií glLoadIdentity (); // Ostatné transformácie // glTranslatef (0,1, 0,0, 0,0); // Nie je zahrnuté // glRotatef (180, 0,0, 1,0, 0,0); // Nie je zahrnuté // Rotate when user changes rotate_x and rotate_y glRotatef (rotate_x, 1.0, 0.0, 0.0); glRotatef (rotate_y, 0,0, 1,0, 0,0); // Ostatné transformácie // glScalef (2.0, 2.0, 0.0); // Nie je súčasťou // Viacfarebná strana - PREDNÁ glBegin (GL_POLYGON); glColor3f (1,0, 0,0, 0,0); glVertex3f (0,5, -0,5, -0,5); // P1 je červená glColor3f (0,0, 1,0, 0,0); glVertex3f (0,5, 0,5, -0,5); // P2 je zelená glColor3f (0,0, 0,0, 1,0); glVertex3f (-0,5, 0,5, -0,5); // P3 je modrá glColor3f (1,0, 0,0, 1,0); glVertex3f (-0,5, -0,5, -0,5); // P4 je purpurový glEnd (); // Biela strana - SPÄŤ glBegin (GL_POLYGON); glColor3f (1,0, 1,0, 1,0); glVertex3f (0,5, -0,5, 0,5); glVertex3f (0,5, 0,5, 0,5); glVertex3f (-0,5, 0,5, 0,5); glVertex3f (-0,5, -0,5, 0,5); glEnd (); // Fialová strana - SPRÁVNE glBegin (GL_POLYGON); glColor3f (1,0, 0,0, 1,0); glVertex3f (0,5, -0,5, -0,5); glVertex3f (0,5, 0,5, -0,5); glVertex3f (0,5, 0,5, 0,5); glVertex3f (0,5, -0,5, 0,5); glEnd (); // Zelená strana - VĽAVO glBegin (GL_POLYGON); glColor3f (0,0, 1,0, 0,0); glVertex3f (-0,5, -0,5, 0,5); glVertex3f (-0,5, 0,5, 0,5); glVertex3f (-0,5, 0,5, -0,5); glVertex3f (-0,5, -0,5, -0,5); glEnd (); // Modrá strana - TOP glBegin (GL_POLYGON); glColor3f (0,0, 0,0, 1,0); glVertex3f (0,5, 0,5, 0,5); glVertex3f (0,5, 0,5, -0,5); glVertex3f (-0,5, 0,5, -0,5); glVertex3f (-0,5, 0,5, 0,5); glEnd (); // Červená strana - BOTTOM glBegin (GL_POLYGON); glColor3f (1,0, 0,0, 0,0); glVertex3f (0,5, -0,5, -0,5); glVertex3f (0,5, -0,5, 0,5); glVertex3f (-0,5, -0,5, 0,5); glVertex3f (-0,5, -0,5, -0,5); glEnd (); glFlush (); glutSwapBuffers (); } // ----------------------------------------------- ----------- // specialKeys () Funkcia spätného volania // ------------------------------ ---------------------------- void specialKeys (int key, int x, int y) {// Šípka doprava-zvýšenie otáčania o 5 stupeň, ak (kláves == GLUT_KEY_RIGHT) rotate_y += 5; // Šípka doľava - zníženie rotácie o 5 stupňov inak, ak (kláves == GLUT_KEY_LEFT) rotate_y - = 5; else if (key == GLUT_KEY_UP) rotate_x += 5; else if (key == GLUT_KEY_DOWN) rotate_x -= 5; // Žiadosť o aktualizáciu displeja glutPostRedisplay (); } // ----------------------------------------------- ----------- // funkcia main () // ------------------------------- --------------------------- int main (int argc, char* argv ) {// Inicializácia GLUT a spracovanie užívateľských parametrov glutInit (& argc, argv); // Požiadajte okno s dvojitou vyrovnávacou pamäťou o skutočnú farbu pomocou Z-bufferu glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); // Vytvorenie okna glutCreateWindow ("Úžasná kocka"); // Povoliť test hĺbky Z-buffera glEnable (GL_DEPTH_TEST); // Funkcie spätného volania glutDisplayFunc (zobrazenie); glutSpecialFunc (specialKeys); // Odovzdanie kontroly GLUT pre udalosti glutMainLoop (); // Návrat do OS návrat 0; }