OpenGL je výkonný 3D programovací nástroj sloužící k kreslení složitých trojrozměrných scén z jednoduchých primitiv. Tento článek vás naučí nakreslit jednoduchou krychli, kterou můžete otáčením zobrazit ve třech rozměrech!
Pro tento projekt budete potřebovat editor kódu a určité znalosti programování v jazyce C.
Kroky
Část 1 ze 3: Počáteční nastavení
Krok 1. Instalace OpenGL Chcete -li začít, nainstalujte OpenGL do svého systému následujícím způsobem
Pokud již máte OpenGL a také nainstalovaný kompatibilní kompilátor C, můžete tento krok přeskočit a přejít na další.
Krok 2. Vytvořte dokument
Vytvořte nový soubor ve svém oblíbeném editoru kódu a uložte jej jako mycube.c
Krok 3. Přidejte #includes
Toto jsou základní položky, které budete pro svůj program potřebovat. Je důležité si uvědomit, že pro různé operační systémy jsou skutečně požadována různá zahrnutí. Nezapomeňte zahrnout všechny tyto položky, abyste zajistili, že váš program bude univerzální a může běžet pro každého uživatele.
// Zahrnuje #include #include #include #define GL_GLEXT_PROTOTYPES #ifdef _APPLE_ #include #else #include #endif
Krok 4. Přidejte funkční prototypy a globální proměnné
Dalším krokem je deklarace některých prototypů funkcí.
// Funkce Prototypy void display (); void specialKeys (); // Globální proměnné double rotate_y = 0; double rotate_x = 0;
Krok 5. Nastavte funkci main ()
int main (int argc, char* argv ) {// Inicializace GLUT a zpracování uživatelských parametrů glutInit (& argc, argv); // Požádejte o okno s dvojitou vyrovnávací pamětí v pravé barvě pomocí Z-buffer glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
Krok 6. Vytvořte okno
Dalším krokem je vytvořte okno v rámci kterého nakreslíte kostku. V tomto tutoriálu se toto okno nazývá „Úžasná kostka“.
// Vytvořit okno glutCreateWindow ("Úžasná kostka");
Krok 7. Povolte hloubkový test
OpenGL je přísný jazyk, protože nepředpokládá, že jsou povoleny žádné speciální funkce. Aby se váš program správně zobrazoval ve 3 rozměrech pomocí vyrovnávací paměti Z, na kterou jste se dívali dříve, musíte povolit hloubkový test. Jak budete pokračovat v průzkumu OpenGL, objevíte mnoho funkcí, které budete muset povolit, včetně osvětlení, textur, vyřazení z provozu a mnoho dalšího.
// Povolit test hloubky vyrovnávací paměti Z glEnable (GL_DEPTH_TEST);
Krok 8. Přidejte funkce zpětného volání
Zde jsou funkce zpětného volání, pro které jste dříve napsali prototypy. Pokaždé, když projdete hlavní smyčkou, budou tyto funkce vyvolány. Funkce zobrazení překreslí scénu na základě jakýchkoli změn proměnných, které byly provedeny od předchozího volání. Funkce specialKeys nám umožňuje interakci s programem.
// Funkce zpětného volání glutDisplayFunc (zobrazení); glutSpecialFunc (specialKeys);
Krok 9. Spusťte MainLoop
Tím se vyvolá hlavní funkce, dokud program nezavřete, aby bylo možné provádět animace a interakci s uživatelem.
// Předání řízení GLUT pro události glutMainLoop (); // Návrat do OS návrat 0; }
Část 2 ze 3: Funkce displeje ()
Krok 1. Pochopte účel této funkce
V této funkci bude provedena veškerá práce při kreslení vaší kostky. Obecnou myšlenkou vaší kostky je nakreslit všech šest stran jednotlivě a umístit je do příslušné polohy.
Koncepčně bude každá strana nakreslena definováním čtyř rohů a ponecháním OpenGL spojit čáry a vyplnit ji barvou, kterou definujete. Níže jsou uvedeny kroky, jak toho dosáhnout
Krok 2. Přidejte glClear ()
Prvním krokem, který musíte v této funkci udělat, je vymažte barvu a vyrovnávací paměť Z.. Bez těchto kroků mohou být staré kresby stále viditelné pod novými kresbami a nakreslené objekty by nebyly na správném místě na obrazovce.
void display () {// Vymazat obrazovku a Z-buffer glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
Krok 3. Přidejte glBegin () a glEnd ()
OpenGL definuje objekty jako kombinace různých polygonů. Za použití glBegin () příkaz, efektivně odložíte tužku, která nakreslí tvar. Chcete -li tužku zvednout a začít nový tvar, musíte použít glEnd () příkaz. V tomto tutoriálu budete pomocí GL_POLYGON kreslit každou stranu krychle, ale je možné použít další možnosti parametrů, jako GL_LINE, GL_QUAD nebo GL_TRIANGLE k vytvoření dalších tvarů.
- Zde budete začínat přední částí krychle. Později přidáte barvu na všech 6 stranách.
// Vícebarevná strana - PŘEDNÍ glBegin (GL_POLYGON); // V dalším kroku budou přidány vrcholy glEnd ();
Krok 4. Přidejte glVertex3f ()
Jakmile uvedete, že chcete začít s polygonem, musíte definujte vrcholy objektu. glVertex má více forem v závislosti na tom, co chcete se svým objektem dělat.
- První je, v jakých dimenzích pracujete. 3 výše v glVertex3f říká, že kreslíte ve 3 dimenzích. Je také možné pracovat ve 2 nebo 4 rozměrech. F výše v glVertex3f říká, že pracujete s čísly s plovoucí desetinnou čárkou. Můžete také použít šortky, celá čísla nebo čtyřhry.
- Všimněte si, že tyto body jsou definovány v a proti směru hodinových ručiček způsob. V tuto chvíli to není příliš důležité, ale když začnete pracovat s osvětlením, texturami a vyřazováním, bude to neuvěřitelně důležité, takže si zvykněte definovat své body nyní proti směru hodinových ručiček.
- Přidat přidejte vrcholy mezi řádky glBegin () a glEnd ().
// Vícebarevná strana - PŘEDNÍ 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. Přidejte glColor3f ()
glColor funguje podobným způsobem jako glVertex. Body můžete definovat jako šortky, celá čísla, čtyřhry nebo plováky. Každá barva má hodnotu od 0 do 1. Všechny 0 způsobí, že bod bude černý a všechny 1 budou bod bílý. 3 v glColor3f () odkazuje na barevný systém RGB bez alfa kanálu. Alfa barvy určuje její průhlednost. Chcete -li změnit úroveň alfa, použijte glColor4f (), přičemž posledním parametrem je hodnota 0 až 1 pro neprůhledné až průhledné.
- Když zavoláte glColor3f (), každý vrchol nakreslený od tohoto bodu bude mít tuto barvu. Pokud tedy chcete, aby všechny čtyři vrcholy byly červené, stačí nastavit barvu jednou před příkazy glVertex3f () a všechny vrcholy budou červené.
- Níže definovaná přední strana ukazuje, jak definovat novou barvu pro každý vrchol. Když to uděláte, můžete vidět zajímavou vlastnost barev OpenGL. Protože každý vrchol mnohoúhelníku má svou vlastní barvu, OpenGL barvy automaticky míchá! Následující krok ukáže, jak přiřadit čtyři vrcholy se stejnou barvou.
// Vícebarevná strana - PŘEDNÍ 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. Zacházejte s ostatními stranami
Zjistěte, jaké bude umístění každého vrcholu pro dalších pět stran krychle, ale pro jednoduchost byly tyto vypočítány pro vás a jsou zahrnuty v konečná funkce display () níže.
// Bílá strana - ZPĚT 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ÁVNĚ 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 - VLEVO 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 také přidat dva poslední řádky kódu pro tuto funkci. Tyto jsou glFlush ();
a glutSwapBuffers ();
což nám dává efekt dvojitého ukládání do vyrovnávací paměti, o kterém jste se dozvěděli dříve.
Část 3 ze 3: Interaktivita uživatelů
Krok 1. Přidejte specialKeys ()
Jste téměř hotovi, ale v tuto chvíli můžete kostku nakreslit, ale nemůžete ji otáčet. Uděláte to vytvořit specialKeys () funkce, která nám umožní stisknout klávesy se šipkami a otočit kostku!
- Tato funkce je důvodem, proč jste deklarovali globální proměnné rotate_x a rotate_y. Když stisknete klávesy se šipkami doprava a doleva, rotate_y se zvýší nebo sníží o 5 stupňů. Podobně, když stisknete klávesy se šipkami nahoru a dolů, rotate_x se odpovídajícím způsobem změní.
void specialKeys (int key, int x, int y) {// Šipka doprava - zvýšení otáčení o 5 stupňů if (key == GLUT_KEY_RIGHT) rotate_y += 5; // Šipka doleva - sníží rotaci o 5 stupňů jinak if (key == GLUT_KEY_LEFT) rotate_y - = 5; jinak if (key == GLUT_KEY_UP) rotate_x += 5; jinak if (key == GLUT_KEY_DOWN) rotate_x -= 5; // Žádost o aktualizaci displeje glutPostRedisplay (); }
Krok 2. Přidejte glRotate ()
Vaším posledním příkazem je přidat příkaz, který otočí váš objekt. Vraťte se zpět k funkci display () a před PŘEDNÍ stranu přidejte tyto řádky:
// Reset transformací 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); // Vícebarevná strana - PŘED …
Krok 3. Přidejte následující příkazy pro změnu velikosti krychle o 2 podél osy x, 2 podle osy y, otočte krychli o 180 stupňů kolem osy y a překládejte krychli o 0,1 podle osy x
Ujistěte se, že jste je uspořádali stejně jako předchozí příkazy glRotate () ve správném pořadí, jak je popsáno výše. (Pokud si nejste jisti, je to provedeno v konečném kódu na konci tutoriálu.)
// Další transformace glTranslatef (0,1, 0,0, 0,0); glRotatef (180, 0,0, 1,0, 0,0); glScalef (2,0, 2,0, 0,0);
Krok 4. Zkompilujte a spusťte kód
Za předpokladu, že jako kompilátor používáte gcc, spusťte tyto příkazy z terminálu a zkompilujte a otestujte svůj program.
Na Linuxu: gcc cube.c -o cube -lglut -lGL./ mycube Na Macu: gcc -o foo foo.c -framework GLUT -framework OpenGL./ mycube Na Windows: gcc -Wall -ofoo foo.c -lglut32cu - lglu32 -lopengl32./ mycube
Krok 5. Zkontrolujte celý kód
Mělo by to být takto:
// // Soubor: mycube.c // Autor: Matt Daisley // Vytvořeno: 25. 4. 2012 // Projekt: Zdrojový kód pro Make a Cube in OpenGL // Popis: Vytvoří okno OpenGL a nakreslí 3D kostku/ / Že se uživatel může otáčet pomocí kláves se šipkami // // Ovládací prvky: Šipka doleva -Otočit doleva // Šipka doprava -Otočit doprava // Šipka nahoru -Otočit nahoru // Šipka dolů -Otočit dolů // ------ ---------------------------------------------------------- -- // Zahrnuje // ------------------------------------------- --------------- #include #include #include #define GL_GLEXT_PROTOTYPES #ifdef _APPLE_ #include #else #include #endif // ------------- -------------------------------------------- // Funkční prototypy / / ------------------------------------------------- --------- neplatné zobrazení (); void specialKeys (); // ------------------------------------------------ ---------- // Globální proměnné // ---------------------------------- ------------------------ double rotate_y = 0; double rotate_x = 0; // ------------------------------------------------ ---------- // display () Funkce zpětného volání // ------------------------------- --------------------------- neplatné zobrazení () {// Vymazání obrazovky a Z-bufferu glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Reset transformací glLoadIdentity (); // Jiné transformace // glTranslatef (0,1, 0,0, 0,0); // Není zahrnuto // glRotatef (180, 0,0, 1,0, 0,0); // Není zahrnuto // Otočit, když uživatel změní rotate_x a rotate_y glRotatef (rotate_x, 1,0, 0,0, 0,0); glRotatef (rotate_y, 0,0, 1,0, 0,0); // Jiné transformace // glScalef (2.0, 2.0, 0.0); // Není zahrnuto // Vícebarevná strana - PŘEDNÍ 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 (); // Bílá strana - ZPĚT 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ÁVNĚ 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 - VLEVO 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 () Funkce zpětného volání // ------------------------------ ---------------------------- void specialKeys (int key, int x, int y) {// šipka vpravo-zvýšení otáčení o 5 stupeň if (key == GLUT_KEY_RIGHT) rotate_y += 5; // Šipka doleva - sníží rotaci o 5 stupňů jinak if (key == GLUT_KEY_LEFT) rotate_y - = 5; jinak if (key == GLUT_KEY_UP) rotate_x += 5; jinak if (key == GLUT_KEY_DOWN) rotate_x -= 5; // Žádost o aktualizaci displeje glutPostRedisplay (); } // ----------------------------------------------- ----------- // hlavní funkce // ------------------------------- --------------------------- int main (int argc, char* argv ) {// Inicializace GLUT a zpracování uživatelských parametrů glutInit (& argc, argv); // Požádejte o okno s dvojitou vyrovnávací pamětí v pravé barvě pomocí Z-buffer glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); // Vytvořit okno glutCreateWindow ("Úžasná kostka"); // Povolit test hloubky vyrovnávací paměti Z glEnable (GL_DEPTH_TEST); // Funkce zpětného volání glutDisplayFunc (zobrazení); glutSpecialFunc (specialKeys); // Předání řízení GLUT pro události glutMainLoop (); // Návrat do OS návrat 0; }