Jak vytvořit krychli v OpenGL (s obrázky)

Obsah:

Jak vytvořit krychli v OpenGL (s obrázky)
Jak vytvořit krychli v OpenGL (s obrázky)

Video: Jak vytvořit krychli v OpenGL (s obrázky)

Video: Jak vytvořit krychli v OpenGL (s obrázky)
Video: How To Install Windows XP In Virtual Box - 2023 2024, Duben
Anonim

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í

1994315 1 1
1994315 1 1

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ší.

1994315 2 1
1994315 2 1

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

1994315 3 1
1994315 3 1

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

1994315 4 1
1994315 4 1

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;

1994315 5 1
1994315 5 1

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);

  • Toto prohlášení nastavuje vaše prostředí. Při psaní programů OpenGL je třeba mít na paměti, že musíte o všechno požádat. To vyžaduje, abyste lépe porozuměli tomu, jak váš program funguje a co musíte zahrnout, abyste získali požadované funkce. V tomto řádku nastavíte displej s dvojitým ukládáním do vyrovnávací paměti, barvou RGB a Z-bufferem.
  • Dvojité ukládání do vyrovnávací paměti je technika používaná v grafických programech k odstranění problému, který vzniká kvůli tomu, jak jsou obrázky kresleny na obrazovku. Pokaždé, když scénu překreslíte, musíte nejprve vymazat displej a poté se vykreslí nové informace. Bez dvojitého ukládání do vyrovnávací paměti budete pozorovat efekt blikání při opakovaném mazání a překreslování obrazovky.
  • Tento problém je vyřešen přidáním druhé vyrovnávací paměti, do které se má kreslit. Při této metodě se obrázek nakreslí do první vyrovnávací paměti a tato vyrovnávací paměť se vám zobrazí. Další snímek bude vykreslen do druhé vyrovnávací paměti, a když je to hotovo, obě vyrovnávací paměti změní místa. Okamžitě uvidíte druhou vyrovnávací paměť, ale skrytá před námi, první vyrovnávací paměť se vymaže a překreslí se třetím rámcem, který bude po dokončení prohozen.
  • Chcete také povolit Barva RGB systému ve vašem okně.
  • Vyrovnávací paměť Z takto získáte požadované 3D efekty. OpenGL používá trojrozměrný souřadný systém s osami x, y a z. Aby však objekt působil blíže k vám, jeho poloha na ose z se zvýší, ale aby vypadal dále, jeho poloha na ose z se sníží.
1994315 6 1
1994315 6 1

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");

1994315 7 1
1994315 7 1

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);

1994315 8 1
1994315 8 1

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);

1994315 9 1
1994315 9 1

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 ()

1994315 10 1
1994315 10 1

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

1994315 11 1
1994315 11 1

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);

1994315 12 1
1994315 12 1

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 ();

1994315 13 1
1994315 13 1

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 ();

1994315 14 1
1994315 14 1

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 ();

1994315 15 1
1994315 15 1

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ů

1994315 16 1
1994315 16 1

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 (); }

1994315 17 1
1994315 17 1

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 …

  • Nejprve si všimněte, že syntaxe glRotatef () je podobný jako u glColor3f () a glVertex3f (), ale vždy vyžaduje 4 parametry. Prvním parametrem je stupeň rotace, který se má použít. Další tři parametry definují, kolem které osy se má otáčet, přičemž první je osa x, druhá osa y a třetí osa z. Právě teď se musíte otáčet pouze kolem osy x a y.
  • Všechny transformace, které ve svém programu napíšete, vyžadují řádky podobné tomuto. Pojmově si to můžete představit jako otáčení objektu kolem osy x o množství definované rotate_x a poté otáčení kolem osy y pomocí rotate_y. OpenGL však kombinuje všechny tyto příkazy do jedné transformace matice. Pokaždé, když zavoláte funkci zobrazení, vytvoříte transformační matici a glLoadIdentity () zajišťuje, že v každém průchodu začnete novou maticí.
  • Další transformační funkce, které můžete použít, jsou glTranslatef () a glScalef (). Tyto funkce jsou podobné glRotatef () s tou výjimkou, že k překladu nebo změně velikosti objektu potřebují pouze 3 parametry, x, y a z.
  • Abyste získali správný účinek při aplikaci všech tří transformací na jeden objekt, musíte je použít ve správném pořadí. Napište je vždy do objednávky glTranslate, glRotate, pak glScale. OpenGL v zásadě aplikuje transformace způsobem zdola nahoru. Abyste to pochopili, zkuste si představit, jak by vypadala jednoduchá kostka 1x1x1 s transformacemi, kdyby je OpenGL aplikovala shora dolů a kdyby je OpenGL aplikovala zdola nahoru.
1994315 18 1
1994315 18 1

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);

1994315 19 1
1994315 19 1

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

1994315 20 1
1994315 20 1

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; }

Doporučuje: