„OpenGL“yra galingas 3D programavimo įrankis, naudojamas sudėtingoms trimatėms scenoms piešti iš paprastų primityvų. Šis straipsnis išmokys jus piešti paprastą kubą, kurį galėsite sukdami peržiūrėti trimis matmenimis!
Šiam projektui jums reikės kodų redaktoriaus ir tam tikrų žinių apie C programavimą.
Žingsniai
1 dalis iš 3: Pradinė sąranka
1 veiksmas. „OpenGL“diegimas Norėdami pradėti, atlikite šiuos veiksmus, kad įdiegtumėte „OpenGL“savo sistemoje
Jei jau turite „OpenGL“ir suderinamą C kompiliatorių, galite praleisti šį veiksmą ir pereiti prie kito.
Žingsnis 2. Sukurkite dokumentą
Sukurkite naują failą savo mėgstamiausiame kodo redaktoriuje ir išsaugokite jį kaip mycube.c
3 veiksmas. Pridėkite #Include
Tai yra pagrindiniai dalykai, kurių jums reikės jūsų programai. Svarbu suvokti, kad skirtingoms operacinėms sistemoms iš tikrųjų reikalingi skirtingi priedai. Būtinai įtraukite visa tai, kad jūsų programa būtų universali ir galėtų veikti bet kuriam vartotojui.
// Apima #įtraukimą #įtraukimą #įtraukimą #define GL_GLEXT_PROTOTYPES #ifdef _APPLE_ #include #else #include #endif
Žingsnis 4. Pridėkite funkcijų prototipus ir globalius kintamuosius
Kitas žingsnis yra paskelbti kai kuriuos funkcijų prototipus.
// Funkcija Prototipai void display (); void specialKeys (); // Visuotiniai kintamieji dvigubas rotate_y = 0; dvigubas sukimas_x = 0;
Žingsnis 5. Nustatykite pagrindinę () funkciją
int main (int argc, char* argv ) {// Inicijuoti GLUT ir apdoroti vartotojo parametrus glutInit (& argc, argv); // Prašyti dvigubo buferinio tikrojo spalvų lango su Z-buferiu glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
Žingsnis 6. Sukurkite langą
Kitas žingsnis yra sukurti langą per kurią nupiešite kubą. Šioje pamokoje langas vadinamas „Nuostabus kubas“.
// Sukurti langą glutCreateWindow ("Nuostabus kubas");
Žingsnis 7. Įjunkite gylio bandymą
„OpenGL“yra griežta kalba, nes ji nereikalauja jokių specialių funkcijų įjungimo. Kad jūsų programa būtų tinkamai rodoma trimis matmenimis naudojant Z-buferį, į kurį žiūrėjote anksčiau, turite tai padaryti įgalinti gylio bandymą. Toliau tyrinėdami „OpenGL“, atrasite daugybę funkcijų, kurias turėsite įgalinti, įskaitant apšvietimą, tekstūrą, apipjaustymą ir daug daugiau.
// Įgalinti Z-buferio gylio testą glEnable (GL_DEPTH_TEST);
Žingsnis 8. Pridėkite atgalinio ryšio funkcijas
Čia yra atgalinio ryšio funkcijos, kurioms anksčiau parašėte prototipus. Kiekvieną kartą per pagrindinę kilpą šios funkcijos bus iškviestos. Rodymo funkcija perbraižo sceną, atsižvelgdama į visus kintamųjų pakeitimus, atliktus po ankstesnio skambučio. SpecialKeys funkcija leidžia mums bendrauti su programa.
// Atšaukimo funkcijos glutDisplayFunc (ekranas); glutSpecialFunc (specialKeys);
Žingsnis 9. Paleiskite „MainLoop“
Tai primins pagrindinę funkciją, kol uždarysite programą, kad būtų galima animacija ir vartotojo sąveika.
// Perduoti valdymą GLUT įvykiams glutMainLoop (); // Grįžti į OS return 0; }
2 dalis iš 3: Ekrano () funkcija
Žingsnis 1. Supraskite šios funkcijos paskirtį
Visas kubo piešimo darbas bus atliktas naudojant šią funkciją. Pagrindinė jūsų kubo idėja yra piešti visas šešias kraštines atskirai ir sudėti jas į reikiamą vietą.
Konceptualiai kiekviena pusė bus nupiešta apibrėžiant keturis kampus ir leidžiant „OpenGL“sujungti linijas ir užpildyti ją jūsų apibrėžta spalva. Žemiau pateikiami žingsniai, kaip tai padaryti
2 veiksmas. Pridėkite „glClear“()
Pirmiausia turite atlikti šią funkciją išvalykite spalvą ir Z buferį. Be šių veiksmų senieji brėžiniai vis tiek gali būti matomi po naujais brėžiniais, o nupiešti objektai nebus tinkamoje ekrano vietoje.
void display () {// Išvalyti ekraną ir Z-buferį glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
Žingsnis 3. Pridėkite glBegin () ir glEnd ()
„OpenGL“objektus apibrėžia kaip skirtingų daugiakampių derinius. Naudojant glBegin () komandą, jūs veiksmingai padėjote pieštuką, kuris nupieš formą. Norėdami pakelti pieštuką ir pradėti naują formą, turite naudoti glEnd () komandą. Šioje pamokoje jūs naudosite GL_POLYGON, kad pieštumėte kiekvieną kubo pusę, tačiau kitoms formoms kurti galite naudoti kitas parametrų parinktis, pvz., GL_LINE, GL_QUAD arba GL_TRIANGLE.
- Čia jūs pradėsite nuo savo kubo priekio. Vėliau spalvą pridėsite prie visų 6 pusių.
// Daugiaspalvė pusė - FRONT glBegin (GL_POLYGON); // Viršūnės bus pridėtos kitame žingsnyje glEnd ();
Žingsnis 4. Pridėkite glVertex3f ()
Kai pareiškėte, kad norite pradėti daugiakampį, turite tai padaryti apibrėžti viršūnes nuo objekto. „glVertex“turi keletą formų, priklausomai nuo to, ką norite daryti su savo objektu.
- Pirmasis yra tai, kiek matmenų dirbate. 3 aukščiau esančiame „glVertex3f“sakoma, kad piešiate 3 matmenis. Taip pat galima dirbti 2 ar 4 matmenimis. F viršuje glVertex3f sako, kad dirbate su slankiojo kablelio skaičiais. Taip pat galite naudoti šortus, sveikus skaičius ar dvigubas.
- Atkreipkite dėmesį, kad šie taškai yra apibrėžti a prieš laikrodžio rodyklę būdas. Šiuo metu tai nėra labai svarbu, tačiau kai pradėsite dirbti su apšvietimu, tekstūra ir apipjaustymu, tai taps neįtikėtinai svarbu, todėl dabar įpratę apibrėžti savo taškus prieš laikrodžio rodyklę.
- Pridėti pridėkite viršūnes tarp glBegin () ir glEnd () eilučių.
// Daugiaspalvė pusė - 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 veiksmas. Pridėkite glColor3f ()
„glColor“veikia panašiai kaip „glVertex“. Taškus galite apibrėžti kaip šortus, sveikus skaičius, dvigubus arba plūdinius. Kiekvienos spalvos reikšmė yra nuo 0 iki 1. Visi 0 reiškia, kad taškas yra juodas, o visi 1 - tašką. 3 „glColor3f“() reiškia RGB spalvų sistemą be alfa kanalo. Spalvos alfa apibrėžia jos skaidrumą. Norėdami pakeisti alfa lygį, naudokite glColor4f (), o paskutinis parametras turi būti nuo 0 iki 1, kad matinis būtų skaidrus.
- Kai skambinate glColor3f (), kiekviena viršūnė, nubrėžta nuo to taško, bus tos spalvos. Todėl, jei norite, kad visos keturios viršūnės būtų raudonos, tiesiog nustatykite spalvą bet kuriuo metu prieš „glVertex3f ()“komandas ir visos viršūnės bus raudonos.
- Žemiau apibrėžta priekinė pusė rodo, kaip kiekvienai viršūnei apibrėžti naują spalvą. Kai tai padarysite, pamatysite įdomią „OpenGL“spalvų savybę. Kadangi kiekviena daugiakampio viršūnė turi savo spalvą, „OpenGL“automatiškai sumaišys spalvas! Kitas žingsnis parodys, kaip priskirti keturias tos pačios spalvos viršūnes.
// Daugiaspalvė pusė - FRONT glBegin (GL_POLYGON); glColor3f (1,0, 0,0, 0,0); glVertex3f (0,5, -0,5, -0,5); // P1 yra raudona glColor3f (0.0, 1.0, 0.0); glVertex3f (0,5, 0,5, -0,5); // P2 yra žalia glColor3f (0.0, 0.0, 1.0); glVertex3f (-0,5, 0,5, -0,5); // P3 yra mėlyna glColor3f (1,0, 0,0, 1,0); glVertex3f (-0,5, -0,5, -0,5); // P4 yra violetinė glEnd ();
Žingsnis 6. Tvarkykite kitas puses
Išsiaiškinkite, kokia bus kiekvienos viršūnės vieta kitose penkiose kubo pusėse, tačiau paprastumo dėlei jie buvo apskaičiuoti jums ir yra įtraukti į galutinio rodymo () funkcija žemiau.
// Baltoji pusė - BACK 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 (); // Violetinė pusė - DEŠINĖ 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 (); // Žalia pusė - 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 (); // Mėlyna pusė - 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 (); // Raudona pusė - 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 (); }
Taip pat norime pridėti dvi paskutines šios funkcijos kodo eilutes. Šitie yra glFlush ();
ir glutSwapBuffers ();
kurie suteikia mums dvigubo buferio efektą, apie kurį sužinojote anksčiau.
3 dalis iš 3: Vartotojo interaktyvumas
1 veiksmas. Pridėkite specialKeys ()
Jūs beveik baigėte, bet šiuo metu galite piešti kubą, bet negalite jo pasukti. Norėdami tai padaryti, jūs padarysite sukurti specialų raktą () funkcija, leidžianti mums paspausti rodyklių klavišus ir pasukti kubą!
- Dėl šios funkcijos pasaulinius kintamuosius paskelbėte rotate_x ir rotate_y. Paspaudus rodyklių dešinę ir kairę klavišus rotate_y bus padidintas arba sumažintas 5 laipsniais. Panašiai, kai paspausite rodyklių aukštyn ir žemyn klavišus, rotate_x atitinkamai pasikeis.
void specialKeys (int klavišas, int x, int y) {// Rodyklė į dešinę - padidinti sukimąsi 5 laipsniais, jei (klavišas == GLUT_KEY_RIGHT) rotate_y += 5; // Rodyklė į kairę - sumažinkite sukimąsi 5 laipsniais, jei (klavišas == GLUT_KEY_LEFT) rotate_y - = 5; else if (raktas == GLUT_KEY_UP) rotate_x += 5; else if (raktas == GLUT_KEY_DOWN) rotate_x -= 5; // Pateikti ekrano atnaujinimo užklausą glutPostRedisplay (); }
2 veiksmas. Pridėkite „glRotate“()
Paskutinis jūsų teiginys yra pridėti teiginį, kuris pasuks jūsų objektą. Grįžkite prie ekrano () funkcijos ir priešais priekinę pusę pridėkite šias eilutes:
// Iš naujo nustatyti transformacijas glLoadIdentity (); // Pasukti, kai vartotojas keičia rotate_x ir rotate_y glRotatef (rotate_x, 1.0, 0.0, 0.0); glRotatef (pasukti_y, 0,0, 1,0, 0,0); // Daugiaspalvė pusė - PRIEKINIS….
Žingsnis 3. Pridėkite šias komandas, kad mastelis kubeliu padidėtų 2 išilgai x ašies, 2 išilgai y ašies, pasukite kubą 180 laipsnių aplink y ašį ir išverskite kubą 0,1 išilgai x ašies
Būtinai sutvarkykite šias ir ankstesnes „glRotate“() komandas teisinga tvarka, kaip aprašyta aukščiau. (Jei nesate tikri, tai daroma galutiniame kode pamokos pabaigoje.)
// Kitos transformacijos glTranslatef (0,1, 0,0, 0,0); glRotatef (180, 0,0, 1,0, 0,0); „glScalef“(2,0, 2,0, 0,0);
Žingsnis 4. Surinkite ir paleiskite savo kodą
Darant prielaidą, kad kompiliatoriumi naudojate gcc, paleiskite šias komandas iš savo terminalo, kad sudarytumėte ir išbandytumėte savo programą.
„Linux“: gcc cube.c -o kubas -lglut -lGL./ mycube „Mac“: gcc -o foo foo.c -framework GLUT -framework OpenGL./ mycube „Windows“: gcc -Wall -ofoo foo.c -lglut32cu - lglu32 -lopengl32./ mycube
Žingsnis 5. Patikrinkite visą kodą
Tai turėtų būti taip:
// Failas: mycube.c // Autorius: Matt Daisley // Sukurta: 2012.04.25 // Projektas: „Open agl“kubo kūrimo šaltinio kodas // Aprašymas: sukuria „OpenGL“langą ir piešia 3D kubą/ / Kad vartotojas galėtų pasukti naudodami rodyklių klavišus // // Valdikliai: rodyklė į kairę -pasukti į kairę // rodyklė į dešinę -pasukti į dešinę // rodyklė aukštyn -pasukti aukštyn // rodyklė žemyn -pasukti žemyn // ------ -------------------------------------------------- -- // Apima // ------------------------------------------- --------------- #include #include #include #define GL_GLEXT_PROTOTYPES #ifdef _APPLE_ #include #else #include #endif // ------------- -------------------------------------------- // Funkcijų prototipai / / ------------------------------------------------- --------- tuščias ekranas (); void specialKeys (); // ------------------------------------------------ ---------- // Pasauliniai kintamieji // ---------------------------------- ------------------------ dvigubas sukimas_y = 0; dvigubas sukimas_x = 0; // ------------------------------------------------ ---------- // display () atgalinio ryšio funkcija // ------------------------------- --------------------------- void display () {// Clear screen and Z-buffer glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Iš naujo nustatyti transformacijas glLoadIdentity (); // Kitos transformacijos // glTranslatef (0,1, 0,0, 0,0); // neįtrauktas // glRotatef (180, 0,0, 1,0, 0,0); // Neįtraukta // Pasukti, kai vartotojas keičia rotate_x ir rotate_y glRotatef (rotate_x, 1.0, 0.0, 0.0); glRotatef (pasukti_y, 0,0, 1,0, 0,0); // Kitos transformacijos // glScalef (2.0, 2.0, 0.0); // Neįtraukta // Daugiaspalvė pusė - FRONT glBegin (GL_POLYGON); glColor3f (1,0, 0,0, 0,0); glVertex3f (0,5, -0,5, -0,5); // P1 yra raudona glColor3f (0.0, 1.0, 0.0); glVertex3f (0,5, 0,5, -0,5); // P2 yra žalia glColor3f (0.0, 0.0, 1.0); glVertex3f (-0,5, 0,5, -0,5); // P3 yra mėlyna glColor3f (1,0, 0,0, 1,0); glVertex3f (-0,5, -0,5, -0,5); // P4 yra violetinė glEnd (); // Baltoji pusė - BACK 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 (); // Violetinė pusė - DEŠINĖ 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 (); // Žalia pusė - 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 (); // Mėlyna pusė - 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 (); // Raudona pusė - 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 () atgalinio ryšio funkcija // ------------------------------ ---------------------------- void specialKeys (int klavišas, int x, int y) {// rodyklė į dešinę-padidinti sukimąsi 5 laipsnis, jei (raktas == GLUT_KEY_RIGHT) pasukti_y += 5; // Rodyklė į kairę - sumažinkite sukimąsi 5 laipsniais, jei (klavišas == GLUT_KEY_LEFT) rotate_y - = 5; else if (raktas == GLUT_KEY_UP) rotate_x += 5; else if (raktas == GLUT_KEY_DOWN) rotate_x -= 5; // Pateikti ekrano atnaujinimo užklausą glutPostRedisplay (); } // ----------------------------------------------- ----------- // pagrindinė () funkcija // ------------------------------- --------------------------- int main (int argc, char* argv ) {// Inicijuoti GLUT ir apdoroti vartotojo parametrus glutInit (& argc, argv); // Prašyti dvigubo buferinio tikrojo spalvų lango su Z-buferiu glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); // Sukurti langą glutCreateWindow ("Nuostabus kubas"); // Įgalinti Z-buferio gylio testą glEnable (GL_DEPTH_TEST); // Atšaukimo funkcijos glutDisplayFunc (ekranas); glutSpecialFunc (specialKeys); // Perduoti valdymą GLUT įvykiams glutMainLoop (); // Grįžti į OS return 0; }