OpenGL -da kubni qanday qilish kerak

Muallif: Gregory Harris
Yaratilish Sanasi: 12 Aprel 2021
Yangilanish Sanasi: 1 Iyul 2024
Anonim
OpenGL -da kubni qanday qilish kerak - Jamiyat
OpenGL -da kubni qanday qilish kerak - Jamiyat

Tarkib

OpenGL - bu oddiy shakllardan murakkab 3D tasvirlarni yaratishga imkon beruvchi 3D dasturlash vositasi. Ushbu maqolada siz uning yordamida uch o'lchamda aylanadigan oddiy kubni chizishni o'rganasiz!

Qadamlar

3dan 1 -qism: Dastlabki o'rnatish

  1. 1 OpenGL -ni o'rnating. OpenGL -ni kompyuteringizga qanday o'rnatishni o'rgating. Agar sizda OpenGL va C kompilyatori bo'lsa, siz bu bosqichni o'tkazib yuborib, keyingisiga o'tishingiz mumkin.
  2. 2 Hujjat yarating. Sevimli kod muharririda yangi fayl yarating va uni mycube.c sifatida saqlang
  3. 3 #Ni o'z ichiga oladi. Bu erda sizga kerak bo'lgan #include asosiy ko'rsatmalari. Shuni esda tutish kerakki, har xil operatsion tizimlar uchun ko'rsatmalar boshqacha, shuning uchun dastur universal bo'lishi va har qanday tizimda ishlashi uchun hamma narsani tanlash kerak.

      // o'z ichiga #include stdio.h> #include stdarg.h> #clude mathemat.h> #define GL_GLEXT_PROTOTYPES #ifdef __APPLE__ #include GLUT / glut.h> #else #include GL / glut.h> #endif

  4. 4 Funktsional prototiplar va globallarni qo'shing. Keyingi qadam - funktsional prototiplarni e'lon qilish.

      // Funktsional prototiplar void display (); void specialKeys (); // Global o'zgaruvchilar double rotate_y = 0; ikki marta aylantirish_x = 0;

  5. 5 Main () funktsiyasini aniqlang.

      int main (int argc, char * argv []) // GLUTni ishga tushiring va glutInit maxsus parametrlarini qayta ishlang (& argc, argv); // Ikki buferli, Z-buferli va haqiqiy rangli glutInitDisplayMode (GLUT_DOUBLE) uchun qo'llab-quvvatlanadigan oynani so'rang.

3dan 2 qism: Displey () funktsiyasi

  1. 1 Display () funktsiyasining maqsadini tushuning. Kubni ko'rsatish bo'yicha barcha ishlar ushbu funktsiyaning nozik chiziqlariga to'g'ri keladi. Umumiy fikr shunday: siz kubning oltita alohida yuzini chizasiz va ularni o'z joylariga joylashtirasiz.
    • Har bir yuz uchun siz to'rtta burchakni aniqlaysiz va OpenGL ularni chiziqlar bilan bog'lab, tanlagan rangingiz bilan to'ldiradi. Buni qanday qilish kerak, quyida tushuntiriladi.
  2. 2 GlClear () funktsiyasini qo'shing. Birinchidan, bu funktsiya bilan ishlashda bizga kerak tiniq rang va z-tampon... Bu holda, yangi rasm ostida eskisi ko'rinadi va dastur chizgan ob'ektlar noto'g'ri joylashadi.

      void display () // Ekranni va Z buferini tozalash glClear (GL_COLOR_BUFFER_BIT)

    • Oxirgi ikki qatorga e'tibor bering. Bu funktsiyalar glFlush (); va glutSwapBuffers ();, yuqorida ta'riflangan er -xotin buferlash effektini beradi.

3 -qismning 3 -qismi: Dastur interaktivligi

  1. 1 SpecialKeys () funktsiyasini qo'shing. Aslida, hamma narsa deyarli tayyor, lekin kub faqat chizilgan va aylanmagan. Buning uchun siz yaratishingiz kerak specialKeys () funktsiyasi, bu sizga o'q tugmalarini bosib kubni aylantirish imkonini beradi!
    • Aynan shu funktsiya uchun global o'zgaruvchilar rotate_x va rotate_y e'lon qilingan. Chap va o'ng o'q tugmalarini bosganingizda, rotate_y qiymati besh darajaga oshadi yoki kamayadi. Rotate_x qiymati xuddi shu tarzda o'zgaradi, lekin bu safar yuqoriga va pastga o'q tugmachalarini bosib.
    • void specialKeys (int key, int x, int y) {// O'ng o'q - aylanishni 5 darajaga oshiring, agar (key == GLUT_KEY_RIGHT) rotate_y + = 5; // Chap o'q - aylanishni 5 gradusga kamaytirish, 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; // Ekranni yangilashni so'rash glutPostRedisplay (); }

  2. 2 GlRotate () qo'shing. Biz qiladigan oxirgi narsa - ob'ektni aylantirishga imkon beradigan qatorni qo'shish. Funktsiyaga qaytish ko'rsatish () va FRONT tomonining tavsifidan oldin qo'shing:

      // O'zgarishlarni qayta o'rnatish glLoadIdentity (); // Foydalanuvchi o'zgarganda aylantirish rotate_x va rotate_y glRotatef (rotate_x, 1.0, 0.0, 0.0); glRotatef (rotate_y, 0.0, 1.0, 0.0); // Ko'p rangli tomon - OLD ...

    • Iltimos, sintaksisga e'tibor bering glRotatef ()Bu glColor3f () va glVertex3f () sintaksisiga o'xshash, lekin har doim to'rtta parametrni talab qiladi. Birinchisi - burilish burchagi gradus. Keyingi uchtasi - aylanish, x, y, z tartibida sodir bo'ladigan o'qlar. Hozircha biz kubni ikkita o'qi bo'ylab aylantirishimiz kerak, x va y.
    • Biz dasturda aniqlagan barcha o'zgarishlar shunga o'xshash qatorlarni talab qiladi. Asosan, biz ob'ektning x o'qi bo'ylab aylanishini rotate_x qiymatining o'zgarishi, y o'qi bo'ylab aylanish esa rotate_y qiymatining o'zgarishi sifatida ifodalaymiz. Biroq, OpenGL hamma narsani bitta transformatsion matritsaga birlashtiradi. Har safar displeyga qo'ng'iroq qilganingizda, siz transformatsiya matritsasini yaratasiz va glLoadIdentity () har safar yangi matritsadan boshlashga imkon beradi.
    • Siz ishlatgan boshqa o'zgartirish funktsiyalari - glTranslatef () va glScalef (). Ular glRotatef () ga o'xshaydi, faqat ular faqat uchta parametrni talab qiladi: x, y va z qiymatlari ob'ekt o'lchamini o'zgartirish va o'lchash uchun.
    • Hamma narsa bitta ob'ektga o'tkazilganda hamma narsa to'g'ri ko'rsatilishi uchun siz kerakli tartibda o'zgartirishni o'rnatishingiz kerak. glTranslate, glRotate, glScale - va hech qachon boshqacha. OpenGL dasturni pastdan yuqoriga o'qish orqali ob'ektni o'zgartiradi. Buni yaxshiroq tushunish uchun, agar OpenGL ularni ko'rsatilgan tartibda (yuqoridan pastgacha) qo'llasa, 1x1x1 kubining barcha o'zgarishlardan keyin qanday ko'rinishini tasavvur qiling va keyin ko'rsatmalarni pastdan yuqoriga o'qib, OpenGL kubni qanday ishlashi haqida o'ylang.
  3. 3 Kubni x va y yo'nalishida ikki marta o'lchash, kubni y o'qida 180 daraja aylantirish va x o'qida 0,1 kubni siljitish uchun quyidagi buyruqlarni qo'shing. Barcha tegishli buyruqlar, shu jumladan ilgari berilgan glRotate () buyruqlari to'g'ri tartibda ekanligiga ishonch hosil qiling. Agar xato qilishdan qo'rqsangiz, maqolaning oxirida dasturning oxirgi versiyasini ko'ring.

      // Ko'proq o'zgarishlar glTranslatef (0.1, 0.0, 0.0); glRotatef (180, 0,0, 1,0, 0,0); glScalef (2.0, 2.0, 0.0);

  4. 4 Kodni tuzing va ishga tushiring. Aytaylik, siz kompilyator sifatida gcc dan foydalanmoqdasiz, shuning uchun terminalingizga quyidagi buyruqlarni kiriting:

      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

  5. 5 Yakuniy kodni tekshiring. Mana, maqola muallifi tomonidan yaratilgan, sharhlarni tarjima qilmaydigan yakuniy kod.

      // // 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 // -------------------------------------------- -------------- #stdio.h> #qo'shish stdarg.h> #matematikani qo'shish.h> #define GL_GLEXT_PROTOTYPES #ifdef __APPLE__ #include GLUT / glut.h> #se #other include GL / glut.h> #endif // ---------------------------------------- ------------------ // Funktsiya prototiplari // -------------------------- -------------------------------- void 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 // ------ -------------------------------------------------- -// specialKeys () qayta qo'ng'iroq qilish funktsiyasi // ---------------------------------------- ------------------ void specialKeys (int key, int x, int y) {// O'ng o'q-agar (key == GLUT_KEY_RIGHT) rotate_y + bo'lsa, burilishni 5 darajaga oshiring. = 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; // displeyni yangilashni so'rash glutPostRedisplay ();} // ------------------------------------ ---------------------- // main () funktsiyasi // -------------------- -------------------------------------- int main (int argc, char * argv [] ) GLUT_RGB