วิธีสร้างลูกบาศก์ใน OpenGL

ผู้เขียน: Gregory Harris
วันที่สร้าง: 12 เมษายน 2021
วันที่อัปเดต: 1 กรกฎาคม 2024
Anonim
OpenGL 3D Game Tutorial 8: Model, View & Projection Matrices
วิดีโอ: OpenGL 3D Game Tutorial 8: Model, View & Projection Matrices

เนื้อหา

OpenGL เป็นเครื่องมือการเขียนโปรแกรม 3 มิติที่ให้คุณสร้างภาพ 3 มิติที่ซับซ้อนจากรูปร่างที่เรียบง่าย ในบทความนี้คุณจะได้เรียนรู้วิธีการวาดลูกบาศก์ง่ายๆ ที่สามารถหมุนได้ในสามมิติด้วยความช่วยเหลือของเขา!

ขั้นตอน

ส่วนที่ 1 จาก 3: การติดตั้งเบื้องต้น

  1. 1 ติดตั้ง OpenGL เริ่มต้นด้วยการสอนเกี่ยวกับวิธีการติดตั้ง OpenGL บนคอมพิวเตอร์ของคุณ หากคุณมีคอมไพเลอร์ OpenGL และ C อยู่แล้ว คุณสามารถข้ามขั้นตอนนี้และไปยังขั้นตอนถัดไปได้
  2. 2 สร้างเอกสาร สร้างไฟล์ใหม่ในโปรแกรมแก้ไขโค้ดที่คุณชื่นชอบและบันทึกเป็น mycube.c
  3. 3 เพิ่ม #includes ต่อไปนี้คือคำสั่ง #include พื้นฐานที่คุณต้องการ สิ่งสำคัญคือต้องจำไว้ว่าคำสั่งสำหรับระบบปฏิบัติการที่แตกต่างกันนั้นแตกต่างกัน ดังนั้นคุณต้องเลือกทุกอย่างเพื่อให้โปรแกรมเป็นสากลและสามารถทำงานบนระบบใดก็ได้

      // รวม #include stdio.h> #include stdarg.h> #include math.h> #define GL_GLEXT_PROTOTYPES #ifdef __APPLE__ #include GLUT / glut.h> #else #include GL / glut.h> #endif

  4. 4 เพิ่มต้นแบบการทำงานและ globals ขั้นตอนต่อไปคือการประกาศต้นแบบการทำงาน

      // ต้นแบบการทำงานเป็นโมฆะแสดง (); เป็นโมฆะ specialKeys (); // ตัวแปรโกลบอล doublerotating_y = 0; หมุนสองครั้ง _x = 0;

  5. 5 กำหนดฟังก์ชันหลัก ()

      int main (int argc, char * argv []) // เริ่มต้น GLUT และประมวลผลพารามิเตอร์ที่กำหนดเอง glutInit (& argc, argv); // ขอหน้าต่างที่รองรับ Double Buffering, Z-Buffering และ True Color glutInitDisplayMode (GLUT_DOUBLE)

ส่วนที่ 2 จาก 3: การแสดงผล () ฟังก์ชั่น

  1. 1 ทำความเข้าใจวัตถุประสงค์ของฟังก์ชันการแสดงผล () งานทั้งหมดในการสร้างคิวบ์จะตกอยู่บนเส้นที่เปราะบางของฟังก์ชันนี้ แนวคิดทั่วไปคือ: คุณจะวาดใบหน้าของลูกบาศก์แยกกันหกหน้าแล้ววางไว้ในตำแหน่งที่เกี่ยวข้อง
    • สำหรับแต่ละใบหน้า คุณจะต้องกำหนดมุมทั้งสี่ และ OpenGL จะเชื่อมต่อพวกเขาด้วยเส้นและเติมด้วยสีที่คุณเลือก วิธีการทำเช่นนี้จะอธิบายไว้ด้านล่าง
  2. 2 เพิ่มฟังก์ชัน glClear () ก่อนอื่น เมื่อต้องใช้งานฟังก์ชันนี้ เราต้อง สีใสและ z-buffer... หากไม่มีสิ่งนี้ ภาพเก่าจะมองเห็นได้ใต้รูปภาพใหม่ และวัตถุที่โปรแกรมวาดไว้จะอยู่ในตำแหน่งที่ไม่ถูกต้อง

      การแสดงเป็นโมฆะ () // ล้างหน้าจอและบัฟเฟอร์ Z glClear (GL_COLOR_BUFFER_BIT

    • ให้ความสนใจกับสองบรรทัดสุดท้าย นี่คือหน้าที่ glFlush (); และ glutSwapBuffers ();ให้ผลของการบัฟเฟอร์สองครั้งซึ่งอธิบายไว้ข้างต้น

ส่วนที่ 3 จาก 3: การโต้ตอบของโปรแกรม

  1. 1 เพิ่มฟังก์ชัน specialKeys () โดยหลักการแล้วทุกอย่างเกือบจะพร้อมแล้ว แต่ลูกบาศก์ถูกวาดเท่านั้นและไม่หมุน ในการทำเช่นนี้ คุณต้องสร้าง ฟังก์ชัน specialKeys ()ซึ่งจะทำให้คุณสามารถหมุนลูกบาศก์ได้โดยการกดปุ่มลูกศร!
    • สำหรับฟังก์ชันนี้เองที่ประกาศตัวแปรทั่วโลกrotation_xและrotation_y เมื่อคุณกดแป้นลูกศรซ้ายและขวา ค่า rotation_y จะเพิ่มขึ้นหรือลดลงห้าองศา ค่าของ rotation_x จะเปลี่ยนในลักษณะเดียวกัน แต่คราวนี้โดยการกดปุ่มลูกศรขึ้นและลง
    • โมฆะ specialKeys (คีย์ int, int x, int y) {// ลูกศรขวา - เพิ่มการหมุน 5 องศาถ้า (คีย์ == GLUT_KEY_RIGHT) turns_y + = 5; // ลูกศรซ้าย - ลดการหมุนลง 5 องศา ถ้า (คีย์ == GLUT_KEY_LEFT) turns_y - = 5; อื่นถ้า (คีย์ == GLUT_KEY_UP) หมุน_x + = 5; อื่นถ้า (คีย์ == GLUT_KEY_DOWN) turns_x - = 5; // ขอรีเฟรชหน้าจอ glutPostRedisplay (); }

  2. 2 เพิ่ม glRotate () สิ่งสุดท้ายที่เราจะทำคือเพิ่มบรรทัดที่จะช่วยให้เราหมุนวัตถุได้ กลับสู่การทำงาน แสดง () และก่อนคำอธิบายของ FRONT ให้เพิ่ม:

      // รีเซ็ตการแปลง glLoadIdentity (); // หมุนเมื่อผู้ใช้เปลี่ยนค่า rotate_x และ rotation_y glRotatef (rotate_x, 1.0, 0.0, 0.0); glRotatef (rotate_y, 0.0, 1.0, 0.0); // ด้านหลากสี - ด้านหน้า ....

    • โปรดทราบว่าไวยากรณ์ glRotatef ()ซึ่งคล้ายกับไวยากรณ์ของ glColor3f () และ glVertex3f () แต่ต้องใช้พารามิเตอร์สี่ตัวเสมอ ประการแรกคือมุมการหมุนเป็นองศา สามแกนถัดไปคือแกนที่หมุนตามลำดับ x, y, z สำหรับตอนนี้ เราต้องหมุนลูกบาศก์ตามสองแกน x และ y
    • การแปลงทั้งหมดที่เรากำหนดในโปรแกรมต้องการบรรทัดที่คล้ายกัน โดยพื้นฐานแล้ว เราแสดงการหมุนของวัตถุตามแนวแกน x เป็นการเปลี่ยนแปลงในค่าของการหมุน_x และการหมุนตามแกน y เป็นการเปลี่ยนแปลงค่าของการหมุน_y อย่างไรก็ตาม OpenGL จะรวมทุกอย่างไว้ในเมทริกซ์การแปลงเดียว ทุกครั้งที่คุณเรียก display คุณจะสร้างเมทริกซ์การแปลงและ glLoadIdentity () จะช่วยให้คุณเริ่มต้นด้วยเมทริกซ์ใหม่ในแต่ละครั้ง
    • ฟังก์ชันการแปลงอื่นๆ ที่คุณอาจเคยใช้คือ glTranslatef () และ glScalef () คล้ายกับ glRotatef () ยกเว้นว่าต้องการเพียงสามพารามิเตอร์เท่านั้น: ค่า x, y และ z เพื่อปรับขนาดและปรับขนาดวัตถุ
    • เพื่อให้ทุกอย่างแสดงอย่างถูกต้องเมื่อใช้การแปลงทั้งสามกับวัตถุเดียว คุณต้องตั้งค่าการแปลงตามลำดับที่เหมาะสม กล่าวคือ glTranslate, glRotate, glScale - และไม่เคยเป็นอย่างอื่น OpenGL แปลงวัตถุโดยการอ่านโปรแกรมจากล่างขึ้นบน เพื่อให้เข้าใจสิ่งนี้ดีขึ้น ลองนึกภาพว่าคิวบ์ 1x1x1 จะดูแลการเปลี่ยนแปลงทั้งหมดอย่างไรหาก OpenGL นำไปใช้ตามลำดับที่แสดง (บนลงล่าง) แล้วคิดว่า OpenGL จะประมวลผลคิวบ์อย่างไรโดยอ่านคำแนะนำจากล่างขึ้นบน
  3. 3 เพิ่มคำสั่งต่อไปนี้เพื่อปรับขนาดลูกบาศก์สองครั้งในทิศทาง x และ y เพื่อหมุนลูกบาศก์ 180 องศาในแกน y และเพื่อย้ายลูกบาศก์ 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 ตรวจสอบรหัสสุดท้าย นี่คือรหัสสุดท้ายที่สร้างโดยผู้เขียนบทความซึ่งไม่ได้แปลความคิดเห็น

      // // ไฟล์: mycube.c // ผู้แต่ง: Matt Daisley // สร้างแล้ว: 4/25/2012 // โครงการ: ซอร์สโค้ดสำหรับสร้างลูกบาศก์ใน OpenGL // คำอธิบาย: สร้างหน้าต่าง OpenGL และวาดลูกบาศก์ 3 มิติ / / ที่ผู้ใช้สามารถหมุนได้โดยใช้ปุ่มลูกศร // // การควบคุม: ลูกศรซ้าย - หมุนซ้าย // ลูกศรขวา - หมุนขวา // ลูกศรขึ้น - หมุนขึ้น // ลูกศรลง - หมุนลง // ------ -------------------------------------------------- - // รวม // -------------------------------------------------- - -------------- #include stdio.h> #include stdarg.h> #include math.h> #define GL_GLEXT_PROTOTYPES #ifdef __APPLE__ #include GLUT / glut.h> #else # รวม GL / glut.h> #endif // ---------------------------------------- - ------------------ // ต้นแบบฟังก์ชัน // ------------------------- - -------------------------------- แสดงเป็นโมฆะ (); เป็นโมฆะ specialKeys (); // ------------------------------------------------ ---------- // ตัวแปรโกลบอล // ---------------------------------- ------------------------ หมุนสองครั้ง _y = 0; หมุนสองครั้ง _x = 0; // ------------------------------------------------ ---------- // แสดง () ฟังก์ชั่นการโทรกลับ // ------------------------------- ---------------------------- การแสดงเป็นโมฆะ () // ล้างหน้าจอและ Z-buffer glClear (GL_COLOR_BUFFER_BIT // ------ -------------------------------------------------- - // specialKeys () ฟังก์ชั่นการโทรกลับ // ---------------------------------------- - ------------------ โมฆะ specialKeys (คีย์ int, int x, int y) {// ลูกศรขวา - เพิ่มการหมุน 5 องศาถ้า (คีย์ == GLUT_KEY_RIGHT) หมุน_y + = 5; // ลูกศรซ้าย - ลดการหมุน 5 องศา มิฉะนั้น if (key == GLUT_KEY_LEFT) turns_y - = 5; else if (key == GLUT_KEY_UP) turns_x + = 5; else if (key == GLUT_KEY_DOWN) turns_x - = 5; // ขอแสดงการอัปเดต glutPostRedisplay ();} // ----------------------------------- - ---------------------- // ฟังก์ชั่นหลัก () // ------------------- - -------------------------------------- int main (int argc, char * argv [ ] ) GLUT_RGB