Jak udělat kostku v opengl

OpenGL je 3D programovací nástroj, který umožňuje vytvářet komplexní trojrozměrné snímky z jednoduchých formulářů. Z tohoto článku se naučíte, jak s ním kreslit, pomůže jednoduchou krychli, která může být otočena ve třech rozměrech!

Kroky

Část 1 z 3:
Počáteční instalace
jeden. Instalace OpenGL. Start S OpenGL Instalační příručka na tvém počítači. Je-li OpenGL a kompilátor s vámi již máte, můžete tento krok přeskočit a jít na další.
  • 2. Vytvořit dokument. Vytvořte nový soubor v oblíbeném editoru kódu a uložte jej jako mycube.C
  • 3. Přidat #Includes. Zde je hlavní směrnicemi #Include, které potřebujete. Je důležité si uvědomit, že směrnice pro různé operační systémy jsou jiné, a proto je nutné zvolit vše, aby byl program univerzální a může být spuštěn v jakémkoli systému.
    // zahrnuje # zahrnují #Zahrnout #Zahrnout #Define gl_gelxt_prototypes # ifdef __apple __ # zahrnovat # jinak # zahrnovat #endif
  • 4. Přidejte funkční prototypy a globální proměnné. Dalším krokem bude deklarovat funkční prototypy.
    // Funkční prototypesvoid displej () - Void speciallkeys () - // globální variaplydeble rotate_y = 0-double rotate_x = 0-
  • Pět. Nastavte hlavní () funkci ().
    INT MAIN (INT ARGC, char * argv []) // inicializovat uživatelské parametry glid a procesu (a argc, argv) - // požádat o dvojité pufrovací okno, z-bufferizace a barevný schéma true colorglutinitdisplaymode (glut_double) 
  • Část 2 z 3:
    Funkce zobrazení ()
    jeden. Rozumět přiřazení funkce displeje (). Veškerá práce na kreslení Kuby padnou na křehké linie této funkce. Myšlenka obecně je následující: čerpáte šest oddělených tváří krychle a umístěte je do příslušných pozic.
    • Pro každý obličej definujete čtyři úhel a OpenGL je spojuje s řádky a vyplní barvu, kterou si vyberete. Níže řeknete, jak to udělat.
  • 2. Přidejte funkci glclear (). Nejprve pracují s touto funkcí, potřebujeme Vymazat barvu a vyrovnávací paměť. Bez toho, pod novým vzorem bude vidět starý, a objekty nakreslené programem budou uspořádány nesprávně.
    Void display () gl_depth_buffer_bit)-
  • 3. Přidat glbegin () a glend (). Objekty OpenGL jsou kombinací různých polygonů. tým glbegin () Dovolte nám, abychom s vámi nakreslili objekt - je to jako tužka, kterou nakreslete postavu, aniž byste ho odtrhli z papíru. Chcete-li roztrhnout tužku z listu a začněte kreslit něco nového, potřebujete tým Glend (). V tomto článku budeme používat gl_polygon, aby kresli každou okraj krychle, i když je možné použít jiné parametry, jako je gl_line, gl_quad nebo gl_triangle vytvořit jiné formuláře.
  • Začněte s přední část krychle. Později přidáme barvu do každého ze šesti tváří.
  • // Vícebarevná strana - frontglbegin (gl_polygon) - // verše Přidat do dalšího výkladu ()-
  • 4. Přidat funkci glvertex3f (). Nyní, když jste vysvětlili program, který chcete začít kreslit mnohoúhelník, potřebujete Nastavit vrcholy Objekt. Funkce GLFERTEX má několik formulářů, jejichž použití závisí na tom, co máte v úmyslu s vaším objektem.
  • První - kolik měření budete pracovat? Obrázek 3 v GLvertEx3f označuje tři rozměry. Můžete však pracovat v 2 a ve 4 měřeních. Písmeno F, zase ukazuje, že pracujeme s plovoucími středníky. Zde však můžete použít celé číslo, dvojité nebo krátké typy.
  • Všimněte si, že všechny body jsou nastaveny proti směru hodinových ručiček šipky. I když to není příliš důležité, ale když začnete pracovat na osvětlení, texturování, léčbě ne-tarifních tváří, zvyk předepisování všeho proti směru hodinových ručiček bude pro vás velmi užitečné.
  • Přidejte vrcholy mezi linky glbegin () a glend ().


  • // Vícebarevná strana - Frontglbegin (GL_POLYGON) -GLERVERTEX3F (-0.padesáti.padesáti.5) - // p1glvertEx3f (-0.5.0.padesáti.5) - // p2glvertEx3f (0.5.0.padesáti.5) - // p3glvertEx3f (0.padesáti.padesáti.5) - // p4glend ()-
  • Pět. Přidat funkci glolor3f (). Glcolor působí mnoha způsoby podobným glvertexu. Body Můžete nastavit datové typy krátkých, celých čísel, dvojité nebo plovák. Každá barva má hodnotu od 0 do 1. Všechny nuly jsou černé, všechny jednotky - resp. Bílá. Obrázek 3 v glolor3f () označuje barevné schéma RGB bez alfa kanálu. Barvy alfa kanálu odpovídají za jeho transparentnost. Chcete-li změnit hodnotu alfa kanálu, použijte glolor4f () s posledním parametrem od 0 do 1, tj. Od neprůhledné k průhlednosti.
  • Volání glolor3f (), vykresli každý vrchol ze zadaného bodu v zadané barvě. Jinými slovy, pokud všechny čtyři vrcholy by měly být červené, pak jen jednorázový čas nastavit hodnotu barvy před voláním příkazů GLvertEx3f () a budou všechny červené.
  • Na příkladu přední části níže můžete vidět, jak je nastavena nová barva každého vrcholu. Když to uděláš, můžete se seznámit se zajímavým rysem květin OpenGL. Vzhledem k tomu, že každý špetka polygonu má svou vlastní barvu, OpenGL automaticky míchá barvy! Kód umístěný na ukazuje, jak vytvořit čtyři vrcholy se stejnou barvou.
  • // Vícebarevná strana - Frontglbegin (GL_POLYGON) -GLOCCCOLOR3F (1).0, 0.0, 0.0)-gripvertEx3f (0.padesáti.padesáti.5) - // p1 redgolor3f (0.0, 1.0, 0.0)-gripvertEx3f (0.5.0.padesáti.5) - // p2 greenglcolor3f (0.0, 0.0, 1.0) -glotvertEx3f (-0.5.0.padesáti.5) - // p3 blumgolor3f (1.0, 0.0, 1.0) -glotvertEx3f (-0.padesáti.padesáti.5) - // p4 purpleglend ()-
  • 6. Nakreslete jiné tváře Kuba. Lepší, samozřejmě, pokud vy sami najdete místo zbytku kostky a každého z vrcholů, ale pro jednoduchost jsme je vypočítali pro vás. Kód je uveden B Zobrazení finálního funkcí () níže.
    // bílou stranu - zadníglbegin (gl_polygon) -gloccolor3f (1).0,1.0, 1.0)-gripvertEx3f (0.padesáti.padesáti.5)-gripvertEx3f (0.5.0.padesáti.5) -GrotvertEx3f (-0.5.0.padesáti.5) -GrotvertEx3f (-0.padesáti.padesáti.5) -Glend () - // fialová strana - Ruralglglbegin (gl_polygon) -glololor3f (1).0,0.0,1.0)-gripvertEx3f (0.padesáti.padesáti.5)-gripvertEx3f (0.5.0.padesáti.5)-gripvertEx3f (0.5.0.5.0.5)-gripvertEx3f (0.padesáti.5.0.5) -Glend () - // zelená strana - levicglbegin (gl_polygon) -glcolor3f (0).0,1.0,0.0) -glotvertEx3f (-0.padesáti.5.0.5) -GrotvertEx3f (-0.5.0.5.0.5) -GrotvertEx3f (-0.5.0.padesáti.5) -GrotvertEx3f (-0.padesáti.padesáti.5) -Glend () - // modrá strana - UPTERNGLBERBEGIN (GL_POLYGON) -GLOCCOLOR3F (0).0,0.0,1.0)-gripvertEx3f (0.5.0.5.0.5)-gripvertEx3f (0.5.0.padesáti.5) -GrotvertEx3f (-0.5.0.padesáti.5) -GrotvertEx3f (-0.5.0.5.0.5) -Glend () - // červená strana - nizhnyglbegin (gl_polygon) -glcolor3f (1).0,0.0,0.0)-gripvertEx3f (0.padesáti.padesáti.5)-gripvertEx3f (0.padesáti.5.0.5) -GrotvertEx3f (-0.padesáti.5.0.5) -GrotvertEx3f (-0.padesáti.padesáti.5) -Glend () - glflush () - glutswapbuffers ()-
  • Věnujte pozornost posledním dvěma řádky. Jedná se o funkce glflush ()- a guldswapbuffers ()-, Dává efekt dvojité vyrovnávací paměti, které bylo řečeno výše.
  • Část 3 z 3:
    Interaktivní program
    jeden. Přidat funkci specialkeys (). V zásadě je vše téměř připraveno, ale krychle je nakreslena a neotáčí. K tomu, vytvořit Funkce specialkeys (), který otáčí kostku stisknutím kláves se šipkami!
    • Bylo to pro tuto funkci, že globální proměnné rotate_x a rotate_y byly oznámeny. Když stisknete klávesu "Left" a "Right" se šipkami, hodnota Rotate_Y zvýší nebo sníží o pět stupňů. Podobně změníme hodnotu rotate_x, ale již stisknete klávesy "nahoru" a dolů.
    VOID SPECTILEDKEYS (INT Key Key, Int X, INT Y) {// Šipka vpravo - Zvýšení otáčení 5 stupňů (klíč == Glut_Key_Right) Rotate_y + = 5 - // Lehtová šipka - snížení otáčení 5 ° C-li (klíč == glut_key_left) rotate_y - = 5-else, pokud (klíč == glut_key_up) rotate_x + = 5-else, pokud (klíč == glut_key_down) rotate_x - = 5 - // Žádost o aktualizaci scénografie ScreenGlutPostredisplay () -}
  • 2. Přidat glresate (). Poslední věc, kterou uděláme, je přidat řetězec, který nám umožní otočit objekt. Vrátit se do funkce ZOBRAZIT () A před popisem přední, přidejte:
    // reset transformaceGledoadidentity () - // otáčení při změně hodnoty uživatele rotate_x a rotate_yglrotatef hodnoty (rotate_x, 1.0, 0.0, 0.0) -glrotatef (rotate_y, 0.0, 1.0, 0.0) - // Vícebarevná strana - přední....
  • Všimněte si, že syntaxe glrotatef (), který je podobný syntaxi glolor3f () a glvertex3f (), ale vždy vyžaduje indikaci čtyř parametrů. Nejprve - úhel otáčení ve stupních. Následující tři osy, pro které je rotace v pořadí x, Y, Z. Doposud musíme otočit kostku na dvou osách, x a u.
  • Pro všechny transformace, které specifikujeme program, jsou požadovány podobné čáry. Ve skutečnosti představujeme rotaci objektu podél osy X jako změna hodnoty rotace_x a otáčení osy osy - jako změna hodnoty rotace_dy. OpenGL však sjednotí všechno do jedné transformační matrice. Ať už volání funkce zobrazení vytvoříte transformační matici a Gladuidentita () vám umožní začít pokaždé s novým matricí.
  • Ostatní transformační funkce, které byste mohli použít, je glutranslatef () a glcalef (). Jsou podobné glrotatefu (), s výjimkou, že pouze tři parametry vyžadují: hodnoty x, y a Z pro změnu a změnu objektu.
  • Takže vše je zobrazeno správně, když jsou všechny tři transformace aplikovány na jeden objekt, musíte nastavit transformace v příslušném pořadí, a to Glutranslate, glrotát, glscale - A nikdy jinak. OpenGL transformuje objekt čtení programu ze zdola nahoru. Chcete-li to lépe pochopit, představte si, jak bude krychle 1x1x1 starat o všechny transformace, pokud je OpenGL aplikoval v pořadí jako ty, které jsou uvedeny (shora dolů), a pak přemýšlet o tom, jak OpenGL léčí krychle, čtení pokynů zdola nahoru.
  • 3. Přidejte následující příkazy pro dvoučasové krychové škálování podél os X a Y, pro otočení krychle 180 stupňů podél osy osy, stejně jako pro pohyb krychle o 0,1 podél osy X. Zkontrolujte, zda jsou všechny příslušné příkazy, včetně dříve zadaných příkazů glrotate (), jsou zadány ve správném pořadí. Pokud se bojíte být mýlil, viz konečná verze programu na konci článku.
    // Ostatní transformacegltranslatef (0.10.0, 0.0) -glrotatef (180, 0.0, 1.0, 0.0) -GLSCSCALEF (2.0, 2.0, 0.0)-
  • 4. Kompilovat a spustit kód. Předpokládejme, že používáte GCC jako kompilátor, takže do terminálu zadejte následující příkazy:
    Na Linuxu: GCC Cube.C -O CUBE -LGLLCL -LGL./ Mycuben mac: gcc -o foo foo.C -framework Glut -framework OpenGL./ MyCube Windows: GCC-Wall -Fooo foo.c -lglut32cu -lglu32 -lopengl32./ Mycube
  • Pět. Zkontrolujte konečný kód. Zde je konečný kód vytvořený autorem článku, ve kterém nebyly přeloženy komentáře.
    //// // Soubor: mycube.C // Autor: Matt Daisley // Vytvořeno: 4/25 / 2012 // Projekt: Zdrojový kód pro výrobu krychle v OpenGL // Popis: Vytvoří okno OpenGL a kreslí 3D krychle // že uživatel se může otáčet pomocí tlačítka 3D Cube // Klávesy se šipkami // // Ovládací prvky: šipka vlevo - otočení vlevo // Šipka vpravo - Otočit vpravo // nahoru Šipka otočení nahoru // Šipka dolů- otočení dolů // -------------- -------------------------------------------- // zahrnuje // - --------------------------------------------------- -------- # zahrnovat #Zahrnout #Zahrnout #Define gl_gelxt_prototypes # ifdef __apple __ # zahrnovat # jinak # zahrnovat # endif // ----------------------------------- ------------------------- // Funkce prototypy // ------------------- ------------------------------------------------------ void displej () - neplatné speciální prostory () - // ------------------------------------------------- ------------- // Globální proměnné // ------------------------------- -------- ---------------------- Double rotate_y = 0-double rotate_x = 0 - // --------- -------- -------------------------------------------- / / Display () Funkce zpětného volání / / --------------------------------------------------------- -------- --------- Void display () // Vymazané obrazovky a z-bufferglclear (gl_color_buffer_bit // ------------------- -------- ---------------------------------- // Specialkeys () funkce zpětného volání // - -------- --------------------------------------------- ---------- Void speciallkeys (int klíč, int x, int y) {// vpravo šipka -Zvýšení rotace 5 Degreeif (key == glut_key_right) rotate_y + = 5 - // šipka doleva - Snížení otáčení 5 DEGREEELSE if (key == glut_key_left) rotate_y - = 5-Else if (key == glut_key_up) rotate_x + = 5 -ELSE if (key == glut_key_down) rotate_x - = 5 - // Request Display UpdateglutRodisplay () -} // ------------------------- --------------------------------- // Hlavní funkce // --------- ------------------------------------------------- INT hlavní (int argc, char * argv []) GLUT_DEPTH) - // Vytvoří windowglutCreateWindow ( "Super Cube") - // Povolení hloubky Z-buffer testglEnable (GL_DEPTH_TEST) - // Callback functionsglutDisplayFunc (displej) -glutSpecialFunc (specialKeys) - // předat řízení Glut pro eventsglutmainloop () - // návrat do Osreturn 0-
  • Podobné publikace