Hogyan készítsünk kockát OpenGL -ben (képekkel)

Tartalomjegyzék:

Hogyan készítsünk kockát OpenGL -ben (képekkel)
Hogyan készítsünk kockát OpenGL -ben (képekkel)

Videó: Hogyan készítsünk kockát OpenGL -ben (képekkel)

Videó: Hogyan készítsünk kockát OpenGL -ben (képekkel)
Videó: VirtualBox használata törölhető (0b) 2024, Április
Anonim

Az OpenGL egy erőteljes 3D programozó eszköz, amelyet egyszerű primitívekből összetett háromdimenziós jelenetek rajzolásához használnak. Ez a cikk megtanítja, hogyan rajzoljon egy egyszerű kockát, amelyet három dimenzióban meg tud forgatni!

Ehhez a projekthez kódszerkesztőre és némi C programozási ismeretekre lesz szüksége.

Lépések

Rész 1 /3: Kezdeti beállítás

1994315 1 1
1994315 1 1

1. lépés: Az OpenGL telepítése A kezdéshez kövesse az alábbi lépéseket az OpenGL rendszerre történő telepítéséhez

Ha már telepítve van az OpenGL, valamint telepítve van egy kompatibilis C fordító, akkor kihagyhatja ezt a lépést, és folytathatja a következővel.

1994315 2 1
1994315 2 1

2. lépés. Hozza létre a dokumentumot

Hozzon létre egy új fájlt a kedvenc kódszerkesztőjében, és mentse el a mycube.c néven

1994315 3 1
1994315 3 1

3. lépés. Adjon hozzá #befogadókat

Ezek az alapvető szolgáltatások, amelyekre a programhoz szüksége lesz. Fontos felismerni, hogy a különböző operációs rendszerekhez valójában különböző csomagok szükségesek. Feltétlenül vegye figyelembe mindezt, hogy a program sokoldalú legyen, és minden felhasználó számára futtatható legyen.

    // Tartalmazza a #include #include #include #define GL_GLEXT_PROTOTYPES #ifdef _APPLE_ #include #else #include #endif

1994315 4 1
1994315 4 1

4. lépés. Funkció prototípusok és globális változók hozzáadása

A következő lépés néhány funkció prototípusának deklarálása.

    // Funkció Prototípusok void display (); void specialKeys (); // Globális változók double rotate_y = 0; dupla forgatás_x = 0;

1994315 5 1
1994315 5 1

5. lépés Állítsa be a main () függvényt

    int main (int argc, char* argv ) {// A GLUT inicializálása és a felhasználói paraméterek feldolgozása glutInit (& argc, argv); // Dupla pufferelt valódi színes ablak kérése Z-puffer glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);

  • Ez az állítás beállítja a környezetet. Az OpenGL programok írásakor nagy dolog, hogy emlékezzen arra, hogy mindent kérnie kell. Ez megköveteli, hogy jobban megértse a program működését, és mit kell tartalmaznia a kívánt funkció eléréséhez. Ebben a sorban dupla puffereléssel, RGB színnel és Z-pufferrel állíthatja be a kijelzőt.
  • Dupla pufferelés egy olyan technika, amelyet a grafikus programokban használnak, hogy kiküszöböljék azt a problémát, amely a képek képernyőre húzása miatt merül fel. Minden alkalommal, amikor átrajzolja a jelenetet, először törölni kell a kijelzőt, majd ki kell rajzolni az új információkat. Dupla pufferelés nélkül villogó hatást észlel, amikor a képernyő többször törlődik és újrarajzolódik.
  • Ezt a problémát egy második puffer hozzáadásával lehet megoldani. Ezzel a módszerrel egy kép rajzolódik az első pufferhez, és ez a puffer megjelenik Önnek. A következő keretet a második puffer húzza, és ha ez megtörtént, a két puffer helyet vált. Azonnal látni fogja a második puffert, de előlünk elrejtve az első puffert törlik, és újrarajzolják a harmadik képkockával, amelyet a befejezés után cserélnek.
  • Azt is szeretné engedélyezni RGB színű rendszer az ablakban.
  • Z-pufferelés így kaphatja meg a kívánt 3D effektusokat. Az OpenGL háromdimenziós koordinátarendszert használ x, y és z tengelyekkel. Annak a hatásnak az elérése érdekében, hogy egy tárgy közelebb van hozzád, a z tengely helyzetét megnövelik, de azért, hogy távolabb jelenjen meg, a z tengely helyzete csökken.
1994315 6 1
1994315 6 1

6. lépés. Hozza létre az ablakot

A következő lépés az hozza létre az ablakot amelyen belül megrajzolod a kockát. Ebben az oktatóanyagban az ablak neve "Félelmetes kocka".

    // ablak létrehozása glutCreateWindow ("Félelmetes kocka");

1994315 7 1
1994315 7 1

7. lépés. Engedélyezze a mélységvizsgálatot

Az OpenGL szigorú nyelv, mivel nem feltételezi, hogy bármilyen speciális funkció engedélyezve van. Ahhoz, hogy a programja megfelelően megjelenjen 3 dimenzióban a korábban megtekintett Z-puffer használatával, meg kell tennie lehetővé teszi a mélységvizsgálatot. Amint folytatja az OpenGL felfedezését, számos olyan funkciót fedez fel, amelyeket engedélyeznie kell, beleértve a világítást, a textúrákat, a levágást és még sok mást.

    // Z-puffer mélységvizsgálat engedélyezése glEnable (GL_DEPTH_TEST);

1994315 8 1
1994315 8 1

8. lépés. Hívja visszahívási funkciókat

Itt vannak azok a visszahívási funkciók, amelyekhez korábban a prototípusokat írta. A főhurkon keresztül minden alkalommal meghívják ezeket a függvényeket. A megjelenítési funkció újrarajzolja a jelenetet az előző hívás óta végrehajtott változók változásai alapján. A specialKeys funkció lehetővé teszi, hogy interakcióba lépjünk a programmal.

    // Visszahívási funkciók glutDisplayFunc (kijelző); glutSpecialFunc (specialKeys);

1994315 9 1
1994315 9 1

9. lépés: Indítsa el a MainLoop -ot

Ez visszahívja a fő funkciót, amíg be nem zárja a programot, hogy lehetővé tegye az animációkat és a felhasználói interakciókat.

    // Adja át a vezérlést a GLUT -nak az eseményekhez glutMainLoop (); // Vissza az operációs rendszerhez return 0; }

2. rész a 3 -ból: A kijelző () funkciója

1994315 10 1
1994315 10 1

1. lépés: Ismerje meg ennek a funkciónak a célját

Ebben a funkcióban kell elvégezni a kockát. A kocka mögött meghúzódó általános elképzelés az, hogy mind a hat oldalt külön rajzoljuk meg, és helyezzük el a megfelelő pozícióba.

Elméletileg minden oldalt úgy rajzolunk meg, hogy meghatározzuk a négy sarkot, és hagyjuk, hogy az OpenGL összekapcsolja a vonalakat, és töltse ki az Ön által meghatározott színnel. Az alábbiakban bemutatjuk a lépéseket ennek elvégzésére

1994315 11 1
1994315 11 1

2. lépés. Adja hozzá a glClear () parancsot

Ennek a funkciónak az első lépése, amelyet meg kell tennie törölje a színt és a Z puffert. E lépések nélkül a régi rajzok továbbra is láthatók lehetnek az új rajzok alatt, és a rajzolt objektumok nem a megfelelő helyen lennének a képernyőn.

    void display () {// Képernyő és Z-puffer törlése glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

1994315 12 1
1994315 12 1

3. lépés. Adja hozzá a glBegin () és a glEnd () parancsot

Az OpenGL az objektumokat különböző sokszögek kombinációjaként határozza meg. Használni a glBegin () parancsot, akkor ténylegesen letesz egy ceruzát, amely rajzolni fog egy alakot. A ceruza felemeléséhez és új alakzat elkezdéséhez használja a glEnd () parancs. Ebben az oktatóanyagban a GL_POLYGON segítségével fogja rajzolni a kocka mindkét oldalát, de más paraméterek, például GL_LINE, GL_QUAD vagy GL_TRIANGLE is használható más alakzatok létrehozásához.

  • Itt kezdődik a kocka elejével. Később mind a 6 oldalához színt ad.
  • // Többszínű oldal - FRONT glBegin (GL_POLYGON); // A csúcsokat a következő lépésben adjuk hozzá glEnd ();

1994315 13 1
1994315 13 1

4. lépés. Adja hozzá a glVertex3f () fájlt

Miután kijelentette, hogy el szeretné kezdeni a sokszögét, meg kell tennie határozza meg a csúcsokat a tárgyról. A glVertex több űrlappal rendelkezik, attól függően, hogy mit szeretne csinálni az objektummal.

  • Az első az, hogy hány dimenzióban dolgozik. A fenti 3 a glVertex3f -ben azt mondja, hogy 3 dimenzióban rajzol. Lehetőség van 2 vagy 4 dimenzióban történő munkavégzésre is. A glVertex3f fenti f -je azt mondja, hogy lebegőpontos számokkal dolgozik. Használhat rövidnadrágokat, egész számokat vagy párosokat is.
  • Vegye figyelembe, hogy ezeket a pontokat az a óramutató járásával ellentétes irányban módon. Ez jelenleg nem túl fontos, de amikor elkezd dolgozni a világítással, a textúrákkal és a levágással, ez hihetetlenül fontos lesz, ezért szokja meg, hogy pontjait az óramutató járásával ellentétes irányban határozza meg.
  • Add hozzá a csúcsokat a glBegin () és a glEnd () sorok közé.
  • // Többszínű oldal - FRONT 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

5. lépés. Adja hozzá a glColor3f () fájlt

A glColor hasonlóan működik, mint a glVertex. A pontokat rövidzárként, egész számként, párosként vagy úszóként definiálhatja. Mindegyik szín értéke 0 és 1 között van. Minden 0 -val a pont fekete lesz, az összes 1 pedig fehér. A 3 a glColor3f () -ban alfa -csatorna nélküli RGB színrendszerre utal. A szín áfája határozza meg az átlátszóságát. Az alfa szint megváltoztatásához használja a glColor4f () értéket, az utolsó paraméter pedig 0 és 1 közötti érték, ha átlátszatlan és átlátszó.

  • Amikor meghívja a glColor3f () függvényt, az ettől a ponttól kezdve minden csúcs ilyen színű lesz. Ezért ha azt szeretné, hogy mind a négy csúcs piros legyen, csak állítsa be a színét bármikor a glVertex3f () parancs előtt, és minden csúcs piros lesz.
  • Az alábbiakban definiált elülső oldal bemutatja, hogyan határozható meg új szín minden egyes csúcshoz. Ha ezt megteszi, láthatja az OpenGL színek érdekes tulajdonságát. Mivel a sokszög minden csúcsa saját színű, az OpenGL automatikusan összekeveri a színeket! A következő lépés megmutatja, hogyan lehet négy azonos színű csúcsot hozzárendelni.
  • // Többszínű oldal - FRONT glBegin (GL_POLYGON); glColor3f (1,0, 0,0, 0,0); glVertex3f (0,5, -0,5, -0,5); // P1 piros glColor3f (0,0, 1,0, 0,0); glVertex3f (0,5, 0,5, -0,5); // P2 zöld glColor3f (0.0, 0.0, 1.0); glVertex3f (-0,5, 0,5, -0,5); // P3 kék glColor3f (1,0, 0,0, 1,0); glVertex3f (-0,5, -0,5, -0,5); // P4 lila glEnd ();

1994315 15 1
1994315 15 1

6. lépés Kezelje a többi oldalt

Határozza meg, hogy az egyes csúcsok helye hol lesz a kocka másik öt oldalán, de az egyszerűség kedvéért ezeket kiszámítottuk Önnek, és a végső kijelző () függvény lent.

    // Fehér oldal - VISSZA 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 (); // Lila oldal - RIGHT 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 (); // Zöld oldal - LEFT 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 (); // Kék oldal - 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 (); // Piros oldal - 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 (); }

  • Ehhez a funkcióhoz két utolsó kódsort is szeretnénk hozzáadni. Ezek glFlush ();

    és glutSwapBuffers ();

    amelyek a korábban megtanult kettős pufferelő hatást biztosítják számunkra.

Rész 3 /3: Felhasználói interaktivitás

1994315 16 1
1994315 16 1

1. lépés. Adjon hozzá speciálisKeys () parancsot

Már majdnem kész vagy, de jelenleg rajzolhatsz egy kockát, de nincs módod elforgatni. Ehhez meg kell tennie hozzon létre egy speciálisKeys () funkció, amely lehetővé teszi számunkra, hogy megnyomjuk a nyílbillentyűket és forgassuk el a kockát!

  • Ez az a funkció, amiért a rotate_x és rotate_y globális változókat deklarálta. Ha megnyomja a jobb és a bal nyílbillentyűt, a rotate_y értéke 5 fokkal növekszik vagy csökken. Hasonlóképpen, ha megnyomja a fel és le nyilakat, a rotate_x ennek megfelelően változik.
  • void specialKeys (int kulcs, int x, int y) {// Jobbra mutató nyíl - 5 fokkal növeli a forgatást, ha (kulcs == GLUT_KEY_RIGHT) rotate_y += 5; // Balra mutató nyíl - csökkentse a forgatást 5 fokkal, ha (kulcs == GLUT_KEY_LEFT) rotate_y - = 5; else if (kulcs == GLUT_KEY_UP) rotate_x += 5; else if (kulcs == GLUT_KEY_DOWN) rotate_x -= 5; // Képernyő frissítés kérése glutPostRedisplay (); }

1994315 17 1
1994315 17 1

2. lépés. Adja hozzá a glRotate () parancsot

Az utolsó utasítás az, hogy hozzá kell adni azt a kijelentést, amely elforgatja az objektumot. Térjen vissza a display () függvényhez, és a FRONT oldal előtt adja hozzá ezeket a sorokat:

    // Átalakítások visszaállítása glLoadIdentity (); // Forgatás, ha a felhasználó megváltoztatja a rotate_x és a rotate_y glRotatef (rotate_x, 1.0, 0.0, 0.0); glRotatef (rotate_y, 0.0, 1.0, 0.0); // Többszínű oldal - ELŐL….

  • Először vegye figyelembe, hogy a szintaxisa glRotatef () hasonló a glColor3f () és a glVertex3f ()éhez, de mindig 4 paramétert igényel. Az első paraméter az alkalmazandó forgás mértéke. A következő három paraméter határozza meg, hogy melyik tengely körül kell forogni, az első az x tengely, a második az y tengely, a harmadik pedig a z tengely. Jelenleg csak az x és az y tengely körül kell forognia.
  • Minden átalakításhoz, amelyet a programjában ír, ehhez hasonló sorokra van szüksége. Fogalmilag úgy gondolhatja ezt, hogy az objektumot az x tengely körül elforgatja a rotate_x által meghatározott mennyiséggel, majd az y tengely körül forgatja a rotate_y értékkel. Az OpenGL azonban ezeket az állításokat egyetlen mátrix -transzformációba egyesíti. Minden alkalommal, amikor meghívja a megjelenítési funkciót, létrehoz egy transzformációs mátrixot és glLoadIdentity () biztosítja, hogy minden egyes passzban új mátrixszal fog kezdeni.
  • A többi transzformációs függvény a glTranslatef () és a glScalef (). Ezek a függvények hasonlóak a glRotatef () -hez, azzal a kivétellel, hogy csak 3 paramétert vesznek igénybe, az x, y és z összegeket az objektum lefordításához vagy méretezéséhez.
  • Annak érdekében, hogy a megfelelő hatást elérje, amikor mindhárom transzformációt egy objektumra alkalmazza, azokat a megfelelő sorrendben kell alkalmazni. Mindig írja be őket a sorrendbe glTranslate, glRotate, majd glScale. Az OpenGL lényegében alulról felfelé alkalmazza az átalakításokat. Ennek megértéséhez próbálja meg elképzelni, hogyan nézne ki egy egyszerű 1x1x1 kocka az átalakításokkal, ha az OpenGL felülről lefelé alkalmazná őket, és ha az OpenGL alulról felfelé alkalmazná őket.
1994315 18 1
1994315 18 1

Lépés 3. Adja hozzá a következő parancsokat a kocka 2-es méretezéséhez az x tengely mentén, 2 az y tengely mentén, a kocka 180 fokkal történő elforgatásához az y tengely körül, és a kocka 0,1-es fordításához az x tengely mentén

Ügyeljen arra, hogy ezeket, valamint az előző glRotate () parancsokat a fent leírt sorrendben rendezze el. (Ha bizonytalan, ezt az oktatóanyag végén található végső kódban teheti meg.)

    // Egyéb transzformációk 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

Lépés 4. Fordítsa össze és futtassa a kódot

Feltételezve, hogy fordítóként a gcc -t használja, futtassa ezeket a parancsokat a terminálról a program fordításához és teszteléséhez.

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

1994315 20 1
1994315 20 1

5. lépés: Ellenőrizze a teljes kódot

Ennek így kell lennie:

    // Fájl: mycube.c // Szerző: Matt Daisley // Létrehozva: 2012.04.25. // Projekt: Forráskód a Kocka készítése az OpenGL -ben // Leírás: OpenGL ablak létrehozása és 3D kocka rajzolása/ / Hogy a felhasználó el tudja forgatni a nyílbillentyűket // // Vezérlők: Balra nyíl -Forgatás balra // Jobbra nyíl -Forgatás jobbra // Felfelé nyíl -Forgatás felfelé // Lefelé nyíl -Forgatás lefelé // ------ -------------------------------------------------- -- // Magába foglalja // ------------------------------------------- --------------- #include #include #include #define GL_GLEXT_PROTOTYPES #ifdef _APPLE_ #include #else #include #endif // ------------- -------------------------------------------- // Funkció prototípusok / / ------------------------------------------------- --------- üres kijelző (); void specialKeys (); // ------------------------------------------------ ---------- // Globális változók // ---------------------------------- ------------------------ dupla forgatás_y = 0; dupla forgatás_x = 0; // ------------------------------------------------ ---------- // display () Visszahívási funkció // ------------------------------- --------------------------- void display () {// Clear screen and Z-buffer glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Átalakítások visszaállítása glLoadIdentity (); // Egyéb átalakítások // glTranslatef (0,1, 0,0, 0,0); // nem tartalmazza // glRotatef (180, 0,0, 1,0, 0,0); // Nincs benne // Forgatás, ha a felhasználó megváltoztatja a rotate_x és a rotate_y glRotatef (rotate_x, 1.0, 0.0, 0.0); glRotatef (rotate_y, 0.0, 1.0, 0.0); // Egyéb átalakítások // glScalef (2.0, 2.0, 0.0); // nem tartozék // Többszínű oldal - FRONT glBegin (GL_POLYGON); glColor3f (1,0, 0,0, 0,0); glVertex3f (0,5, -0,5, -0,5); // P1 piros glColor3f (0,0, 1,0, 0,0); glVertex3f (0,5, 0,5, -0,5); // P2 zöld glColor3f (0.0, 0.0, 1.0); glVertex3f (-0,5, 0,5, -0,5); // P3 kék glColor3f (1,0, 0,0, 1,0); glVertex3f (-0,5, -0,5, -0,5); // P4 lila glEnd (); // Fehér oldal - VISSZA 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 (); // Lila oldal - RIGHT 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 (); // Zöld oldal - LEFT 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 (); // Kék oldal - 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 (); // Piros oldal - 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 () visszahívási funkció // ------------------------------ ---------------------------- void specialKeys (int kulcs, int x, int y) {// Jobbra mutató nyíl-a forgatás növelése 5-tel fok, ha (kulcs == GLUT_KEY_RIGHT) rotate_y += 5; // Balra mutató nyíl - csökkentse a forgatást 5 fokkal, ha (kulcs == GLUT_KEY_LEFT) rotate_y - = 5; else if (kulcs == GLUT_KEY_UP) rotate_x += 5; else if (kulcs == GLUT_KEY_DOWN) rotate_x -= 5; // Képernyő frissítés kérése glutPostRedisplay (); } // ----------------------------------------------- ----------- // fő funkció // ------------------------------- --------------------------- int main (int argc, char* argv ) {// A GLUT inicializálása és a felhasználói paraméterek feldolgozása glutInit (& argc, argv); // Dupla pufferelt valódi színes ablak kérése Z-puffer glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); // ablak létrehozása glutCreateWindow ("Félelmetes kocka"); // Z-puffer mélységvizsgálat engedélyezése glEnable (GL_DEPTH_TEST); // Visszahívási funkciók glutDisplayFunc (kijelző); glutSpecialFunc (specialKeys); // Adja át a vezérlést a GLUT -nak az eseményekhez glutMainLoop (); // Vissza az operációs rendszerhez return 0; }

Ajánlott: