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