Hvernig á að búa til tening í OpenGL

Höfundur: Gregory Harris
Sköpunardag: 12 April. 2021
Uppfærsludagsetning: 1 Júlí 2024
Anonim
Hvernig á að búa til tening í OpenGL - Samfélag
Hvernig á að búa til tening í OpenGL - Samfélag

Efni.

OpenGL er 3D forritunartæki sem gerir þér kleift að búa til flóknar 3D myndir úr einföldum formum. Í þessari grein munt þú læra hvernig á að teikna með hjálp hans einfaldan tening sem hægt er að snúa í þrívídd!

Skref

1. hluti af 3: Upphafleg uppsetning

  1. 1 Settu upp OpenGL. Byrjaðu á kennsluefni um hvernig á að setja OpenGL upp á tölvunni þinni. Ef þú ert þegar með OpenGL og C þýðanda geturðu sleppt þessu skrefi og haldið áfram í næsta.
  2. 2 Búðu til skjal. Búðu til nýja skrá í uppáhalds kóðaritlinum þínum og vistaðu hana sem mycube.c
  3. 3 Bæta við #inniheldur. Hér eru helstu #include tilskipanir sem þú þarft. Það er mikilvægt að muna að tilskipanir fyrir mismunandi stýrikerfi eru mismunandi og því þarf að velja allt þannig að forritið sé alhliða og hægt að keyra það á hvaða kerfi sem er.

      // Inniheldur #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 Bættu við hagnýtum frumgerðum og hnöttum. Næsta skref er að lýsa yfir hagnýtum frumgerðum.

      // Hagnýtar frumgerðir ógild skjá (); void specialKeys (); // hnattrænar breytur tvöfaldar snúning_y = 0; tvöfaldur snúningur_x = 0;

  5. 5 Skilgreindu aðalhlutverkið ().

      int main (int argc, char * argv []) // Upphafið GLUT og vinnið sérsniðnar breytur glutInit (& argc, argv); // Biðjið um glugga með stuðningi við tvöfalda buffun, Z-buffering og True Color glutInitDisplayMode (GLUT_DOUBLE

2. hluti af 3: Skjárinn () Virkni

  1. 1 Skilja tilganginn með display () virka. Öll vinna við að gera teninginn mun falla á brothættar línur þessarar aðgerðar. Almenna hugmyndin er þessi: þú munt teikna sex aðskild andlit teningsins og setja þau í hvert sinn.
    • Fyrir hvert andlit muntu skilgreina fjögur horn og OpenGL tengir þau með línum og fyllir þau með litnum sem þú valdir. Hvernig á að gera þetta verður útskýrt hér að neðan.
  2. 2 Bættu við glClear () falli. Í fyrsta lagi, þegar við vinnum með þessa aðgerð, þurfum við tær litur og z-biðminni... Án þessa mun sá gamli vera sýnilegur undir nýju myndinni og hlutirnir sem forritið teiknar verða staðsettir rangt.

      tómt skjá () // Hreinsaðu skjáinn og Z Buffer glClear (GL_COLOR_BUFFER_BIT

    • Gefðu gaum að síðustu tveimur línunum. Þetta eru aðgerðirnar glFlush (); og glutSwapBuffers ();, gefa áhrif tvöfaldrar biðminni, sem var lýst hér að ofan.

Hluti 3 af 3: Gagnvirkni dagskrár

  1. 1 Bættu við aðgerðinni specialKeys (). Í grundvallaratriðum er allt næstum tilbúið, en teningurinn er aðeins teiknaður en ekki snúinn. Til að gera þetta þarftu að búa til the specialKeys () fall, sem leyfir þér að snúa teningnum með því að ýta á örvatakkana!
    • Það er fyrir þessa aðgerð sem hnattrænna breyturnar rotate_x og rotate_y voru lýst yfir. Þegar þú ýtir á vinstri og hægri örvatakkana mun rotate_y gildið aukast eða lækka um fimm gráður. Gildi rotate_x mun breytast á sama hátt, en að þessu sinni með því að ýta á upp og niður örvatakkana.
    • void specialKeys (int key, int x, int y) {// Right arrow - auka snúninginn um 5 gráður ef (key == GLUT_KEY_RIGHT) rotate_y + = 5; // Vinstri ör - Minnkaðu snúning um 5 gráður að öðru leyti ef (key == GLUT_KEY_LEFT) rotate_y - = 5; annað ef (key == GLUT_KEY_UP) rotate_x + = 5; annað ef (key == GLUT_KEY_DOWN) rotate_x - = 5; // Beiðni um skjá endurnýja glutPostRedisplay (); }

  2. 2 Bæta við glRotate (). Það síðasta sem við munum gera er að bæta við línu sem gerir okkur kleift að snúa hlutnum. Fara aftur í virka sýna () og áður en lýsingin á FRAMhliðinni bætist við:

      // Endurstilla umbreytir glLoadIdentity (); // Snúa þegar notandinn breytir Gildin rotate_x og rotate_y glRotatef (rotate_x, 1.0, 0.0, 0.0); glRotatef (rotate_y, 0.0, 1.0, 0.0); // Marglituð hlið - FRAMKVÆMD ....

    • Vinsamlegast athugið að setningafræðin glRotatef ()sem er svipað setningafræði glColor3f () og glVertex3f (), en þarf alltaf fjórar breytur. Sá fyrsti er snúningshornið í gráðum. Næstu þrír eru ásarnir sem snúningurinn fer eftir, í röðinni x, y, z. Núna þurfum við að snúa teningnum eftir tveimur ásum, x og y.
    • Allar umbreytingar sem við skilgreinum í forritinu þurfa svipaðar línur. Í grundvallaratriðum táknum við snúning hlutar meðfram x-ásnum sem breytingu á gildi rotate_x og snúning meðfram y-ásnum sem breytingu á gildi rotate_y. Hins vegar mun OpenGL setja allt saman í eina umbreytingar fylki. Í hvert skipti sem þú hringir í skjá muntu búa til umbreytingar fylki og glLoadIdentity () leyfir þér að byrja með nýtt fylki í hvert skipti.
    • Aðrar umbreytingaraðgerðir sem þú gætir hafa notað eru glTranslatef () og glScalef (). Þau eru svipuð glRotatef (), nema að þau þurfa aðeins þrjár breytur: x-, y- og z -gildin til að breyta stærð og mæla hlutinn.
    • Til að allt birtist rétt þegar öllum þremur umbreytingum er beitt á einn hlut þarftu að stilla umbreytingar í viðeigandi röð, þ.e. glTranslate, glRotate, glScale - og aldrei annars. OpenGL umbreytir hlutnum með því að lesa forritið frá botni til topps. Til að skilja þetta betur, ímyndaðu þér hvernig 1x1x1 teningurinn myndi líta eftir öllum umbreytingum ef OpenGL beitti þeim í þeirri röð sem sýnd er (toppur til botns) og hugsaðu síðan um hvernig OpenGL myndi vinna teninginn með því að lesa leiðbeiningarnar frá botni til topps.
  3. 3 Bættu eftirfarandi skipunum við til að mæla teninginn tvisvar í x og y áttina, snúa teningnum 180 gráður á y ásnum og færa teninginn 0,1 í x ásinn. Gakktu úr skugga um að allar viðeigandi skipanir, þ.mt áður gefnar glRotate () skipanir, séu í réttri röð. Ef þú ert hræddur við að gera mistök, sjáðu lokaútgáfuna af forritinu í lok greinarinnar.

      // Fleiri umbreytingar glTranslatef (0,1, 0,0, 0,0); glRotatef (180, 0,0, 1,0, 0,0); glScalef (2,0, 2,0, 0,0);

  4. 4 Taktu saman og keyrðu kóðann. Segjum að þú sért að nota gcc sem þýðanda, svo sláðu inn eftirfarandi skipanir í flugstöðina þína:

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

  5. 5 Athugaðu lokakóðann. Hér er lokakóðinn sem höfundur greinarinnar bjó til, sem þýðir ekki þýðingarnar.

      // // Skrá: mycube.c // Höfundur: Matt Daisley // Búið til: 25.04.2012 // Verkefni: Kóðinn til að búa til tening í OpenGL // Lýsing: Býr til OpenGL glugga og teiknar 3D tening/ / Að notandinn geti snúið með örvatökkunum // // Stýringar: vinstri ör -snúið til vinstri // hægri ör -snúið til hægri // ör upp -snúið upp // ör niður -snúið niður // ------ -------------------------------------------------- -// Inniheldur // ------------------------------------------- -------------- #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 // ---------------------------------------- ------------------ // Virkni frumgerðir // -------------------------- -------------------------------- ógildur skjár (); void specialKeys (); // ------------------------------------------------ ---------- // hnattrænar breytur // ---------------------------------- ------------------------ tvöfaldur snúningur_y = 0; tvöfaldur snúningur_x = 0; // ------------------------------------------------ ---------- // display () Callback function // ------------------------------- --------------------------- tómt skjámynd () // Hreinsa skjá og Z-biðminni glClear (GL_COLOR_BUFFER_BIT // ------ -------------------------------------------------- -// specialKeys () Callback Function // ------------------------------------------ ------------------ void specialKeys (int key, int x, int y) {// hægri ör-auka snúning um 5 gráður ef (key == GLUT_KEY_RIGHT) rotate_y + = 5; // Vinstri ör - minnkaðu snúninginn um 5 gráður annars ef (lykill == GLUT_KEY_LEFT) snúið_y - = 5; annað ef (lykill == GLUT_KEY_UP) snúið_x + = 5; annað ef (lykill == GLUT_KEY_DOWN) snúið_x - = 5; // Biðja um uppfærslu á skjánum glutPostRedisplay ();} // ------------------------------------ ---------------------- // aðal () virka // -------------------- -------------------------------------- int main (int argc, char * argv [] ) GLUT_RGB