Kuinka tehdä kuutio OpenGL: ssä

Kirjoittaja: Gregory Harris
Luomispäivä: 12 Huhtikuu 2021
Päivityspäivä: 1 Heinäkuu 2024
Anonim
Kuinka tehdä kuutio OpenGL: ssä - Yhteiskunta
Kuinka tehdä kuutio OpenGL: ssä - Yhteiskunta

Sisältö

OpenGL on 3D -ohjelmointityökalu, jonka avulla voit luoda monimutkaisia ​​3D -kuvia yksinkertaisista muodoista. Tässä artikkelissa opit piirtämään hänen avullaan yksinkertaisen kuution, jota voidaan kääntää kolmessa ulottuvuudessa!

Askeleet

Osa 1/3: Ensimmäinen asennus

  1. 1 Asenna OpenGL. Aloita opetusohjelmalla, kuinka OpenGL asennetaan tietokoneellesi. Jos sinulla on jo OpenGL ja C -kääntäjä, voit ohittaa tämän vaiheen ja siirtyä seuraavaan.
  2. 2 Luo asiakirja. Luo uusi tiedosto suosikkikoodieditorissasi ja tallenna se nimellä mycube.c
  3. 3 Lisää #sisältö. Tässä ovat tarvittavat #sisällytysdirektiivit. On tärkeää muistaa, että eri käyttöjärjestelmien direktiivit ovat erilaisia, ja siksi sinun on valittava kaikki niin, että ohjelma on universaali ja sitä voidaan käyttää missä tahansa järjestelmässä.

      // Sisältää #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 Lisää toiminnallisia prototyyppejä ja globaaleja. Seuraava vaihe on toimivien prototyyppien ilmoittaminen.

      // Toiminnalliset prototyypit void display (); void specialKeys (); // Globaalimuuttujat double rotate_y = 0; kaksoiskierrä_x = 0;

  5. 5 Määritä päätoiminto ().

      int main (int argc, char * argv []) // Alusta GLUT ja käsittele mukautetut parametrit glutInit (& argc, argv); // Pyydä ikkuna, joka tukee kaksinkertaista puskurointia, Z-puskurointia ja todellista värin glutInitDisplayMode (GLUT_DOUBLE

Osa 2/3: Näyttö () -toiminto

  1. 1 Näyttö () -toiminnon tarkoitus. Kaikki kuution renderointityöt kuuluvat tämän toiminnon hauraille linjoille. Yleinen ajatus on seuraava: piirrät kuusi erillistä pintaa ja sijoitat ne vastaaviin paikkoihin.
    • Määrität kullekin kasvolle neljä kulmaa, ja OpenGL yhdistää ne viivoihin ja täyttää ne valitsemallasi värillä. Miten tämä tehdään, selitetään alla.
  2. 2 Lisää glClear () -toiminto. Ensinnäkin, kun työskentelemme tämän toiminnon kanssa, tarvitsemme kirkas väri ja z-puskuri... Ilman tätä vanha kuva näkyy uuden kuvan alla ja ohjelman piirtämät objektit sijoitetaan väärin.

      void display () // Tyhjennä näyttö ja Z -puskuri glClear (GL_COLOR_BUFFER_BIT

    • Kiinnitä huomiota kahteen viimeiseen riviin. Nämä ovat toimintoja glFlush (); ja glutSwapBuffers ();, jolloin saadaan aikaan kaksinkertainen puskurointi, joka on kuvattu edellä.

Osa 3/3: Ohjelman vuorovaikutteisuus

  1. 1 Lisää specialKeys () -toiminto. Periaatteessa kaikki on melkein valmis, mutta kuutio on vain piirretty eikä sitä pyöritä. Tätä varten sinun on luotava specialKeys () -toiminto, jonka avulla voit kiertää kuutiota painamalla nuolinäppäimiä!
    • Tätä toimintoa varten julistettiin globaalimuuttujat rotate_x ja rotate_y. Kun painat vasenta ja oikeaa nuolinäppäintä, rotate_y -arvo kasvaa tai pienenee viisi astetta. Rotate_x: n arvo muuttuu samalla tavalla, mutta tällä kertaa painamalla ylä- ja alanuolinäppäimiä.
    • void specialKeys (int -näppäin, int x, int y) {// Oikea nuoli - lisää kiertoa 5 astetta, jos (avain == GLUT_KEY_RIGHT) rotate_y + = 5; // Vasen nuoli - Vähennä kiertoa 5 astetta, jos (näppäin == GLUT_KEY_LEFT) kierrä_y - = 5; else if (avain == GLUT_KEY_UP) rotate_x + = 5; else if (avain == GLUT_KEY_DOWN) rotate_x - = 5; // Pyydä näytön päivitystä glutPostRedisplay (); }

  2. 2 Lisää glRotate (). Viimeinen asia, jonka teemme, on lisätä rivi, jonka avulla voimme kiertää objektia. Palaa toimintoon näyttö () ja lisää etusivun kuvauksen eteen:

      // Nollaa muunnokset glLoadIdentity (); // Kierrä, kun käyttäjä muuttuu Arvot rotate_x ja rotate_y glRotatef (rotate_x, 1.0, 0.0, 0.0); glRotatef (kierrä_y, 0,0, 1,0, 0,0); // Monivärinen puoli - ETU ....

    • Huomaa, että syntaksi glRotatef ()joka on samanlainen kuin syntaksi glColor3f () ja glVertex3f (), mutta vaatii aina neljä parametria. Ensimmäinen on kiertokulma asteina. Seuraavat kolme ovat akseleita, joita pitkin kierto tapahtuu, järjestyksessä x, y, z. Toistaiseksi meidän on pyöritettävä kuutiota kaksi akselia pitkin, x ja y.
    • Kaikki muunnokset, jotka määrittelemme ohjelmassa, vaativat samanlaisia ​​rivejä. Pohjimmiltaan edustamme kohteen pyörimistä x-akselia pitkin rotate_x-arvon muutoksena ja kiertoa y-akselia pitkin rotate_y-arvon muutoksena. Kuitenkin OpenGL niputtaa kaiken yhteen muunnosmatriisiin. Aina kun soitat näyttöön, luot muunnosmatriisin ja glLoadIdentity () voit aloittaa uuden matriisin joka kerta.
    • Muita käyttämiäsi muunnosfunktioita ovat glTranslatef () ja glScalef (). Ne ovat samanlaisia ​​kuin glRotatef (), paitsi että ne edellyttävät vain kolmea parametria: x-, y- ja z -arvot objektin koon muuttamiseksi ja skaalaamiseksi.
    • Jotta kaikki näytettäisiin oikein, kun kaikki kolme muunnosta sovelletaan yhteen objektiin, sinun on asetettava muunnokset oikeassa järjestyksessä, nimittäin glTranslate, glRotate, glScale - eikä koskaan toisin. OpenGL muuntaa objektin lukemalla ohjelman alhaalta ylös. Ymmärtääksesi tämän paremmin, kuvittele, miltä 1x1x1 kuutio näyttäisi kaikkien muutosten jälkeen, jos OpenGL soveltaisi niitä näytetyssä järjestyksessä (ylhäältä alas), ja mieti sitten, miten OpenGL käsittelee kuution lukemalla ohjeet alhaalta ylös.
  3. 3 Lisää seuraavat komennot pienentääksesi kuutiota kahdesti x- ja y -suuntiin, kiertääksesi kuutiota 180 astetta y -akselilla ja siirtääksesi kuutiota 0,1 x -akselilla. Varmista, että kaikki asiaankuuluvat komennot, mukaan lukien aiemmin annetut glRotate () -komennot, ovat oikeassa järjestyksessä. Jos pelkäät tehdä virheen, katso ohjelman lopullinen versio artikkelin lopussa.

      // Lisää muunnoksia glTranslatef (0,1, 0,0, 0,0); glRotatef (180, 0,0, 1,0, 0,0); glScalef (2,0, 2,0, 0,0);

  4. 4 Käännä ja suorita koodi. Oletetaan, että käytät kääntäjänä gcc: tä, joten kirjoita päätelaitteeseen seuraavat komennot:

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

  5. 5 Tarkista lopullinen koodi. Tässä on artikkelin kirjoittajan luoma lopullinen koodi, joka ei käännä kommentteja.

      // // Tiedosto: mycube.c // Tekijä: Matt Daisley // Luotu: 25.4.2012 // Projekti: Lähdekoodi Make a Cube in OpenGL // Kuvaus: Luo OpenGL -ikkunan ja piirtää 3D -kuution/ / Käyttäjä voi kiertää nuolinäppäimillä // // Säätimet: Vasen nuoli -Kierrä vasemmalle // Oikea nuoli -Kierrä oikealle // Ylänuoli -Kierrä ylös // Alanuoli -Kierrä alas // ------ -------------------------------------------------- -// Sisältää // -------------------------------------------- -------------- #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 // ---------------------------------------- ------------------ // Toimintojen prototyypit // -------------------------- -------------------------------- tyhjä näyttö (); void specialKeys (); // ------------------------------------------------ ---------- // Globaalimuuttujat // ---------------------------------- ------------------------ kaksinkertainen kierto_y = 0; kaksoiskierrä_x = 0; // ------------------------------------------------ ---------- // display () callback-toiminto // ------------------------------- --------------------------- tyhjä näyttö () // Tyhjennä näyttö ja Z-puskuri glClear (GL_COLOR_BUFFER_BIT // ------ -------------------------------------------------- -// specialKeys () Takaisinsoittotoiminto // ---------------------------------------- ------------------ void specialKeys (int-näppäin, int x, int y) {// Oikea nuoli-lisää kiertoa 5 astetta, jos (näppäin == GLUT_KEY_RIGHT) rotate_y + = 5; // Vasen nuoli - vähennä kiertoa 5 astetta muuten, jos (näppäin == GLUT_KEY_LEFT) kierrä_y - = 5; muuten jos (näppäin == GLUT_KEY_UP) kierrä_x + = 5; muuten jos (näppäin == GLUT_KEY_DOWN) kierrä_x - = 5; // Pyydä näytön päivitystä glutPostRedisplay ();} // ------------------------------------ ---------------------- // main () -toiminto // -------------------- -------------------------------------- int main (int argc, char * argv [] ) GLUT_RGB