glLoadIdentity () ทำอะไรใน OpenGL


133

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

ฉันรู้ว่าglLoadIdentity()แทนที่เมทริกซ์ปัจจุบันด้วยเมทริกซ์เอกลักษณ์ แต่มันทำอะไรกันแน่? หากทุกโปรแกรมต้องการทำไมเมทริกซ์เอกลักษณ์จึงไม่เป็นค่าเริ่มต้นเว้นแต่จะระบุไว้เป็นอย่างอื่น ฉันไม่ชอบให้มีฟังก์ชันในโค้ดของฉันเว้นแต่ฉันจะรู้ว่ามันทำอะไร ฉันควรทราบว่าฉันใช้ OpenGL เฉพาะสำหรับไคลเอนต์ 2D ที่สมบูรณ์ดังนั้นขอโทษที่ฉันไม่รู้ว่านี่เป็นสิ่งที่ชัดเจนมากสำหรับ 3D

นอกจากนี้ยังสับสนเล็กน้อยเกี่ยวกับVSglMatrixMode(GL_PROJECTION)glMatrixMode(GL_MODELVIEW)

คำตอบ:


140

เมทริกซ์เอกลักษณ์ในแง่ของเมทริกซ์การฉายภาพและโมเดลมุมมองโดยพื้นฐานแล้วจะรีเซ็ตเมทริกซ์กลับเป็นสถานะเริ่มต้น

อย่างที่คุณหวังว่าจะรู้glTranslateและglRotateสัมพันธ์กับสถานะปัจจุบันของเมทริกซ์เสมอ ตัวอย่างเช่นหากคุณเรียกglTranslateคุณกำลังแปลจาก 'ตำแหน่ง' ปัจจุบันของเมทริกซ์ไม่ใช่จากจุดเริ่มต้น แต่ถ้าคุณต้องการเริ่มต้นใหม่ที่จุดเริ่มต้นนั่นคือเมื่อคุณโทรglLoadIdentity()จากนั้นคุณสามารถทำได้glTranslateจากเมทริกซ์ซึ่งตอนนี้ตั้งอยู่ที่จุดเริ่มต้นหรือglRotateจากเมทริกซ์ซึ่งตอนนี้มุ่งไปที่ทิศทางเริ่มต้น

ฉันคิดว่าคำตอบของบุญที่ว่ามันเทียบเท่ากับ 1 นั้นไม่ถูกต้อง เมทริกซ์มีลักษณะดังนี้:

1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1

นั่นคือเมทริกซ์เอกลักษณ์ บุญถูกต้องในทางคณิตศาสตร์ว่าเมทริกซ์ใด ๆ ที่คูณด้วยเมทริกซ์นั้น (หรือเมทริกซ์ที่มีลักษณะเช่นนั้นเส้นทแยงมุมอื่น ๆ ทั้งหมด 0s) จะส่งผลให้เมทริกซ์ดั้งเดิม แต่ฉันไม่เชื่อว่าเขาอธิบายว่าเหตุใดจึงสำคัญ

สาเหตุที่สิ่งนี้มีความสำคัญเนื่องจาก OpenGL คูณตำแหน่งและการหมุนเวียนทั้งหมดผ่านแต่ละเมทริกซ์ ดังนั้นเมื่อคุณวาดรูปหลายเหลี่ยม ( glBegin(GL_FACE)บางจุดglEnd()) มันจะแปลเป็น "อวกาศโลก" โดยการคูณด้วย MODELVIEW จากนั้นแปลจาก 3D เป็น 2D โดยการคูณด้วยเมทริกซ์ PROJECT และนั่นก็ทำให้ จุด 2 มิติบนหน้าจอพร้อมกับความลึก (จากหน้าจอ "กล้อง") ซึ่งใช้ในการวาดพิกเซล แต่เมื่อหนึ่งในเมทริกซ์เหล่านี้เป็นเมทริกซ์เอกลักษณ์คะแนนจะถูกคูณด้วยเมทริกซ์เอกลักษณ์ดังนั้นจึงไม่มีการเปลี่ยนแปลงดังนั้นเมทริกซ์จึงไม่มีผล มันไม่ได้แปลคะแนนมันไม่หมุนมันทิ้งไว้ตามที่เป็นอยู่

ฉันหวังว่านี่จะกระจ่างขึ้นอีกนิด!


1
นั่นหมายความว่า OpenGL จะรักษาเมทริกซ์ 'Master' หรือ 'Global' และแต่ละเมทริกซ์ที่ตามมาจะถูกนำไปใช้โดยสัมพันธ์กับเมทริกซ์ 'Master' หรือ 'Global' ฉันถูกไหม?
user366312

42

เมทริกซ์เอกลักษณ์เทียบเท่ากับ 1 สำหรับตัวเลข ที่คุณรู้ว่าจำนวนใด ๆ ที่คูณด้วย 1 เป็นตัวเอง(e.g. A x 1 = A),

( MatrixA x IdentityMatrix = MatrixA)สิ่งเดียวกันจะไปสำหรับเมทริกซ์

ดังนั้นการโหลดเมทริกซ์เอกลักษณ์จึงเป็นวิธีเริ่มต้นเมทริกซ์ของคุณให้อยู่ในสถานะที่ถูกต้องก่อนที่คุณจะคูณเมทริกซ์ต่อไปในเมทริกซ์สแต็ก

glMatrixMode(GL_PROJECTION) : เกี่ยวข้องกับเมทริกซ์ที่ใช้โดยการแปลงมุมมองหรือการแปลงมุมฉาก

glMatrixMode(GL_MODELVIEW): เกี่ยวข้องกับเมทริกซ์ที่ใช้โดยการแปลงมุมมองโมเดล นั่นคือการเปลี่ยนวัตถุของคุณ (aka model) เป็นพื้นที่พิกัดมุมมอง (หรือพื้นที่กล้อง)


7

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

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

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

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

หวังว่าฉันจะได้ส่องแสงบ้าง


2

เมทริกซ์เอกลักษณ์ใช้เพื่อ "เริ่มต้น" เมทริกซ์เป็นค่าเริ่มต้นที่มีเหตุผล

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


0

เพื่อสรุปสิ่งที่คนอื่นพูดเมทริกซ์เอกลักษณ์คือเมทริกซ์ที่เมื่อคุณคูณเวกเตอร์ / เมทริกซ์ด้วยผลลัพธ์ก็คือเวกเตอร์ / เมทริกซ์เดียวกัน มันเทียบเท่ากับเลข 1 ที่มีการคูณหรือเลข 0 พร้อมการบวก

glLoadIdentity () เป็นฟังก์ชันที่เลิกใช้แล้วและคุณควรจัดการเมทริกซ์ของคุณเอง


-1

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.