ວິທີການສ້າງ cube ໃນ OpenGL

ກະວີ: Gregory Harris
ວັນທີຂອງການສ້າງ: 12 ເດືອນເມສາ 2021
ວັນທີປັບປຸງ: 1 ເດືອນກໍລະກົດ 2024
Anonim
ວິທີການສ້າງ cube ໃນ OpenGL - ສະມາຄົມ
ວິທີການສ້າງ cube ໃນ OpenGL - ສະມາຄົມ

ເນື້ອຫາ

OpenGL ເປັນເຄື່ອງມືການຂຽນໂປຣແກມ 3 ມິຕິທີ່ຊ່ວຍໃຫ້ເຈົ້າສາມາດສ້າງພາບສາມມິຕິທີ່ຊັບຊ້ອນໄດ້ຈາກຮູບຊົງທີ່ລຽບງ່າຍ. ໃນບົດຄວາມນີ້, ເຈົ້າຈະໄດ້ຮຽນຮູ້ວິທີການແຕ້ມດ້ວຍການຊ່ວຍເຫຼືອຂອງລາວກ້ອນນ້ອຍ simple ທີ່ສາມາດatedຸນໄດ້ສາມມິຕິ!

ຂັ້ນຕອນ

ສ່ວນທີ 1 ຂອງ 3: ການຕິດຕັ້ງເບື້ອງຕົ້ນ

  1. 1 ຕິດຕັ້ງ OpenGL. ເລີ່ມດ້ວຍການສອນແນະ ນຳ ວິທີການຕິດຕັ້ງ OpenGL ໃນຄອມພິວເຕີຂອງເຈົ້າ. ຖ້າເຈົ້າມີ OpenGL ແລະ C compiler ຢູ່ແລ້ວ, ເຈົ້າສາມາດຂ້າມຂັ້ນຕອນນີ້ແລະກ້າວໄປຫາຂັ້ນຕໍ່ໄປ.
  2. 2 ສ້າງເອກະສານ. ສ້າງໄຟລ new ໃin່ຢູ່ໃນຕົວແກ້ໄຂລະຫັດທີ່ເຈົ້າມັກແລະບັນທຶກມັນໄວ້ເປັນ mycube.c
  3. 3 ເພີ່ມ #ລວມ. ນີ້ແມ່ນ ຄຳ ແນະ ນຳ ພື້ນຖານ #ລວມເຖິງສິ່ງທີ່ເຈົ້າຕ້ອງການ. ມັນເປັນສິ່ງສໍາຄັນທີ່ຕ້ອງຈື່ໄວ້ວ່າຄໍາແນະນໍາສໍາລັບລະບົບປະຕິບັດການທີ່ແຕກຕ່າງກັນແມ່ນແຕກຕ່າງກັນ, ແລະດັ່ງນັ້ນ, ເຈົ້າຈໍາເປັນຕ້ອງເລືອກທຸກຢ່າງເພື່ອໃຫ້ໂປຣແກມເປັນສາກົນແລະສາມາດໃຊ້ໄດ້ກັບທຸກລະບົບ.

      // ລວມເອົາ #include stdio.h> #ລວມທັງ stdarg.h> #ລວມເອົາເລກຄະນິດສາດ>> ລວມເອົາ GL_GLEXT_PROTOTYPES #ifdef __APPLE__ #ລວມ GLUT / glut.h> #else #include GL / glut.h> #endif

  4. 4 ເພີ່ມຕົ້ນແບບທີ່ເປັນປະໂຫຍດແລະ ໜ່ວຍ ໂລກ. ຂັ້ນຕອນຕໍ່ໄປແມ່ນການປະກາດຕົວຕົ້ນແບບທີ່ເປັນປະໂຫຍດ.

      // ໜ້າ ທີ່ຕົ້ນສະບັບ void display (); void specialKeys (); // ຕົວປ່ຽນທົ່ວໂລກ double rotate_y = 0; rotate_x ສອງເທົ່າ = 0;

  5. 5 ກຳ ນົດ ໜ້າ ທີ່ຫຼັກ ().

      int main (int argc, char * argv []) // ລິເລີ່ມ GLUT ແລະປະມວນຜົນຕົວກໍານົດການເອງ glutInit (& argc, argv); // ຮ້ອງຂໍປ່ອງຢ້ຽມດ້ວຍການສະ ໜັບ ສະ ໜູນ ສຳ ລັບການບັບເຟີສອງເທື່ອ, Z-Buffering ແລະສີແທ້ glutInitDisplayMode (GLUT_DOUBLE

ສ່ວນທີ 2 ຂອງ 3: ໜ້າ ທີ່ການສະແດງຜົນ ()

  1. 1 ເຂົ້າໃຈຈຸດປະສົງຂອງ ໜ້າ ທີ່ການສະແດງຜົນ (). ວຽກທັງonົດໃນການສະແດງຄິວບາຈະຕົກຢູ່ໃນສາຍທີ່ບອບບາງຂອງ ໜ້າ ທີ່ນີ້. ແນວຄວາມຄິດທົ່ວໄປແມ່ນອັນນີ້: ເຈົ້າຈະແຕ້ມຮູບ ໜ້າ 6 ອັນແຍກອອກຈາກກັນແລະວາງພວກມັນໄວ້ໃນ ຕຳ ແໜ່ງ ຂອງເຂົາເຈົ້າ.
    • ສຳ ລັບແຕ່ລະໃບ ໜ້າ, ເຈົ້າຈະ ກຳ ນົດສີ່ມຸມ, ແລະ OpenGL ຈະເຊື່ອມຕໍ່ພວກມັນເຂົ້າກັບເສັ້ນແລະຕື່ມໃສ່ສີທີ່ເຈົ້າເລືອກ. ວິທີການເຮັດສິ່ງນີ້ຈະໄດ້ຮັບການອະທິບາຍຂ້າງລຸ່ມນີ້.
  2. 2 ເພີ່ມຟັງຊັນ glClear (). ກ່ອນອື່ນwhenົດ, ເມື່ອເຮັດວຽກກັບ ໜ້າ ທີ່ນີ້, ພວກເຮົາຕ້ອງການ ສີຊັດເຈນແລະ z-buffer... ຖ້າບໍ່ມີສິ່ງນີ້, ຮູບເກົ່າຈະສາມາດເບິ່ງເຫັນໄດ້ພາຍໃຕ້ຮູບໃ,່, ແລະວັດຖຸທີ່ແຕ້ມໂດຍໂປຣແກມຈະຖືກຈັດຕໍາ ແໜ່ງ ບໍ່ຖືກຕ້ອງ.

      void display () // ລຶບລ້າງ ໜ້າ ຈໍແລະ Z Buffer glClear (GL_COLOR_BUFFER_BIT

    • ຈົ່ງເອົາໃຈໃສ່ກັບສອງແຖວສຸດທ້າຍ. ນີ້ແມ່ນ ໜ້າ ທີ່ glFlush (); ແລະ glutSwapBuffers ();, ໃຫ້ຜົນຂອງການບັບເຟີສອງເທົ່າ, ເຊິ່ງໄດ້ອະທິບາຍໄວ້ຂ້າງເທິງ.

ສ່ວນທີ 3 ຂອງ 3: ການໂຕ້ຕອບໂຄງການ

  1. 1 ເພີ່ມຟັງຊັນ specialKeys (). ຢູ່ໃນຫຼັກການ, ທຸກສິ່ງທຸກຢ່າງແມ່ນເກືອບພ້ອມແລ້ວ, ແຕ່ cube ໄດ້ຖືກແຕ້ມເທົ່ານັ້ນແລະບໍ່ໄດ້ຫມູນວຽນ. ເພື່ອເຮັດສິ່ງນີ້, ທ່ານຈໍາເປັນຕ້ອງສ້າງ ຟັງຊັນ specialKeys (), ເຊິ່ງຈະເຮັດໃຫ້ທ່ານrotateຸນ cube ໄດ້ໂດຍການກົດປຸ່ມລູກສອນ!
    • ມັນແມ່ນ ສຳ ລັບ ໜ້າ ທີ່ນີ້ທີ່ຕົວແປທົ່ວໂລກ rotate_x ແລະ rotate_y ໄດ້ຖືກປະກາດ. ເມື່ອເຈົ້າກົດປຸ່ມລູກສອນຊ້າຍແລະຂວາ, ຄ່າ rotate_y ຈະເພີ່ມຂຶ້ນຫຼືຫຼຸດລົງຫ້າອົງສາ. ຄ່າຂອງ rotate_x ຈະປ່ຽນໄປໃນແບບດຽວກັນ, ແຕ່ເທື່ອນີ້ໂດຍການກົດປຸ່ມລູກສອນຂຶ້ນແລະລົງ.
    • void specialKeys (int key, int x, int y) {// ລູກສອນຂວາ - ເພີ່ມການrotationຸນ 5 ອົງສາຖ້າ (key == GLUT_KEY_RIGHT) rotate_y + = 5; // ລູກສອນຊ້າຍ - ຫຼຸດການByຸນລົງ 5 ອົງສາອື່ນຖ້າ (ປຸ່ມ == GLUT_KEY_LEFT) rotate_y - = 5; ອື່ນຖ້າ (ປຸ່ມ == GLUT_KEY_UP) rotate_x + = 5; ອື່ນຖ້າ (ປຸ່ມ == GLUT_KEY_DOWN) rotate_x - = 5; // ຮ້ອງຂໍການໂຫຼດ ໜ້າ ຈໍຄືນໃgl່ glutPostRedisplay (); }

  2. 2 ເພີ່ມ glRotate (). ສິ່ງສຸດທ້າຍທີ່ພວກເຮົາຈະເຮັດແມ່ນເພີ່ມເສັ້ນທີ່ຈະຊ່ວຍໃຫ້ພວກເຮົາtheຸນວັດຖຸໄດ້. ກັບຄືນໄປເຮັດ ໜ້າ ທີ່ ຈໍສະແດງຜົນ () ແລະກ່ອນ ຄຳ ອະທິບາຍຂອງດ້ານ ໜ້າ ເພີ່ມ:

      // ຣີເຊັດ Transforms glLoadIdentity (); // ateຸນເມື່ອຜູ້ໃຊ້ປ່ຽນຄ່າ rot_x ແລະ rotate_y glRotatef (rotate_x, 1.0, 0.0, 0.0); glRotatef (rotate_y, 0.0, 1.0, 0.0); // ດ້ານຫຼາຍສີ - ດ້ານ ໜ້າ ...

    • ກະລຸນາຮັບຊາບວ່າໄວຍະກອນ glRotatef ()ເຊິ່ງຄ້າຍຄືກັນກັບໄວຍະກອນຂອງ glColor3f () ແລະ glVertex3f (), ແຕ່ຕ້ອງການຕົວກໍານົດສີ່ຢ່າງຢູ່ສະເີ. ທຳ ອິດແມ່ນມຸມrotationູນວຽນເປັນອົງສາ. ສາມອັນຕໍ່ໄປແມ່ນແກນທີ່ການtakesູນວຽນເກີດຂຶ້ນຕາມ ລຳ ດັບ x, y, z. ສໍາລັບດຽວນີ້, ພວກເຮົາຈໍາເປັນຕ້ອງtheຸນລູກກີ້ວຕາມສອງແກນ, x ແລະ y.
    • ການຫັນປ່ຽນທັງthatົດທີ່ພວກເຮົາ ກຳ ນົດໃນໂປຣແກຣມຕ້ອງການສາຍທີ່ຄ້າຍຄືກັນ. ໂດຍພື້ນຖານແລ້ວ, ພວກເຮົາເປັນຕົວແທນຂອງການrotationຸນວັດຖຸໄປຕາມແກນ x ເປັນການປ່ຽນແປງມູນຄ່າຂອງການ rot_x, ແລະການalongຸນໄປຕາມແກນ y ເປັນການປ່ຽນແປງມູນຄ່າຂອງການ rot_y. ແນວໃດກໍ່ຕາມ, OpenGL ຈະລວມເອົາທຸກສິ່ງທຸກຢ່າງເຂົ້າໄປໃນຕາຕະລາງການຫັນປ່ຽນອັນດຽວ. ແຕ່ລະຄັ້ງທີ່ເຈົ້າເອີ້ນການສະແດງ, ເຈົ້າຈະສ້າງຕາຕະລາງການຫັນປ່ຽນ, ແລະ glLoadIdentity () ຈະອະນຸຍາດໃຫ້ເຈົ້າເລີ່ມຕົ້ນດ້ວຍຕາຕະລາງໃnew່ແຕ່ລະຄັ້ງ.
    • ໜ້າ ທີ່ການປ່ຽນແປງອັນອື່ນທີ່ເຈົ້າອາດຈະໃຊ້ແມ່ນ glTranslatef () ແລະ glScalef (). ພວກມັນຄ້າຍຄືກັນກັບ glRotatef (), ຍົກເວັ້ນພວກມັນຕ້ອງການພຽງແຕ່ສາມຕົວກໍານົດການ: ຄ່າ x, y, ແລະ z ເພື່ອປັບຂະ ໜາດ ແລະປັບຂະ ໜາດ ວັດຖຸ.
    • ເພື່ອໃຫ້ທຸກສິ່ງທຸກຢ່າງສະແດງໃຫ້ຖືກຕ້ອງເມື່ອການປ່ຽນແປງທັງສາມຖືກນໍາໃຊ້ກັບວັດຖຸດຽວ, ເຈົ້າຈໍາເປັນຕ້ອງກໍານົດການຫັນປ່ຽນຕາມລໍາດັບທີ່ເappropriateາະສົມ, ຄື gl ແປ, glRotate, glScale - ແລະບໍ່ເຄີຍຖ້າບໍ່ດັ່ງນັ້ນ. OpenGL ປ່ຽນວັດຖຸໂດຍການອ່ານໂປຣແກມຈາກລຸ່ມຫາເທິງ. ເພື່ອເຂົ້າໃຈສິ່ງນີ້ໃຫ້ດີຂຶ້ນ, ຈິນຕະນາການວ່າຄິວ 1x1x1 ຈະເບິ່ງແຍງການຫັນປ່ຽນທັງifົດແນວໃດຖ້າ OpenGL ນຳ ໃຊ້ພວກມັນຕາມ ລຳ ດັບທີ່ສະແດງ (ເທິງຫາລຸ່ມ), ແລະຈາກນັ້ນຄິດກ່ຽວກັບວ່າ OpenGL ຈະປະມວນຜົນກ້ອນແນວໃດໂດຍການອ່ານ ຄຳ ແນະ ນຳ ຈາກລຸ່ມຫາເທິງ.
  3. 3 ເພີ່ມ ຄຳ ສັ່ງຕໍ່ໄປນີ້ເພື່ອປັບຂະ ໜາດ cube ສອງເທື່ອໃນທິດທາງ x ແລະ y, ເພື່ອtheຸນ cube 180 ອົງສາຢູ່ໃນແກນ y, ແລະເພື່ອຍ້າຍ cube 0.1 ຢູ່ໃນແກນ x. ໃຫ້ແນ່ໃຈວ່າທຸກຄໍາສັ່ງທີ່ກ່ຽວຂ້ອງລວມທັງຄໍາສັ່ງ glRotate () ທີ່ໄດ້ໃຫ້ມາກ່ອນນັ້ນແມ່ນຢູ່ໃນລໍາດັບທີ່ຖືກຕ້ອງ. ຖ້າເຈົ້າຢ້ານທີ່ຈະເຮັດຜິດ, ເບິ່ງສະບັບສຸດທ້າຍຂອງໂຄງການຢູ່ທ້າຍບົດຄວາມ.

      // ການຫັນປ່ຽນເພີ່ມເຕີມ glTranslatef (0.1, 0.0, 0.0); glRotatef (180, 0.0, 1.0, 0.0); glScalef (2.0, 2.0, 0.0);

  4. 4 ລວບລວມແລະດໍາເນີນການລະຫັດ. ສົມມຸດວ່າເຈົ້າກໍາລັງໃຊ້ gcc ເປັນຜູ້ຮວບຮວມຂໍ້ມູນຂອງເຈົ້າ, ດັ່ງນັ້ນໃສ່ຄໍາສັ່ງຕໍ່ໄປນີ້ໃສ່ປາຍທາງຂອງເຈົ້າ:

      ໃນ Linux: gcc cube.c -o cube -lglut -lGL ./ mycube ເທິງ Mac: gcc -o foo foo.c -framework GLUT -framework OpenGL ./ mycube ໃນ Windows: gcc -Wall -ofoo foo.c -lglut32cu - lglu32 -lopengl32 ./ mycube

  5. 5 ກວດເບິ່ງລະຫັດສຸດທ້າຍ. ນີ້ແມ່ນລະຫັດສຸດທ້າຍທີ່ສ້າງໂດຍຜູ້ຂຽນບົດຄວາມ, ເຊິ່ງບໍ່ໄດ້ແປຄວາມຄິດເຫັນ.

      // // File: mycube.c // ຜູ້ຂຽນ: Matt Daisley // ສ້າງ: 4/25/2012 // ໂຄງການ: ລະຫັດແຫຼ່ງຂໍ້ມູນສໍາລັບສ້າງ Cube ໃນ OpenGL // ລາຍລະອຽດ: ສ້າງປ່ອງຢ້ຽມ OpenGL ແລະແຕ້ມຮູບສາມມິຕິ/ / ທີ່ຜູ້ໃຊ້ສາມາດrotateຸນໄດ້ໂດຍໃຊ້ປຸ່ມລູກສອນ // // ການຄວບຄຸມ: ລູກສອນຊ້າຍ -ateຸນຊ້າຍ // ລູກສອນຂວາ -Rightຸນຂວາ // ລູກສອນຂຶ້ນ -Upຸນຂຶ້ນ // ລູກສອນລົງ -Downຸນລົງ // ------ ------------------------------------------------------------------ -// ປະກອບມີ // -------------------------------------------- -------------- #ລວມເອົາ stdio.h> #ລວມເອົາ stdarg.h> #ລວມເອົາເລກຄະນິດສາດ>> ລວມເອົາ GL_GLEXT_PROTOTYPES #ifdef __APPLE__ #ລວມ GLUT / glut.h> #else #ລວມທັງ GL / glut.h> #endif // ---------------------------------------- ------------------ // Function Prototypes // -------------------------- -------------------------------- void display (); void specialKeys (); // ------------------------------------------------ ---------- // ຕົວປ່ຽນທົ່ວໂລກ // ---------------------------------- ------------------------ double rotate_y = 0; rotate_x ສອງເທົ່າ = 0; // ------------------------------------------------ ---------- // ສະແດງ () ຟັງຊັ່ນການເອີ້ນຄືນ // ------------------------------- --------------------------- void display () // Clear screen and Z-buffer glClear (GL_COLOR_BUFFER_BIT // ------) ------------------------------------------------------------------ -// specialKeys () Function Callback // ---------------------------------------- ------------------ void specialKeys (int key, int x, int y) {// ລູກສອນຂວາ-ເພີ່ມການrotationຸນ 5 ອົງສາຖ້າ (key == GLUT_KEY_RIGHT) rotate_y + = 5; // ລູກສອນຊ້າຍ - ຫຼຸດການbyຸນລົງອີກ 5 ອົງສາຖ້າ (ປຸ່ມ == GLUT_KEY_LEFT) rotate_y - = 5; ອີກອັນ ໜຶ່ງ ຖ້າ (ປຸ່ມ == GLUT_KEY_UP) rotate_x + = 5; ອື່ນ if ຖ້າ (key == GLUT_KEY_DOWN) rotate_x - = 5; // ຮ້ອງຂໍການອັບເດດການສະແດງ glutPostRedisplay ();} // ------------------------------------ ---------------------- // main () function // -------------------- -------------------------------------- int ຫຼັກ (int argc, char * argv [] ) GLUT_RGB