OpenGL ni zana yenye nguvu ya programu ya 3D inayotumika kuteka taswira tata za pande tatu kutoka kwa vitangulizi rahisi. Nakala hii itakufundisha jinsi ya kuteka mchemraba rahisi ambao unaweza kuzunguka ili kuona katika vipimo vitatu!
Kwa mradi huu utahitaji mhariri wa nambari na ujuzi fulani wa programu C.
Hatua
Sehemu ya 1 ya 3: Usanidi wa Awali
Hatua ya 1. Sakinisha OpenGL Ili kuanza kufuata hatua hizi kusanidi OpenGL kwenye mfumo wako
Ikiwa tayari unayo OpenGL, na vile vile kiambatisho cha C kinachoendana kimewekwa, unaweza kuruka hatua hii na kwenda nyingine.
Hatua ya 2. Unda hati
Unda faili mpya katika mhariri wako wa nambari uipendayo na uihifadhi kama mycube.c
Hatua ya 3. Ongeza # pamoja na
Hizi ndio msingi ni pamoja na utahitaji kwa programu yako. Ni muhimu kutambua kuwa kuna anuwai tofauti inayohitajika kwa mifumo tofauti ya uendeshaji. Hakikisha kujumuisha hizi zote ili kuhakikisha kuwa programu yako ni anuwai na inaweza kukimbia kwa mtumiaji yeyote.
// Ni pamoja na # pamoja na # pamoja na # pamoja na #fafanua GL_GLEXT_PROTOTYPES #ifdef _APPLE_ # pamoja na #else #include #endif
Hatua ya 4. Ongeza prototypes za kazi na anuwai za ulimwengu
Hatua yako inayofuata ni kutangaza prototypes kadhaa za kazi.
// Prototypes za Utendaji kuonyesha batili (); vitupu maalum (); // Viwango vya Ulimwenguni vinazunguka mara mbili_y = 0; zungusha mara mbili_x = 0;
Hatua ya 5. Sanidi kazi kuu ()
int kuu (int argc, char * argv ) {// Anzisha GLUT na uchakata vigezo vya mtumiaji glutInit (& argc, argv); // Omba densi ya rangi ya kweli iliyopigwa mara mbili na Z-buffer glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
Hatua ya 6. Unda dirisha
Hatua inayofuata ni unda dirisha ndani ambayo utavuta mchemraba. Katika mafunzo haya, dirisha inaitwa "Mchemraba wa kushangaza".
// Unda glasi ya GlCreateWindow ("Mchemraba wa kushangaza");
Hatua ya 7. Wezesha mtihani wa kina
OpenGL ni lugha kali kwa kuwa haifikirii kuwa huduma yoyote maalum imewezeshwa. Ili programu yako ionyeshwe vizuri katika vipimo-3 kwa kutumia bafa ya Z ambayo uliiangalia mapema, unahitaji wezesha mtihani wa kina. Unapoendelea kuchunguza OpenGL, utagundua huduma nyingi ambazo utahitaji kuwezesha ikiwa ni pamoja na taa, maandishi, yanayowakabili na mengi zaidi.
// Wezesha Z-buffer kina mtihani glEnable (GL_DEPTH_TEST);
Hatua ya 8. Ongeza kazi za kupiga simu tena
Hapa kuna kazi za kupigia simu uliyoandika prototypes kwa mapema. Kila wakati kupitia kitanzi kikuu, kazi hizi zitaitwa. Kazi ya kuonyesha hutengeneza upya eneo kulingana na mabadiliko yoyote kwa vigeuzi ambavyo vilifanywa tangu simu ya awali. Kazi maalum ya Key inaruhusu sisi kuingiliana na programu.
// Kazi za kupigia simu glutDisplayFunc (onyesha); glutSpecialFunc (maalumKey);
Hatua ya 9. Anzisha MainLoop
Hii itakumbuka kazi kuu hadi utakapofunga programu kuruhusu uhuishaji na mwingiliano wa mtumiaji.
// Pitia udhibiti kwa GLUT kwa hafla za glutMainLoop (); // Kurudi kwa OS kurudi 0; }
Sehemu ya 2 ya 3: Kazi ya kuonyesha ()
Hatua ya 1. Elewa madhumuni ya kazi hii
Kazi yote ya kuchora mchemraba wako itafanywa katika kazi hii. Wazo la jumla nyuma ya mchemraba wako ni kuchora pande zote sita kivyake na kuziweka katika nafasi inayofaa.
Kwa dhana, kila upande utavutwa kwa kufafanua pembe nne na kuruhusu OpenGL iunganishe mistari na kuijaza na rangi unayoifafanua. Chini ni hatua za kufanya hivyo
Hatua ya 2. Ongeza glClear ()
Hatua ya kwanza unayohitaji kuchukua katika kazi hii ni futa rangi na bafa ya Z. Bila hatua hizi, michoro za zamani bado zinaweza kuonekana chini ya michoro mpya na vitu vilivyochorwa visingekuwa mahali sahihi kwenye skrini.
onyesha batili () {// Futa skrini na Z-bafa glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
Hatua ya 3. Ongeza glBegin () na glEnd ()
OpenGL inafafanua vitu kama mchanganyiko wa poligoni nyingi. Kutumia glBegin () amri, unaweka vizuri penseli ambayo itachora sura. Kuinua penseli na kuanza sura mpya, lazima utumie mwisho () amri. Katika mafunzo haya utakuwa unatumia GL_POLYGON kuteka kila upande wa mchemraba lakini inawezekana kutumia chaguzi zingine za kigezo kama vile GL_LINE, GL_QUAD, au GL_TRIANGLE kuunda maumbo mengine.
- Hapa utakuwa unaanza na mbele ya mchemraba wako. Baadaye utaongeza rangi kwa pande zote 6.
// Upande wa rangi nyingi - MBELE ya glBegin (GL_POLYGON); // Vertices itaongezwa katika hatua inayofuata glEnd ();
Hatua ya 4. Ongeza glVertex3f ()
Mara tu unaposema kuwa unataka kuanza poligoni yako, unahitaji fafanua vipeo ya kitu. glVertex ina aina nyingi kulingana na kile unataka kufanya na kitu chako.
- Ya kwanza ni vipimo vipi unavyofanya kazi. Ya 3 hapo juu kwenye glVertex3f inasema unachora katika vipimo 3. Inawezekana pia kufanya kazi kwa vipimo 2 au 4. F hapo juu kwenye glVertex3f inasema unafanya kazi na nambari za alama zinazoelea. Unaweza pia kutumia kaptula, nambari au maradufu.
- Angalia kuwa alama hizi zimefafanuliwa katika a kinyume na saa namna. Hii sio muhimu sana kwa sasa lakini unapoanza kufanya kazi na taa, maumbo, na sura ya kutazama, hii itakuwa muhimu sana kwa hivyo pata tabia ya kufafanua vidokezo vyako kinyume na saa sasa.
- Ongeza ongeza vipeo kati ya mistari ya glBegin () na glEnd ().
// Upande wa rangi nyingi - MBELE ya 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 ();
Hatua ya 5. Ongeza glColor3f ()
glColor inafanya kazi kwa njia sawa na glVertex. Unaweza kufafanua vidokezo kama kaptula, nambari, maradufu, au kuelea. Kila rangi ina thamani kutoka 0 hadi 1. Zote 0 hufanya alama kuwa nyeusi na zote 1 zitafanya alama kuwa nyeupe. 3 katika glColor3f () inahusu mfumo wa rangi ya RGB bila kituo cha alpha. Alfa ya rangi hufafanua uwazi wake. Kubadilisha kiwango cha alpha, tumia glColor4f () na parameta ya mwisho ikiwa thamani ya 0 hadi 1 kwa opaque kwa uwazi.
- Unapopigia glColor3f () kila vertex iliyochorwa kutoka hapo itakuwa ya rangi hiyo. Kwa hivyo, ikiwa unataka vipeo vyote vinne kuwa nyekundu, weka rangi mara moja wakati wowote kabla ya amri za glVertex3f () na vipeo vyote vitakuwa nyekundu.
- Upande wa Mbele uliofafanuliwa hapa chini unaonyesha jinsi ya kufafanua rangi mpya kwa kila kitabaka. Unapofanya hivyo, unaweza kuona mali ya kupendeza ya rangi za OpenGL. Kwa kuwa kila vertex ya poligoni ina rangi yake, OpenGL itachanganya rangi moja kwa moja! Hatua inayofuata itaonyesha jinsi ya kupeana vipeo vinne vyenye rangi moja.
// Upande wa rangi nyingi - MBELE ya glBegin (GL_POLYGON); glColor3f (1.0, 0.0, 0.0); glVertex3f (0.5, -0.5, -0.5); // P1 ni nyekundu glColor3f (0.0, 1.0, 0.0); glVertex3f (0.5, 0.5, -0.5); // P2 ni glColor3f ya kijani (0.0, 0.0, 1.0); glVertex3f (-0.5, 0.5, -0.5); // P3 ni glColor3f ya bluu (1.0, 0.0, 1.0); glVertex3f (-0.5, -0.5, -0.5); // P4 ni zambarau glEnd ();
Hatua ya 6. Shughulikia pande zingine
Fanya kazi mahali pa kila kitambulisho kitakuwa kwa pande zingine tano za mchemraba lakini kwa urahisi, hizi zimehesabiwa kwako na zimejumuishwa kwenye mwisho kuonyesha () kazi chini.
// Upande mweupe - BURE 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 (); // Upande wa zambarau - Glgin glight (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 (); // Upande wa Kijani - glgin ya LEFT (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 (); // Upande wa Bluu - glasi ya TOP (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 (); // Upande mwekundu - 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 (); }
Tunataka pia kuongeza katika mistari miwili ya mwisho ya nambari kwa kazi hii. Hizi ni glFlush ();
na glutSwapBuffers ();
ambayo hutupa athari ya kugongana mara mbili uliyojifunza juu ya hapo awali.
Sehemu ya 3 ya 3: Mwingiliano wa Mtumiaji
Hatua ya 1. Ongeza Funguo maalum ()
Umekamilika lakini kwa sasa, unaweza kuchora mchemraba lakini hauna njia ya kuizungusha. Ili kufanya hivyo, utakuwa unda Funguo maalum () kazi kuturuhusu kubonyeza funguo za mshale na kuzungusha mchemraba!
- Kazi hii ndio sababu ulitangaza anuwai ya ulimwengu kuzunguka_x na kuzungusha_y. Unapobonyeza vitufe vya mshale wa kulia na kushoto, zungusha_ zitazidishwa au kupungua kwa digrii 5. Vivyo hivyo, unapobonyeza vitufe vya juu na chini vya mshale, zungusha_x zitabadilika ipasavyo.
vitupu maalum (kitufe cha int, int x, int y) {// Mshale wa kulia - ongeza mzunguko kwa digrii 5 ikiwa (ufunguo == GLUT_KEY_RIGHT) zungusha_y + = 5; // Mshale wa kushoto - punguza mzunguko kwa digrii 5 nyingine ikiwa (ufunguo == GLUT_KEY_LEFT) zunguka_y - = 5; vinginevyo ikiwa (ufunguo == GLUT_KEY_UP) zungusha_x + = 5; vinginevyo ikiwa (ufunguo == GLUT_KEY_DOWN) zungusha_x - = 5; // Omba sasisho la kuonyesha glutPostRedisplay (); }
Hatua ya 2. Ongeza glRotate ()
Taarifa yako ya mwisho ni kuongeza taarifa ambayo itazunguka kitu chako. Rudi kwenye kazi ya kuonyesha () na kabla ya upande wa MBELE, ongeza mistari hii:
// Rudisha mabadiliko glLoadIdentity (); // Zungusha wakati mtumiaji anabadilisha zunguka_x na zungusha_y glRotatef (zungusha_x, 1.0, 0.0, 0.0); glRotatef (zungusha_y, 0.0, 1.0, 0.0); // Upande wa rangi nyingi - MBELE….
Hatua ya 3. Ongeza amri zifuatazo ili kupima mchemraba kwa 2 kando ya mhimili x, 2 kando ya mhimili y, zungusha mchemraba kwa digrii 180 juu ya mhimili, na utafsiri mchemraba kwa 0.1 kando ya mhimili x
Hakikisha kupanga hizi pamoja na maagizo ya awali ya GlRotate () kwa mpangilio sahihi kama ilivyoelezwa hapo juu. (Ikiwa haujui, hii imefanywa hii katika nambari ya mwisho mwisho wa mafunzo.)
// Mabadiliko mengine glTranslatef (0.1, 0.0, 0.0); glRotatef (180, 0.0, 1.0, 0.0); glScalef (2.0, 2.0, 0.0);
Hatua ya 4. Kusanya na kuendesha nambari yako
Kwa kudhani unatumia gcc kama mkusanyaji wako, endesha amri hizi kutoka kwa terminal yako kukusanya na kujaribu programu yako.
Kwenye Linux: gcc mchemraba.c -o mchemraba -lglut -lGL./ mycube Kwenye Mac: gcc -o foo foo.c -framework GLUT -framework OpenGL./ mycube Kwenye Windows: gcc -Wall -ofoo foo.c -lglut32cu - lglu32 -lopengl32./ mycube
Hatua ya 5. Angalia msimbo wako kamili
Inapaswa kuwa kama hii:
// // Faili: mycube.c // Mwandishi: Matt Daisley // Imeundwa: 4/25/2012 // Mradi: Nambari ya chanzo ya Tengeneza Mchemraba katika OpenGL // Maelezo: Inaunda dirisha la OpenGL na kuchora mchemraba wa 3D / / Kwamba mtumiaji anaweza kuzunguka kwa kutumia vitufe vya mshale // // Udhibiti: Mshale wa Kushoto - Zungusha Kushoto // Mshale wa Kulia - Zungusha Kulia // Mshale Juu - Zungusha Juu // Mshale wa Chini - Zungusha Chini // ------ -------------------------------------------------- - // Inajumuisha // -------------------------------------- ---------- ---------------------------------- / ----------------------------------- --------- onyesho batili (); vitupu maalum (); // ------------------------------------------------ ---------- // Vigezo vya Ulimwenguni // ---------------------------------- ------------------------ kuzunguka mara mbili_y = 0; zungusha mara mbili_x = 0; // ------------------------------------------------ ---------- // onyesha () kazi ya kupiga simu // ------------------------------ ----------- // Rudisha mabadiliko glLoadIdentity (); // Mabadiliko mengine // glTranslatef (0.1, 0.0, 0.0); // Haijumuishwa // glRotatef (180, 0.0, 1.0, 0.0); // Sio pamoja // Zungusha wakati mabadiliko ya mtumiaji yanazunguka_x na zungusha_y glRotatef (zungusha_x, 1.0, 0.0, 0.0); glRotatef (zungusha_y, 0.0, 1.0, 0.0); // Mabadiliko mengine // glScalef (2.0, 2.0, 0.0); // Sio pamoja // Upande wa rangi nyingi - MBELE ya glBegin (GL_POLYGON); glColor3f (1.0, 0.0, 0.0); glVertex3f (0.5, -0.5, -0.5); // P1 ni nyekundu glColor3f (0.0, 1.0, 0.0); glVertex3f (0.5, 0.5, -0.5); // P2 ni glColor3f ya kijani (0.0, 0.0, 1.0); glVertex3f (-0.5, 0.5, -0.5); // P3 ni glColor3f ya bluu (1.0, 0.0, 1.0); glVertex3f (-0.5, -0.5, -0.5); // P4 ni zambarau glEnd (); // Upande mweupe - BURE 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 (); // Upande wa zambarau - Glgin glight (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 (); // Upande wa Kijani - glgin ya LEFT (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 (); // Upande wa Bluu - glasi ya TOP (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 (); // Upande mwekundu - 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 (); } // ----------------------------------------------- ----------- // maalumKey () Kazi ya Kupiga tena // -------------------------- ---------------------- digrii ikiwa (ufunguo == GLUT_KEY_RIGHT) zungusha_y + = 5; // Mshale wa kushoto - punguza mzunguko kwa digrii 5 nyingine ikiwa (ufunguo == GLUT_KEY_LEFT) zunguka_y - = 5; vinginevyo ikiwa (ufunguo == GLUT_KEY_UP) zungusha_x + = 5; vinginevyo ikiwa (ufunguo == GLUT_KEY_DOWN) zungusha_x - = 5; // Omba sasisho la kuonyesha glutPostRedisplay (); } // ----------------------------------------------- ----------- // kuu () kazi // ------------------------------ ---------------------- & argc, argv); // Omba densi ya rangi ya kweli iliyopigwa mara mbili na Z-buffer glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); // Unda glasi ya GlCreateWindow ("Mchemraba wa Kutisha"); // Wezesha Z-buffer kina mtihani glEnable (GL_DEPTH_TEST); // Kazi za kupigia simu glutDisplayFunc (onyesha); glutSpecialFunc (maalumKey); // Pitia udhibiti kwa GLUT kwa hafla za glutMainLoop (); // Kurudi kwa OS kurudi 0; }