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

Szerző: Gregory Harris
A Teremtés Dátuma: 12 Április 2021
Frissítés Dátuma: 1 Július 2024
Anonim
Hogyan készítsünk kockát OpenGL -ben - Társadalom
Hogyan készítsünk kockát OpenGL -ben - Társadalom

Tartalom

Az OpenGL egy 3D programozó eszköz, amely lehetővé teszi, hogy egyszerű formákból összetett 3D képeket hozzon létre. Ebben a cikkben megtanulja, hogyan rajzolhat az ő segítségével egy egyszerű, három dimenzióban elforgatható kockát!

Lépések

Rész 1 /3: Első telepítés

  1. 1 Telepítse az OpenGL -t. Kezdje egy bemutatóval az OpenGL telepítéséről a számítógépére. Ha már rendelkezik OpenGL és C fordítóval, kihagyhatja ezt a lépést, és továbbléphet a következőre.
  2. 2 Hozzon létre egy dokumentumot. Hozzon létre egy új fájlt a kedvenc kódszerkesztőjében, és mentse el a mycube.c néven
  3. 3 #Befogadások hozzáadása. Itt találhatók az alapvető #befogadási irányelvek, amelyekre szüksége lesz. Fontos megjegyezni, hogy a különböző operációs rendszerekre vonatkozó irányelvek eltérőek, ezért mindent ki kell választania, hogy a program univerzális legyen, és bármilyen rendszeren futtatható legyen.

      // Tartalmazza a #include stdio.h> #include stdarg.h> #include math.h> #define GL_GLEXT_PROTOTYPES #ifdef __APPLE__ #include GLUT / glut.h> #else #include GL / glut.h> #endif

  4. 4 Funkcionális prototípusok és globális elemek hozzáadása. A következő lépés a funkcionális prototípusok deklarálása.

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

  5. 5 Határozza meg a fő () függvényt.

      int main (int argc, char * argv []) // A GLUT inicializálása és az egyéni paraméterek feldolgozása glutInit (& argc, argv); // Ablak kérése a kettős pufferelés, a Z-pufferelés és a True Color glutInitDisplayMode (GLUT_DOUBLE) támogatásával

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

  1. 1 Ismerje meg a display () függvény célját. A kocka megjelenítésével kapcsolatos összes munka ennek a funkciónak a törékeny vonalaira esik. Az általános elképzelés a következő: megrajzolod a kocka hat különálló oldalát, és a megfelelő pozícióba helyezed őket.
    • Minden archoz négy sarkot kell megadnia, és az OpenGL összeköti azokat vonalakkal, és kitölti a kiválasztott színnel. Ennek mikéntjét az alábbiakban ismertetjük.
  2. 2 Add hozzá a glClear () függvényt. Először is, amikor ezzel a funkcióval dolgozunk, szükségünk van tiszta szín és z-puffer... E nélkül a régi látható lesz az új kép alatt, és a program által rajzolt objektumok helytelenül kerülnek elhelyezésre.

      void display () // Clear the Screen And Z Buffer glClear (GL_COLOR_BUFFER_BIT

    • Ügyeljen az utolsó két sorra. Ezek a funkciók glFlush (); és glutSwapBuffers ();, ami kettős pufferelés hatását eredményezi, amit fent leírtunk.

Rész 3 /3: Program interaktivitása

  1. 1 Adja hozzá a specialKeys () függvényt. Elvileg minden majdnem kész, de a kockát csak rajzolják, és nem forgatják. Ehhez létre kell hoznia a specialKeys () függvény, amely lehetővé teszi a kocka elforgatását a nyilak megnyomásával!
    • Ehhez a függvényhez deklarálták a rotate_x és rotate_y globális változókat. Ha megnyomja a bal és a jobb nyílbillentyűt, a rotate_y érték öt fokkal nő vagy csökken. A rotate_x értéke ugyanúgy változik, de ezúttal a fel és le nyilakkal.
    • void specialKeys (int kulcs, int x, int y) {// Jobbra mutató nyíl - növelje a forgatást 5 fokkal, ha (kulcs == GLUT_KEY_RIGHT) rotate_y + = 5; // Balra nyíl - Csökkentse a forgá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. 2 A glRotate () hozzáadása. Az utolsó dolog, amit tenni fogunk, hogy hozzáadunk egy sort, amely lehetővé teszi az objektum elforgatását. Vissza a funkcióhoz kijelző () és az ELSŐ oldal leírása előtt tegye hozzá:

      // Reset Transforms glLoadIdentity (); // Forgatás, amikor a felhasználó megváltozik Az értékek rotate_x és rotate_y glRotatef (rotate_x, 1.0, 0.0, 0.0); glRotatef (rotate_y, 0.0, 1.0, 0.0); // Többszínű oldal - ELSŐ ....

    • Kérjük, vegye figyelembe, hogy a szintaxis glRotatef ()amely hasonló a glColor3f () és a glVertex3f () szintaxisához, de mindig négy paramétert igényel. Az első a forgatási szög fokban. A következő három az a tengely, amely mentén a forgás történik, x, y, z sorrendben. Egyelőre el kell forgatnunk a kockát két tengely, x és y mentén.
    • A programban definiált összes átalakítás hasonló sorokat igényel. Alapvetően az objektum elforgatását az x tengely mentén a rotate_x értékének változásaként, az y tengely mentén történő forgást pedig a rotate_y értékének változásaként ábrázoljuk. Az OpenGL azonban mindent egy transzformációs mátrixba csomagol. Minden alkalommal, amikor a kijelzőt hívja, létrehoz egy transzformációs mátrixot, és glLoadIdentity () lehetővé teszi, hogy minden alkalommal új mátrixszal kezdjen.
    • Egyéb átalakítási függvények, amelyeket esetleg használt, a glTranslatef () és a glScalef (). Hasonlóak a glRotatef () -hez, csak három paramétert igényelnek: az x, y és z értékeket az objektum átméretezéséhez és méretezéséhez.
    • Ahhoz, hogy minden megfelelően megjelenjen, amikor mindhárom transzformációt egy objektumra alkalmazza, be kell állítania a transzformációkat a megfelelő sorrendben, nevezetesen glTranslate, glRotate, glScale - és soha másként. Az OpenGL átalakítja az objektumot a program alulról felfelé történő olvasásával. Ennek jobb megértése érdekében képzelje el, hogyan nézne ki az 1x1x1 kocka az összes átalakítás után, ha az OpenGL a megjelenített sorrendben alkalmazza őket (fentről lefelé), majd gondolja át, hogyan dolgozza fel az OpenGL a kockát, olvassa el az utasításokat alulról felfelé.
  3. 3 Adja hozzá a következő parancsokat a kocka kétszeres méretezéséhez x és y irányban, a kocka 180 fokban történő elforgatásához az y tengelyen, és a kocka 0,1 mozgatásához az x tengelyen. Győződjön meg arról, hogy az összes releváns parancs, beleértve a korábban megadott glRotate () parancsokat is, a megfelelő sorrendben van. Ha félsz hibázni, nézd meg a program végleges verzióját a cikk végén.

      // További átalakítások glTranslatef (0,1, 0,0, 0,0); glRotatef (180, 0,0, 1,0, 0,0); glScalef (2,0, 2,0, 0,0);

  4. 4 Fordítsa le és futtassa a kódot. Tegyük fel, hogy a gcc -t használja fordítóként, ezért írja be a következő parancsokat a terminálba:

      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. 5 Ellenőrizze a végső kódot. Íme a cikk szerzője által létrehozott végső kód, amely nem fordítja le a megjegyzéseket.

      // Fájl: mycube.c // Szerző: Matt Daisley // Létrehozva: 2012.04.25. // Projekt: Forráskód a Kocka készítése OpenGL -ben // Leírás: OpenGL -ablak létrehozása és 3D -s kocka rajzolása/ / Hogy a felhasználó el tudja forgatni a nyílbillentyűket // // Vezérlők: Bal nyíl -Forgatás balra // Jobbra nyíl -Forgatás jobbra // Fel nyíl -Forgatás fel // Le nyíl -Forgatás le // ------ -------------------------------------------------- -// magában foglalja--------------------------------------------- -------------- #include stdio.h> #include stdarg.h> #include math.h> #define GL_GLEXT_PROTOTYPES #ifdef __APPLE__ #include GLUT / glut.h> #else #include GL / glut.h> #endif // ---------------------------------------- ------------------ // Funkció prototípusok // -------------------------- -------------------------------- void display (); void specialKeys (); // ------------------------------------------------ ---------- // Globális változók // ---------------------------------- ------------------------ dupla forgatás_y = 0; dupla forgatás_x = 0; // ------------------------------------------------ ---------- // display () Visszahívási funkció // ------------------------------- --------------------------- void display () // Képernyő törlése és Z-puffer glClear (GL_COLOR_BUFFER_BIT // ------ -------------------------------------------------- -// specialKeys () visszahívási funkció // ---------------------------------------- ------------------ 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; különben ha (kulcs == GLUT_KEY_UP) rotate_x + = 5; egyébként ha (kulcs == GLUT_KEY_DOWN) rotate_x - = 5; // Kérdezze meg a kijelző frissítését glutPostRedisplay ();} // ------------------------------------ ---------------------- // main () function // -------------------- -------------------------------------- int main (int argc, char * argv [] ) GLUT_RGB