วิธีสร้างลูกบาศก์ใน OpenGL (พร้อมรูปภาพ)

สารบัญ:

วิธีสร้างลูกบาศก์ใน OpenGL (พร้อมรูปภาพ)
วิธีสร้างลูกบาศก์ใน OpenGL (พร้อมรูปภาพ)

วีดีโอ: วิธีสร้างลูกบาศก์ใน OpenGL (พร้อมรูปภาพ)

วีดีโอ: วิธีสร้างลูกบาศก์ใน OpenGL (พร้อมรูปภาพ)
วีดีโอ: How to install Windows XP in Virtualbox 2024, มีนาคม
Anonim

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

สำหรับโครงการนี้ คุณจะต้องมีโปรแกรมแก้ไขโค้ดและมีความรู้เกี่ยวกับการเขียนโปรแกรม C

ขั้นตอน

ส่วนที่ 1 จาก 3: การตั้งค่าเริ่มต้น

1994315 1 1
1994315 1 1

ขั้นตอนที่ 1 ติดตั้ง OpenGL เพื่อเริ่มทำตามขั้นตอนเหล่านี้เพื่อติดตั้ง OpenGL บนระบบของคุณ

หากคุณมี OpenGL รวมถึงคอมไพเลอร์ C ที่เข้ากันได้ติดตั้งอยู่ คุณสามารถข้ามขั้นตอนนี้และไปที่ขั้นตอนถัดไป

1994315 2 1
1994315 2 1

ขั้นตอนที่ 2 สร้างเอกสาร

สร้างไฟล์ใหม่ในโปรแกรมแก้ไขโค้ดที่คุณชื่นชอบและบันทึกเป็น mycube.c

1994315 3 1
1994315 3 1

ขั้นตอนที่ 3 เพิ่ม #includes

นี่คือส่วนประกอบพื้นฐานที่จำเป็นสำหรับโปรแกรมของคุณ สิ่งสำคัญคือต้องตระหนักว่ามีความต้องการที่แตกต่างกันสำหรับระบบปฏิบัติการที่แตกต่างกัน อย่าลืมรวมสิ่งเหล่านี้ไว้ด้วยเพื่อให้แน่ใจว่าโปรแกรมของคุณใช้งานได้หลากหลายและสามารถใช้งานได้กับผู้ใช้ทุกคน

    // รวม #include #include #include #define GL_GLEXT_PROTOTYPES #ifdef _APPLE_ #include #else #include #endif

1994315 4 1
1994315 4 1

ขั้นตอนที่ 4 เพิ่มฟังก์ชันต้นแบบและตัวแปรส่วนกลาง

ขั้นตอนต่อไปของคุณคือการประกาศต้นแบบฟังก์ชันบางตัว

    // ฟังก์ชั่นต้นแบบเป็นโมฆะ display(); เป็นโมฆะ specialKeys(); // ตัวแปรโกลบอล doublerotating_y=0; หมุนสองครั้ง _x=0;

1994315 5 1
1994315 5 1

ขั้นตอนที่ 5. ตั้งค่าฟังก์ชัน main()

    int main(int argc, char* argv){ // เริ่มต้น GLUT และประมวลผลพารามิเตอร์ผู้ใช้ glutInit(&argc, argv); // ขอหน้าต่างสีจริงบัฟเฟอร์สองเท่าด้วย Z-buffer glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);

  • คำสั่งนี้ตั้งค่าสภาพแวดล้อมของคุณ สิ่งสำคัญที่ต้องจดจำเมื่อเขียนโปรแกรม OpenGL คือคุณต้องขอทุกอย่าง คุณต้องมีความเข้าใจมากขึ้นเกี่ยวกับวิธีการทำงานของโปรแกรมและสิ่งที่คุณต้องการรวมไว้เพื่อให้ได้ฟังก์ชันที่คุณต้องการ ในบรรทัดนี้ คุณจะต้องตั้งค่าการแสดงผลด้วยการบัฟเฟอร์สองเท่า สี RGB และบัฟเฟอร์ Z
  • บัฟเฟอร์สองเท่า เป็นเทคนิคที่ใช้ในโปรแกรมกราฟิกเพื่อขจัดปัญหาที่เกิดขึ้นเนื่องจากการดึงภาพมาที่หน้าจอ ทุกครั้งที่คุณวาดฉากใหม่ จอภาพจะต้องถูกลบก่อน จากนั้นข้อมูลใหม่จะถูกวาด หากไม่มีบัฟเฟอร์สองครั้ง คุณจะสังเกตเห็นเอฟเฟกต์การกะพริบเมื่อหน้าจอถูกลบและวาดใหม่ซ้ำๆ
  • ปัญหานี้แก้ไขได้ด้วยการเพิ่มบัฟเฟอร์ที่สองเพื่อดึงไป ด้วยวิธีนี้ รูปภาพจะถูกวาดไปที่บัฟเฟอร์แรกและแสดงให้คุณเห็น เฟรมถัดไปจะถูกดึงไปที่บัฟเฟอร์ที่สอง และเมื่อเสร็จแล้ว บัฟเฟอร์ทั้งสองจะเปลี่ยนตำแหน่ง คุณจะเห็นบัฟเฟอร์ที่สองทันที แต่ซ่อนไว้จากเรา บัฟเฟอร์แรกจะถูกลบและวาดใหม่ด้วยเฟรมที่สามซึ่งจะถูกสลับเมื่อเสร็จสิ้น
  • คุณต้องการเปิดใช้งาน สี RGB ระบบในหน้าต่างของคุณ
  • Z-บัฟเฟอร์ เป็นวิธีที่คุณได้รับเอฟเฟกต์ 3D ที่คุณต้องการ OpenGL ใช้ระบบพิกัดสามมิติที่มีแกน x, y และ z เพื่อให้เอฟเฟกต์ที่วัตถุอยู่ใกล้คุณมากขึ้น ตำแหน่งของวัตถุบนแกน z จะเพิ่มขึ้น อย่างไรก็ตาม เพื่อให้วัตถุปรากฏห่างออกไป ตำแหน่งของวัตถุบนแกน z จะลดลง
1994315 6 1
1994315 6 1

ขั้นตอนที่ 6 สร้างหน้าต่าง

ขั้นตอนต่อไปคือการ สร้างหน้าต่าง ภายในที่คุณจะวาดลูกบาศก์ ในบทช่วยสอนนี้ หน้าต่างจะเรียกว่า "Awesome Cube"

    // สร้างหน้าต่าง glutCreateWindow("Awesome Cube");

1994315 7 1
1994315 7 1

ขั้นตอนที่ 7 เปิดใช้งานการทดสอบความลึก

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

    // เปิดใช้งานการทดสอบความลึกของบัฟเฟอร์ Z glEnable(GL_DEPTH_TEST);

1994315 8 1
1994315 8 1

ขั้นตอนที่ 8 เพิ่มฟังก์ชันการโทรกลับ

นี่คือฟังก์ชันการโทรกลับที่คุณเขียนต้นแบบไว้ก่อนหน้านี้ ทุกครั้งที่ผ่านลูปหลัก ฟังก์ชันเหล่านี้จะถูกเรียก ฟังก์ชันการแสดงผลจะวาดฉากใหม่โดยอิงตามการเปลี่ยนแปลงใดๆ ของตัวแปรที่เกิดขึ้นตั้งแต่การเรียกครั้งก่อน ฟังก์ชัน specialKeys ช่วยให้เราโต้ตอบกับโปรแกรมได้

    // ฟังก์ชันการโทรกลับ glutDisplayFunc(display); glutSpecialFunc(ปุ่มพิเศษ);

1994315 9 1
1994315 9 1

ขั้นตอนที่ 9 เริ่ม MainLoop

การดำเนินการนี้จะเรียกคืนฟังก์ชันหลักจนกว่าคุณจะปิดโปรแกรมเพื่อให้สามารถแสดงภาพเคลื่อนไหวและการโต้ตอบกับผู้ใช้ได้

    // ส่งผ่านการควบคุมไปยัง GLUT สำหรับเหตุการณ์ glutMainLoop(); // กลับไปที่ OS คืนค่า 0; }

ส่วนที่ 2 จาก 3: ฟังก์ชัน display()

1994315 10 1
1994315 10 1

ขั้นตอนที่ 1 ทำความเข้าใจวัตถุประสงค์ของฟังก์ชันนี้

งานทั้งหมดของการวาดลูกบาศก์ของคุณจะเสร็จสิ้นในฟังก์ชันนี้ แนวคิดทั่วไปเบื้องหลังลูกบาศก์ของคุณคือการวาดทั้งหกด้านแยกกันและวางไว้ในตำแหน่งที่เหมาะสม

ตามแนวคิดแล้ว แต่ละด้านจะถูกวาดโดยการกำหนดมุมทั้งสี่และปล่อยให้ OpenGL เชื่อมต่อเส้นและเติมด้วยสีที่คุณกำหนด ด้านล่างนี้เป็นขั้นตอนในการทำเช่นนี้

1994315 11 1
1994315 11 1

ขั้นตอนที่ 2. เพิ่ม glClear()

ขั้นตอนแรกที่คุณต้องทำในฟังก์ชันนี้คือ ล้างสีและบัฟเฟอร์ Z. หากไม่มีขั้นตอนเหล่านี้ ภาพวาดเก่าอาจยังคงมองเห็นได้ภายใต้ภาพวาดใหม่และวัตถุที่วาดจะไม่อยู่ในตำแหน่งที่ถูกต้องบนหน้าจอ

    การแสดงเป็นโมฆะ () { // ล้างหน้าจอและ Z-buffer glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

1994315 12 1
1994315 12 1

ขั้นตอนที่ 3 เพิ่ม glBegin() และ glEnd()

OpenGL กำหนดวัตถุเป็นการรวมกันของรูปหลายเหลี่ยมที่แตกต่างกัน ใช้ glBegin() คำสั่ง คุณวางดินสออย่างมีประสิทธิภาพที่จะวาดรูปร่าง ในการยกดินสอขึ้นและเริ่มต้นรูปร่างใหม่ คุณต้องใช้ glEnd() สั่งการ. ในบทช่วยสอนนี้ คุณจะใช้ GL_POLYGON เพื่อวาดแต่ละด้านของลูกบาศก์ แต่คุณสามารถใช้ตัวเลือกพารามิเตอร์อื่นๆ เช่น GL_LINE, GL_QUAD หรือ GL_TRIANGLE เพื่อสร้างรูปร่างอื่นๆ

  • ที่นี่คุณจะเริ่มต้นด้วยด้านหน้าของคิวบ์ของคุณ ต่อมาจะเพิ่มสีสันให้ทั้ง 6 ด้าน
  • // ด้านหลายสี - FRONT glBegin(GL_POLYGON); // จุดยอดจะถูกเพิ่มในขั้นตอนต่อไป glEnd();

1994315 13 1
1994315 13 1

ขั้นตอนที่ 4 เพิ่ม glVertex3f()

เมื่อคุณได้ระบุว่าคุณต้องการเริ่มรูปหลายเหลี่ยมของคุณแล้ว คุณต้อง กำหนดจุดยอด ของวัตถุ glVertex มีหลายรูปแบบขึ้นอยู่กับว่าคุณต้องการทำอะไรกับวัตถุของคุณ

  • อย่างแรกคือจำนวนมิติที่คุณกำลังทำงานอยู่ 3 ด้านบนใน glVertex3f บอกว่าคุณกำลังวาดในสามมิติ นอกจากนี้ยังสามารถทำงานใน 2 หรือ 4 มิติ f ด้านบนใน glVertex3f บอกว่าคุณกำลังทำงานกับตัวเลขทศนิยม คุณยังสามารถใช้ shorts, integers or doubles.
  • ขอให้สังเกตว่าจุดเหล่านี้ถูกกำหนดในa ทวนเข็มนาฬิกา มารยาท. สิ่งนี้ไม่ได้สำคัญมากในขณะนี้ แต่เมื่อคุณเริ่มทำงานกับการจัดแสง พื้นผิว และการตัดมุม สิ่งนี้จะมีความสำคัญอย่างไม่น่าเชื่อ ดังนั้นจงกำหนดจุดของคุณทวนเข็มนาฬิกาให้เป็นนิสัย
  • เพิ่มจุดยอดระหว่างบรรทัด glBegin() และ glEnd()
  • // ด้านหลายสี - 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();

1994315 14 1
1994315 14 1

ขั้นตอนที่ 5. เพิ่ม glColor3f()

glColor ทำงานในลักษณะเดียวกันกับ glVertex คุณสามารถกำหนดจุดเป็น shorts, integers, doubles, or floats. แต่ละสีมีค่าตั้งแต่ 0 ถึง 1 ทั้งหมด 0 ทำให้จุดสีดำและ 1 ทั้งหมดจะทำให้จุดสีขาว 3 ใน glColor3f() หมายถึงระบบสี RGB ที่ไม่มีช่องอัลฟา อัลฟาของสีกำหนดความโปร่งใส หากต้องการเปลี่ยนระดับอัลฟา ให้ใช้ glColor4f() โดยพารามิเตอร์สุดท้ายเป็นค่า 0 ถึง 1 สำหรับทึบแสงถึงโปร่งใส

  • เมื่อคุณเรียก glColor3f() ทุกจุดยอดที่ดึงมาจากจุดนั้นจะเป็นสีนั้น ดังนั้น หากคุณต้องการให้จุดยอดทั้งสี่เป็นสีแดง เพียงแค่ตั้งค่าสีหนึ่งครั้งก่อนคำสั่ง glVertex3f() และจุดยอดทั้งหมดจะเป็นสีแดง
  • ด้านหน้าที่กำหนดไว้ด้านล่างแสดงวิธีการกำหนดสีใหม่สำหรับแต่ละจุดยอด เมื่อคุณทำเช่นนี้ คุณจะเห็นคุณสมบัติที่น่าสนใจของสี OpenGL เนื่องจากแต่ละจุดยอดของรูปหลายเหลี่ยมมีสีของมันเอง OpenGL จะผสมสีโดยอัตโนมัติ! ขั้นตอนต่อไปจะแสดงวิธีการกำหนดจุดยอดสี่จุดที่มีสีเดียวกัน
  • //ด้านหลายสี - FRONT glBegin(GL_POLYGON); glColor3f(1.0, 0.0, 0.0); glVertex3f(0.5, -0.5, -0.5); // P1 เป็นสีแดง glColor3f(0.0, 1.0, 0.0); glVertex3f(0.5, 0.5, -0.5); // P2 เป็นสีเขียว glColor3f(0.0, 0.0, 1.0); glVertex3f(-0.5, 0.5, -0.5); // P3 เป็นสีน้ำเงิน glColor3f(1.0, 0.0, 1.0); glVertex3f(-0.5, -0.5, -0.5); // P4 เป็นสีม่วง glEnd();

1994315 15 1
1994315 15 1

ขั้นตอนที่ 6. จับอีกด้านหนึ่ง

หาตำแหน่งของจุดยอดแต่ละอันสำหรับอีกห้าด้านที่เหลือของลูกบาศก์ แต่เพื่อความง่าย สิ่งเหล่านี้ได้รับการคำนวณสำหรับคุณและรวมอยู่ใน ฟังก์ชั่นการแสดงผลสุดท้าย () ด้านล่าง.

    // ด้านขาว - 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(); // ด้านสีม่วง - ขวา 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(); // ด้านสีเขียว - 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(); // ด้านสีน้ำเงิน - 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(); // ด้านสีแดง - ด้านล่าง 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(); }

  • เราต้องการเพิ่มโค้ดสองบรรทัดสุดท้ายสำหรับฟังก์ชันนี้ด้วย เหล่านี้คือ glFlush();

    และ glutSwapBuffers();

    ซึ่งให้เอฟเฟกต์บัฟเฟอร์สองเท่าที่คุณเรียนรู้มาก่อนหน้านี้

ส่วนที่ 3 จาก 3: การโต้ตอบกับผู้ใช้

1994315 16 1
1994315 16 1

ขั้นตอนที่ 1 เพิ่มคีย์พิเศษ ()

คุณเกือบเสร็จแล้ว แต่ในขณะนี้ คุณสามารถวาดลูกบาศก์ได้ แต่ไม่มีวิธีหมุนมัน เมื่อต้องการทำเช่นนี้ คุณจะ สร้างคีย์พิเศษ () ฟังก์ชั่นที่ช่วยให้เราสามารถกดปุ่มลูกศรและหมุนลูกบาศก์ได้!

  • ฟังก์ชันนี้เป็นสาเหตุที่คุณประกาศตัวแปรทั่วโลกว่าrotation_xและrotation_y เมื่อคุณกดแป้นลูกศรขวาและซ้ายrotation_y จะเพิ่มขึ้นหรือลดลง 5 องศา ในทำนองเดียวกัน เมื่อคุณกดแป้นลูกศรขึ้นและลง 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(); }

1994315 17 1
1994315 17 1

ขั้นตอนที่ 2. เพิ่ม glRotate()

คำสั่งสุดท้ายของคุณคือการเพิ่มคำสั่งที่จะหมุนวัตถุของคุณ กลับไปที่ฟังก์ชัน display() และก่อนถึง FRONT ให้เพิ่มบรรทัดเหล่านี้:

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

  • ให้สังเกตว่าไวยากรณ์ของ glRotatef() คล้ายกับของ glColor3f() และ glVertex3f() แต่ต้องใช้พารามิเตอร์ 4 ตัวเสมอ พารามิเตอร์แรกคือระดับการหมุนที่จะใช้ พารามิเตอร์สามตัวถัดไปกำหนดแกนที่จะหมุนโดยที่ตัวแรกคือแกน x ตัวที่สองคือแกน y และตัวที่สามคือแกน z ตอนนี้คุณต้องหมุนรอบแกน x และ y เท่านั้น
  • การแปลงทั้งหมดที่คุณเขียนในโปรแกรมของคุณต้องมีบรรทัดที่คล้ายกันนี้ ตามแนวคิดแล้ว คุณสามารถคิดได้ว่าสิ่งนี้เป็นการหมุนวัตถุของคุณเกี่ยวกับแกน x ตามจำนวนที่กำหนดโดยการหมุน_x จากนั้นหมุนรอบแกน y ด้วยการหมุน_y อย่างไรก็ตาม OpenGL รวมคำสั่งเหล่านี้ทั้งหมดไว้ในการแปลงเมทริกซ์เดียว ทุกครั้งที่คุณเรียกใช้ฟังก์ชันการแสดงผล คุณจะสร้างเมทริกซ์การแปลงและ glLoadIdentity() รับรองว่าคุณจะเริ่มต้นด้วยเมทริกซ์ใหม่ในแต่ละรอบ
  • ฟังก์ชันการแปลงอื่นๆ ที่คุณสามารถใช้ได้คือ glTranslatef() และ glScalef() ฟังก์ชันเหล่านี้คล้ายกับ glRotatef() ยกเว้นว่าใช้พารามิเตอร์เพียง 3 ตัวเท่านั้น จำนวน x, y และ z เพื่อแปลหรือปรับขนาดวัตถุ
  • เพื่อให้ได้เอฟเฟกต์ที่ถูกต้องเมื่อใช้การแปลงทั้งสามแบบกับวัตถุเดียว คุณต้องปรับใช้ตามลำดับที่ถูกต้อง เขียนตามลำดับเสมอ glTranslate glRotate จากนั้น glScale. OpenGL ใช้การแปลงในลักษณะจากล่างขึ้นบนเป็นหลัก เพื่อให้เข้าใจสิ่งนี้ ให้ลองจินตนาการว่าลูกบาศก์ขนาด 1x1x1 แบบธรรมดาจะมีลักษณะอย่างไรกับการแปลงหาก OpenGL ใช้พวกมันจากบนลงล่าง และหาก OpenGL ใช้งานจากล่างขึ้นบน
1994315 18 1
1994315 18 1

ขั้นตอนที่ 3 เพิ่มคำสั่งต่อไปนี้เพื่อปรับขนาดลูกบาศก์ 2 ตามแนวแกน x 2 ตามแนวแกน 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);

1994315 19 1
1994315 19 1

ขั้นตอนที่ 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

1994315 20 1
1994315 20 1

ขั้นตอนที่ 5. ตรวจสอบรหัสที่สมบูรณ์ของคุณ

ควรเป็นดังนี้:

    // // ไฟล์: mycube.c // ผู้แต่ง: Matt Daisley // สร้างแล้ว: 4/25/2012 // โครงการ: ซอร์สโค้ดสำหรับสร้างลูกบาศก์ใน OpenGL // คำอธิบาย: สร้างหน้าต่าง OpenGL และวาดลูกบาศก์ 3 มิติ / / ที่ผู้ใช้สามารถหมุนได้โดยใช้ปุ่มลูกศร // // การควบคุม: ลูกศรซ้าย - หมุนซ้าย // ลูกศรขวา - หมุนขวา // ลูกศรขึ้น - หมุนขึ้น // ลูกศรลง - หมุนลง // ------ -------------------------------------------------- -- // รวมถึง // ------------------------------------------- --------------- #include #include #include #define GL_GLEXT_PROTOTYPES #ifdef _APPLE_ #include #else #include #endif // ------------- ---------------------------------------------------- // ฟังก์ชั่นต้นแบบ / / -------------------------------------------------- --------- แสดงเป็นโมฆะ (); เป็นโมฆะ specialKeys(); // ------------------------------------------------ ---------- // ตัวแปรโกลบอล // ---------------------------------- ------------------------ หมุนสองครั้ง _y=0; หมุนสองครั้ง _x=0; // ------------------------------------------------ ---------- // display() ฟังก์ชั่นการโทรกลับ // ------------------------------- ---------------------------- การแสดงเป็นโมฆะ () { // ล้างหน้าจอและ Z-buffer glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // รีเซ็ตการแปลง glLoadIdentity(); // การแปลงอื่น ๆ // glTranslatef(0.1, 0.0, 0.0); // ไม่รวม // glRotatef(180, 0.0, 1.0, 0.0); // ไม่รวม // หมุนเมื่อผู้ใช้เปลี่ยน rotation_x และ rotation_y glRotatef (rotation_x, 1.0, 0.0, 0.0); glRotatef (rotation_y, 0.0, 1.0, 0.0); // การแปลงอื่น ๆ // glScalef (2.0, 2.0, 0.0); // ไม่รวม // ด้านหลายสี - FRONT glBegin(GL_POLYGON); glColor3f(1.0, 0.0, 0.0); glVertex3f(0.5, -0.5, -0.5); // P1 เป็นสีแดง glColor3f(0.0, 1.0, 0.0); glVertex3f(0.5, 0.5, -0.5); // P2 เป็นสีเขียว glColor3f(0.0, 0.0, 1.0); glVertex3f(-0.5, 0.5, -0.5); // P3 เป็นสีน้ำเงิน glColor3f(1.0, 0.0, 1.0); glVertex3f(-0.5, -0.5, -0.5); // P4 เป็นสีม่วง glEnd(); // ด้านขาว - 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(); // ด้านสีม่วง - ขวา 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(); // ด้านสีเขียว - 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(); // ด้านสีน้ำเงิน - 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(); // ด้านสีแดง - ด้านล่าง 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() ฟังก์ชันการโทรกลับ // ------------------------------ ---------------------------- โมฆะ specialKeys (คีย์ int, int x, int y) {// ลูกศรขวา - เพิ่มการหมุน 5 องศาถ้า (คีย์ == GLUT_KEY_RIGHT) หมุน_y += 5; // ลูกศรซ้าย - ลดการหมุนลง 5 องศา ถ้า (คีย์ == GLUT_KEY_LEFT) turns_y -= 5; อื่นถ้า (คีย์ == GLUT_KEY_UP) หมุน_x += 5; อื่นถ้า (คีย์ == GLUT_KEY_DOWN) turns_x -= 5; // ขอแสดงการปรับปรุง glutPostRedisplay(); } // ----------------------------------------------------- ----------- // ฟังก์ชั่นหลัก // ------------------------------- ---------------------------- int main(int argc, char* argv){ // เริ่มต้น GLUT และประมวลผลพารามิเตอร์ผู้ใช้ glutInit(&argc, argv); // ขอหน้าต่างสีจริงบัฟเฟอร์สองเท่าด้วย Z-buffer glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); // สร้างหน้าต่าง glutCreateWindow("Awesome Cube"); // เปิดใช้งานการทดสอบความลึกของบัฟเฟอร์ Z glEnable(GL_DEPTH_TEST); // ฟังก์ชันการโทรกลับ glutDisplayFunc(display); glutSpecialFunc(ปุ่มพิเศษ); // ส่งผ่านการควบคุมไปยัง GLUT สำหรับเหตุการณ์ glutMainLoop(); // กลับไปที่ OS คืนค่า 0; }

แนะนำ: