OpenGL-bu oddiy ibtidoiylardan murakkab uch o'lchovli sahnalarni chizish uchun ishlatiladigan kuchli 3D dasturlash vositasi. Ushbu maqola sizga uchta o'lchamda ko'rish uchun aylantira oladigan oddiy kubni qanday chizishni o'rgatadi!
Ushbu loyiha uchun sizga kod muharriri va C dasturlash bo'yicha ba'zi bilimlar kerak bo'ladi.
Qadamlar
3dan 1 -qism: Dastlabki sozlash
Qadam 1. OpenGL -ni o'rnating. Boshlash uchun OpenGL -ni tizimingizga o'rnatishni boshlang
Agar sizda allaqachon OpenGL, shuningdek mos keluvchi C kompilyatori o'rnatilgan bo'lsa, siz bu bosqichni o'tkazib yuborib, keyingisiga o'tishingiz mumkin.
Qadam 2. Hujjatni yarating
Sevimli kod muharririda yangi fayl yarating va uni mycube.c sifatida saqlang
3 -qadam. #O'z ichiga oladi
Bu sizning dasturingiz uchun zarur bo'lgan asosiy elementlar. Shuni tushunish kerakki, har xil operatsion tizimlar uchun zarur bo'lgan har xil komponentlar mavjud. Sizning dasturingiz ko'p qirrali va har qanday foydalanuvchi uchun ishlashi uchun bularning barchasini kiritganingizga ishonch hosil qiling.
// Tarkibiga #qo'shish #qo'shish #qo'shish #belgilash GL_GLEXT_PROTOTYPES #ifdef _APPLE_ #include #se #include #endif
Qadam 4. Funktsiya prototiplarini va global o'zgaruvchilarni qo'shing
Sizning keyingi qadamingiz ba'zi funktsional prototiplarni e'lon qilishdir.
// Funktsiya prototiplari void displeyi (); void specialKeys (); // Global o'zgaruvchilar double rotate_y = 0; ikki marta aylantirish_x = 0;
5 -qadam. Main () funktsiyasini o'rnating
int main (int argc, char* argv ) {// GLUTni ishga tushiring va glutInit foydalanuvchi parametrlarini qayta ishlang (& argc, argv); // Z-buferli glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH) bilan ikki buferli haqiqiy rangli oynani so'rash;
Qadam 6. Oynani yarating
Keyingi qadam - bu oynani yarating uning ichida siz kubni chizasiz. Bu darslikda oyna "Ajoyib kub" deb nomlangan.
// Deraza yaratish glutCreateWindow ("Ajoyib kub");
Qadam 7. Chuqurlik testini yoqing
OpenGL qat'iy tildir, chunki u hech qanday maxsus xususiyatlar yoqilmagan deb o'ylamaydi. Sizning dasturingiz Z-bufer yordamida 3 o'lchamda to'g'ri ko'rsatilishi uchun sizga kerak chuqurlik sinovini yoqish. OpenGL-ni o'rganishda davom etayotganingizda, siz yoqishingiz kerak bo'lgan ko'plab xususiyatlarni kashf etasiz, shu jumladan yoritish, tekstura, burilish va boshqalar.
// Z-bufer chuqurlik sinovini yoqish glEnable (GL_DEPTH_TEST);
Qadam 8. Qayta qo'ng'iroq qilish funktsiyalarini qo'shing
Siz ilgari prototiplarni yozgan qayta qo'ng'iroq qilish funktsiyalari. Har safar asosiy pastadir orqali bu funktsiyalar chaqiriladi. Ko'rsatish funktsiyasi oldingi qo'ng'iroqdan beri o'zgaruvchilar o'zgarishiga qarab sahnani qayta chizadi. SpecialKeys funktsiyasi bizga dastur bilan ishlashga imkon beradi.
// Qayta qo'ng'iroq qilish funktsiyalari glutDisplayFunc (ko'rsatish); glutSpecialFunc (maxsus kalitlar);
Qadam 9. MainLoop -ni ishga tushiring
Animatsiya va foydalanuvchilar bilan muloqot qilish uchun dasturni yopmaguningizcha, bu asosiy funktsiyani eslab qoladi.
// glutMainLoop () hodisalari uchun boshqaruvni GLUT -ga o'tkazing; // OS ga qaytish 0 ga qaytish; }
3dan 2 qism: Displey () funktsiyasi
Qadam 1. Bu funksiyaning maqsadini tushuning
Kubni chizish bo'yicha barcha ishlar shu funksiyada bajariladi. Sizning kubingizning umumiy g'oyasi, barcha olti tomonni birma -bir chizish va ularni kerakli joyga joylashtirishdir.
Kontseptual ravishda, har bir tomon to'rt burchakni aniqlash va OpenGL -ga chiziqlarni ulash va uni siz belgilagan rang bilan to'ldirish orqali chiziladi. Buni amalga oshirish uchun qadamlar quyida keltirilgan
2 -qadam. GlClear () qo'shing
Ushbu funktsiyani bajarishingiz kerak bo'lgan birinchi qadam bu rang va Z buferini tozalang. Bu qadamlarsiz eski chizmalar hali ham yangi chizmalar ostida ko'rinishi mumkin va chizilgan narsalar ekranda to'g'ri joylashmagan bo'lardi.
void display () {// Ekranni tozalash va Z-tampon glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
Qadam 3. glBegin () va glEnd () qo'shing
OpenGL ob'ektlarni turli xil ko'pburchaklarning kombinatsiyasi sifatida belgilaydi. Dan foydalanib glBegin () buyruq berib, siz shaklni chizadigan qalamni samarali qo'yasiz. Qalamni yuqoriga ko'tarib, yangi shaklni boshlash uchun siz uni ishlatishingiz kerak glEnd () buyruq. Ushbu qo'llanmada siz kubning har bir tomonini chizish uchun GL_POLYGON -dan foydalanasiz, lekin boshqa shakllarni yaratish uchun GL_LINE, GL_QUAD yoki GL_TRIANGLE kabi boshqa parametr variantlaridan foydalanish mumkin.
- Bu erda siz kubning old qismidan boshlaysiz. Keyinchalik siz 6 tomonga rang qo'shasiz.
// Ko'p rangli tomon - FRONT glBegin (GL_POLYGON); // Keyingi qadamda vertikalar qo'shiladi glEnd ();
Qadam 4. glVertex3f () qo'shing
Ko'pburchakni boshlashni xohlaganingizni aytganingizdan so'ng, buni qilishingiz kerak tepaliklarni aniqlang ob'ekt haqida. glVertex sizning ob'ektingiz bilan nima qilishni xohlayotganingizga qarab bir nechta shaklga ega.
- Birinchisi, siz qancha o'lchamda ishlayotganingiz. GlVertex3f -dagi 3 -rasmda siz 3 o'lchovda chizilganligingiz aytilgan. Bundan tashqari, 2 yoki 4 o'lchamda ishlash mumkin. GlVertex3f dagi yuqoridagi f siz o'zgaruvchan nuqta raqamlari bilan ishlayotganingizni bildiradi. Bundan tashqari, qisqa, butun sonlar yoki dubllardan foydalanishingiz mumkin.
- E'tibor bering, bu nuqtalar a soat sohasi farqli o'laroq uslub Hozirgi vaqtda bu unchalik muhim emas, lekin siz yorug'lik, tekstura va burilish bilan ishlashni boshlaganingizda, bu nihoyatda muhim bo'lib qoladi, shuning uchun o'z fikrlaringizni soat sohasi farqli o'laroq aniqlab olishga odatlaning.
- GlBegin () va glEnd () qatorlari orasidagi tepaliklarni qo'shing.
// Ko'p rangli tomon - 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 -qadam. GlColor3f () qo'shing
glColor glVertex -ga o'xshash tarzda ishlaydi. Siz nuqtalarni qisqa, tamsayı, dubl yoki suzuvchi sifatida belgilashingiz mumkin. Har bir rang 0 dan 1 gacha qiymatga ega. Hamma 0 -lar nuqta qora, 1 -lar esa oq rangga aylantiradi. GlColor3f () dagi 3 alfa kanali bo'lmagan RGB rang tizimini bildiradi. Rang alfa uning shaffofligini belgilaydi. Alfa darajasini o'zgartirish uchun glColor4f () dan foydalaning, oxirgi parametr shaffof bo'lmagan uchun 0 dan 1 gacha.
- GlColor3f () ni chaqirganingizda, shu nuqtadan chizilgan har bir tepalik shu rangda bo'ladi. Shuning uchun, agar siz to'rtta tepalikning qizil bo'lishini xohlasangiz, glVertex3f () buyruqlaridan oldin rangni xohlagan vaqtda belgilang va barcha tepaliklar qizil bo'ladi.
- Old tomondan har bir tepalik uchun yangi rangni qanday aniqlash kerakligi ko'rsatilgan. Buni qilganingizda, OpenGL ranglarining qiziqarli xususiyatini ko'rishingiz mumkin. Ko'pburchakning har bir tepasi o'ziga xos rangga ega bo'lgani uchun OpenGL avtomatik ravishda ranglarni aralashtirib yuboradi! Keyingi qadam bir xil rangdagi to'rtta tepalikni qanday belgilashni ko'rsatadi.
// Ko'p rangli tomon - FRONT glBegin (GL_POLYGON); glColor3f (1.0, 0.0, 0.0); glVertex3f (0,5, -0,5, -0,5); // P1 - qizil glColor3f (0,0, 1,0, 0,0); glVertex3f (0,5, 0,5, -0,5); // P2 - yashil glColor3f (0,0, 0,0, 1,0); glVertex3f (-0.5, 0.5, -0.5); // P3 - ko'k glColor3f (1.0, 0.0, 1.0); glVertex3f (-0,5, -0,5, -0,5); // P4 - binafsha rangli glEnd ();
Qadam 6. Boshqa tomonlarini ushlang
Kubning qolgan besh tomoni uchun har bir tepalikning joylashuvi qanday bo'lishini aniqlang, lekin soddaligi uchun ular siz uchun hisoblab chiqilgan. yakuniy ko'rsatish () funktsiyasi pastda
// Oq tomon - 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 (); // Binafsha tomon - O'ng 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 (); // Yashil tomon - 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 (); // Moviy tomon - 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 (); // Qizil tomon - 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 (); }
Bundan tashqari, biz ushbu funktsiya uchun oxirgi ikkita kod qatorini qo'shmoqchimiz. Bular glFlush ();
va glutSwapBuffers ();
Bu bizga ilgari bilib olgan ikki tomonlama bufer effektini beradi.
3 -dan 3 -qism: Foydalanuvchilarning o'zaro ta'siri
Qadam 1. specialKeys () ni qo'shing
Siz deyarli tayyorsiz, lekin hozircha siz kub chizishingiz mumkin, lekin uni aylantirishning iloji yo'q. Buni amalga oshirish uchun, siz maxsus kalitlarni yaratish () O'q tugmachalarini bosish va kubni aylantirish imkonini beradigan funksiya!
- Aynan shuning uchun siz global o'zgaruvchilarni rotate_x va rotate_y deb e'lon qildingiz. O'ng va chap o'q tugmachalarini bosganingizda, rotate_y 5 gradusga oshadi yoki kamayadi. Xuddi shunday, yuqoriga va pastga o'q tugmalarini bosganingizda, rotate_x mos ravishda o'zgaradi.
void specialKeys (int key, int x, int y) {// O'ng o'q - aylanishni 5 darajaga oshirish, agar (key == GLUT_KEY_RIGHT) rotate_y += 5; // Chap o'q - aylanishni 5 darajaga kamaytiring, agar (key == GLUT_KEY_LEFT) rotate_y - = 5; aks holda (key == GLUT_KEY_UP) rotate_x += 5; aks holda (key == GLUT_KEY_DOWN) rotate_x -= 5; // glutPostRedisplay displeyini yangilashni so'rash (); }
Qadam 2. glRotate () qo'shing
Sizning oxirgi so'zingiz - bu sizning ob'ektingizni aylantiradigan bayonotni qo'shish. Display () funktsiyasiga qayting va FRONTdan oldin quyidagi qatorlarni qo'shing:
// glLoadIdentity () konvertatsiyasini tiklash; // Foydalanuvchi rotate_x va rotate_y glRotatef (rotate_x, 1.0, 0.0, 0.0) o'zgarganda aylantirish; glRotatef (rotate_y, 0.0, 1.0, 0.0); // Ko'p rangli tomon - OLD ….
Qadam 3. Kubni x o'qi bo'ylab 2 ga, y o'qi bo'ylab 2 ga, kubni y o'qi atrofida 180 gradusga aylantirish va x o'qi bo'ylab 0,1 ga tarjima qilish uchun quyidagi buyruqlarni qo'shing
Yuqorida aytib o'tilganidek, avvalgi glRotate () buyruqlarini to'g'ri tartibda joylashtiring. (Agar ishonchingiz komil bo'lmasa, bu dars oxiridagi oxirgi kodda bajariladi.)
// Boshqa o'zgarishlar glTranslatef (0.1, 0.0, 0.0); glRotatef (180, 0,0, 1,0, 0,0); glScalef (2.0, 2.0, 0.0);
Qadam 4. Kodingizni kompilyatsiya qiling va ishga tushiring
Agar siz gcc -ni kompilyator sifatida ishlatayotgan bo'lsangiz, dasturni kompilyatsiya qilish va tekshirish uchun terminaldan ushbu buyruqlarni bajaring.
Linuxda: gcc cube.c -o cube -lglut -lGL./ mycube Mac -da: gcc -o foo foo.c -framework GLUT -framework OpenGL./ mycube Windowsda: gcc -Wall -ofoo foo.c -lglut32cu - lglu32 -lopengl32./ mycube
Qadam 5. To'liq kodingizni tekshiring
Bu shunday bo'lishi kerak:
// // Fayl: mycube.c // Muallif: Matt Daisley // Yaratilgan: 25.04.2012 // Loyiha: OpenGL -da kub yaratish uchun manba kodi // Tavsif: OpenGL oynasini yaratadi va 3D kubini chizadi/ / Foydalanuvchining o'q tugmachalari yordamida aylanishi // -------------------------------------------------- -// o'z ichiga oladi // ------------------------------------------- --------------- #qo'shish #qo'shish #qo'shish #ta'riflash GL_GLEXT_PROTOTYPES #ifdef _APPLE_ #include #se #include #endif // ------------- --------------------------------------------- // Funktsiya prototiplari / / ------------------------------------------------- --------- bo'sh displey (); void specialKeys (); // ------------------------------------------------ ---------- // Global o'zgaruvchilar // ---------------------------------- ------------------------ ikki marta aylantirish_y = 0; ikki marta aylantirish_x = 0; // ------------------------------------------------ ---------- // display () Qayta qo'ng'iroq qilish funktsiyasi // ------------------------------- -------------------------- void displey () {// Tiniq ekran va Z-tampon glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // glLoadIdentity () konvertatsiyasini tiklash; // Boshqa o'zgarishlar // glTranslatef (0.1, 0.0, 0.0); // Kiritilmagan // glRotatef (180, 0.0, 1.0, 0.0); // Kiritilmagan // Foydalanuvchi rotate_x va rotate_y glRotatef (rotate_x, 1.0, 0.0, 0.0) o'zgarganda aylantirish; glRotatef (rotate_y, 0.0, 1.0, 0.0); // Boshqa o'zgarishlar // glScalef (2.0, 2.0, 0.0); // Kiritilmagan // Ko'p rangli tomon - FRONT glBegin (GL_POLYGON); glColor3f (1.0, 0.0, 0.0); glVertex3f (0,5, -0,5, -0,5); // P1 - qizil glColor3f (0,0, 1,0, 0,0); glVertex3f (0,5, 0,5, -0,5); // P2 - yashil glColor3f (0,0, 0,0, 1,0); glVertex3f (-0.5, 0.5, -0.5); // P3 - ko'k glColor3f (1.0, 0.0, 1.0); glVertex3f (-0,5, -0,5, -0,5); // P4 - binafsha rangli glEnd (); // Oq tomon - 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 (); // Binafsha tomon - O'ng 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 (); // Yashil tomon - 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 (); // Moviy tomon - 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 (); // Qizil tomon - 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 () qayta qo'ng'iroq qilish funktsiyasi // ------------------------------ ---------------------------- void specialKeys (int key, int x, int y) {// O'ng o'q-aylanishni 5 ga oshirish daraja agar (kalit == GLUT_KEY_RIGHT) rotate_y += 5; // Chap o'q - aylanishni 5 darajaga kamaytiring, agar (key == GLUT_KEY_LEFT) rotate_y - = 5; aks holda (key == GLUT_KEY_UP) rotate_x += 5; aks holda (key == GLUT_KEY_DOWN) rotate_x -= 5; // glutPostRedisplay () displeyini yangilashni so'rash; } // ----------------------------------------------- ----------- // main () funktsiyasi // ------------------------------- --------------------------- int main (int argc, char* argv ) {// GLUTni ishga tushiring va glutInit foydalanuvchi parametrlarini qayta ishlang (& argc, argv); // Z-buferli glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH) bilan ikki buferli haqiqiy rangli oynani so'rash; // glutCreateWindow oynasini yarating ("Ajoyib kub"); // Z-bufer chuqurlik sinovini yoqish glEnable (GL_DEPTH_TEST); // Qayta qo'ng'iroq qilish funktsiyalari glutDisplayFunc (ko'rsatish); glutSpecialFunc (maxsus kalitlar); // glutMainLoop () hodisalari uchun boshqaruvni GLUT -ga o'tkazing; // OS ga qaytish 0 ga qaytish; }