ส่วนก่อนหน้านี้จะสอนวิธีระบายสีรูปสามเหลี่ยมและรูปสี่เหลี่ยม บทเรียนนี้จะสอนวิธีหมุนวัตถุสีเหล่านี้รอบแกนพิกัดของมัน
ที่จริงแล้ว เพียงเพิ่มสองสามบรรทัดลงในโค้ดในส่วนก่อนหน้า มาเขียนรูทีนทั้งหมดใหม่อีกครั้ง สะดวกสำหรับคุณที่จะรู้ว่ามีอะไรเพิ่มเข้ามาและมีอะไรแก้ไขบ้าง
เพิ่มตัวแปรสองตัวเพื่อควบคุมการหมุนของวัตถุทั้งสองนี้ ตัวแปรทั้งสองนี้จะถูกเพิ่มหลังจากตัวแปรอื่นๆ ที่จุดเริ่มต้นของโปรแกรม (bool fullscreen=TRUE; สองบรรทัดด้านล่าง) เป็นตัวแปรประเภทจุดลอยตัวที่ช่วยให้เราสามารถหมุนวัตถุได้อย่างแม่นยำมาก ตัวเลขทศนิยมมีตำแหน่งทศนิยม ซึ่งหมายความว่าเราไม่จำเป็นต้องใช้มุม 1, 2, 3... คุณจะพบว่าตัวเลขทศนิยมเป็นพื้นฐานของการเขียนโปรแกรม OpenGL ตัวแปรใหม่ที่เรียกว่า rtri ใช้เพื่อหมุนรูปสามเหลี่ยม และ rquad ใช้เพื่อหมุนรูปสี่เหลี่ยมขนมเปียกปูน
วาร์
-
rtri : GLfloat; // มุมสำหรับสามเหลี่ยม (ใหม่)
rquad : GLfloat; // มุมสำหรับรูปสี่เหลี่ยม (ใหม่)
-
จากนั้นแก้ไข glDraw() ดังนี้:
ขั้นตอน glDraw();
เริ่ม
glClear(GL_COLOR_BUFFER_BIT หรือ GL_DEPTH_BUFFER_BIT); // ล้างหน้าจอและบัฟเฟอร์ความลึก
glLoadIdentity(); //รีเซ็ตเมทริกซ์การสังเกตโมเดลปัจจุบัน
//โค้ดบรรทัดถัดไปเป็นโค้ดใหม่ glRotatef(Angle,Xvector,Yvector,Zvector) มีหน้าที่ในการหมุนวัตถุรอบแกนที่กำหนด
//คำสั่งนี้มีประโยชน์หลายอย่าง มุมมักจะเป็นตัวแปรที่แสดงมุมที่วัตถุถูกหมุน
//พารามิเตอร์ทั้งสาม Xvector, Yvector และ Zvector ร่วมกันกำหนดทิศทางของแกนการหมุน
//ตัวอย่างเช่น เวกเตอร์ที่อธิบายโดย (1,0,0) ผ่าน 1 หน่วยของแกนพิกัด X และหันไปทางขวา
// เวกเตอร์ที่อธิบายโดย (-1,0,0) ผ่าน 1 หน่วยของแกนพิกัด X แต่ไปในทิศทางซ้าย
//D. Michael Traub: ให้คำอธิบายข้างต้นของ Xvector, Yvector และ Zvector
//เพื่อให้เข้าใจถึงการหมุนของ X, Y และ Z มากขึ้น ผมขอยกตัวอย่างบางส่วน...
//X-Axis - คุณกำลังใช้โต๊ะเลื่อย แกนที่อยู่ตรงกลางของใบมีดจะวางจากซ้ายไปขวา (เช่นเดียวกับแกน X ใน OpenGL)
//ฟันเลื่อยแหลมคมหมุนไปรอบแกน X อย่างดุเดือด ดูเหมือนว่าจะพลิกขึ้นหรือลง
//ขึ้นอยู่กับทิศทางที่ใบเลื่อยเริ่มหมุน นี่เป็นสถานการณ์เดียวกับเมื่อเราหมุนบางสิ่งรอบแกน X ใน OpenGL
//(หมายเหตุผู้แปล: หากคุณเอาหน้าไปทางมอนิเตอร์ตอนนี้ คุณจะถูกเลื่อยเปิดแน่นอน^-^.)
//แกน Y - สมมติว่าคุณอยู่ในใจกลางของพายุทอร์นาโดลูกใหญ่ โดยศูนย์กลางของพายุทอร์นาโดชี้จากพื้นดินขึ้นสู่ท้องฟ้า (เช่นเดียวกับแกน Y ใน OpenGL)
// ขยะและเศษซากหมุนอย่างดุเดือดรอบแกน Y จากซ้ายไปขวาหรือจากขวาไปซ้าย
//นี่เป็นสถานการณ์เดียวกับเมื่อเราหมุนบางสิ่งรอบแกน Y ใน OpenGL
//แกน Z - คุณกำลังมองพัดลมจากตรงไปข้างหน้า ศูนย์กลางของพัดลมชี้ไปทางคุณโดยตรง (เช่นแกน Z ใน OpenGL)
// ใบพัดลมหมุนตามเข็มนาฬิกาหรือทวนเข็มนาฬิการอบแกน Z นี่เป็นสถานการณ์เดียวกับเมื่อเราหมุนบางสิ่งรอบแกน Z ใน OpenGL
glTranslatef(-1.5, 0.0, -6.0); // เลื่อนไปทางซ้าย 1.5 หน่วยและเข้าสู่หน้าจอ 6.0
//ในบรรทัดโค้ดต่อไปนี้ ถ้า rtri เท่ากับ 7 เราจะหมุนสามเหลี่ยม 7 จากซ้ายไปขวารอบแกน Y
//คุณยังสามารถเปลี่ยนค่าของพารามิเตอร์เพื่อหมุนสามเหลี่ยมรอบแกน X และ Y พร้อมกันได้
glRotatef(rtri, 0.0, 1.0, 0.0); // หมุนสามเหลี่ยมรอบแกน Y (ใหม่)
//ไม่มีการเปลี่ยนแปลงโค้ดด้านล่าง สามเหลี่ยมไล่ระดับสีจะถูกวาดไว้ทางด้านซ้ายของหน้าจอ และหมุนจากซ้ายไปขวารอบแกน Y
glBegin(GL_TRIANGLES); // วาดรูปสามเหลี่ยม
glColor3f(1.0, 0.0, 0.0); // ตั้งค่าสีปัจจุบันเป็นสีแดง
glVertex3f(0.0, 1.0, 0.0); // จุดยอดบน
glColor3f(0.0, 1.0, 0.0); // ตั้งค่าสีปัจจุบันเป็นสีเขียว
glVertex3f(-1.0, -1.0, 0.0); // ซ้ายล่าง
glColor3f(0.0, 0.0, 1.0); // ตั้งค่าสีปัจจุบันเป็นสีน้ำเงิน
glVertex3f(1.0, -1.0, 0.0); // ขวาล่าง
glEnd(); // สิ้นสุดการวาดรูปสามเหลี่ยม
//คุณจะเห็นในโค้ดด้านล่างว่าเราได้เพิ่มการเรียก glLoadIdentity() อีกครั้ง
//จุดประสงค์คือการรีเซ็ตเมทริกซ์การสังเกตโมเดล
//หากเราไม่รีเซ็ตและเรียก glTranslate โดยตรง ผลลัพธ์ที่ไม่คาดคิดจะเกิดขึ้น
//เนื่องจากแกนพิกัดถูกหมุนไปแล้ว จึงไม่อยู่ในทิศทางที่คุณต้องการ
//ดังนั้น สิ่งที่เราต้องการย้ายวัตถุไปทางซ้ายและขวาในตอนแรกอาจขึ้นและลง ขึ้นอยู่กับว่าคุณหมุนแกนพิกัดมากน้อยเพียงใด
//ลองคอมเม้นท์ glLoadIdentity() แล้วดูว่าผลลัพธ์จะออกมาแบบไหน
//หลังจากรีเซ็ตเมทริกซ์การสังเกตแบบจำลอง แกน X, Y และ Z จะถูกรีเซ็ตทั้งหมด และเราเรียก glTranslate
//จะสังเกตเห็นว่าครั้งนี้เราย้ายไปทางขวาเพียง 1.5 หน่วย แทนที่จะเป็น 3.0 หน่วยเหมือนบทเรียนที่แล้ว
//เพราะเมื่อเรารีเซ็ตฉาก โฟกัสจะกลับไปที่จุดศูนย์กลางของฉาก (ที่ 0.0)
//วิธีนี้คุณจะต้องเลื่อนไปทางขวาเพียง 1.5 หน่วยเท่านั้น
//เมื่อเราย้ายไปยังตำแหน่งใหม่ ให้หมุนรูปสี่เหลี่ยมรอบแกน X สี่เหลี่ยมจะหมุนขึ้นและลง
glLoadIdentity(); //รีเซ็ตเมทริกซ์การสังเกตโมเดล
glTranslatef(1.5, 0.0, -6.0); // เลื่อนไปทางขวา 1.5 หน่วยแล้วย้ายไปที่หน้าจอ 6.0
glRotatef(rquad, 1.0, 0.0, 0.0); // หมุนรูปสี่เหลี่ยมรอบแกน X (ใหม่)
glBegin(GL_QUADS); // วาดรูปสี่เหลี่ยมจัตุรัส
glColor3f(0.6, 0.2, 2.0); // ตั้งค่าสีปัจจุบันเป็นสีม่วง
glVertex3f(-1.0, 1.0, 0.0); // ซ้ายบน
glVertex3f(1.0, 1.0, 0.0); // มุมขวาบน
glVertex3f(1.0, -1.0, 0.0); // ซ้ายล่าง
glVertex3f(-1.0, -1.0, 0.0); // ขวาล่าง
glEnd(); // สิ้นสุดรูปสี่เหลี่ยมจัตุรัส
//สองบรรทัดถัดไปเป็นบรรทัดใหม่
//หากจินตนาการว่า rtri และ rquad เป็นคอนเทนเนอร์
//จากนั้นในตอนเริ่มต้นของโปรแกรม เราได้สร้างคอนเทนเนอร์ (rtri และ rquad)
//เมื่อสร้างคอนเทนเนอร์ขึ้นมา คอนเทนเนอร์จะว่างเปล่า
//บรรทัดแรกของโค้ดด้านล่างเพิ่ม 0.2 ลงในคอนเทนเนอร์
//ดังนั้นทุกครั้งที่เรารันโค้ดก่อนหน้า ค่าในคอนเทนเนอร์ rtri จะเพิ่มขึ้น 0.2 ที่นี่
//บรรทัดต่อไปนี้จะลดค่าในคอนเทนเนอร์ rquad ลง 0.15
//ในทำนองเดียวกัน ทุกครั้งที่เรารันโค้ดก่อนหน้า ค่าในคอนเทนเนอร์ rquad จะลดลง 0.15 ที่นี่
//การล้มในที่สุดจะทำให้วัตถุหมุนไปในทิศทางตรงกันข้ามกับทิศทางการเติบโต
rtri := rtri + 0.2; // เพิ่มตัวแปรการหมุนของรูปสามเหลี่ยม (ใหม่)
rquad := rquad - 0.15; // ลดตัวแปรการหมุนของรูปสี่เหลี่ยม (ใหม่)
จบ;