สามารถทำได้โดยการใช้ชุดคำสั่ง glTranslate, glRotate (ซึ่งแสดงถึงตำแหน่งและการวางแนวของกล้อง) ก่อนที่จะวาดฉาก (ในทางเทคนิคแล้ว คุณจะหมุนทั้งฉาก!)
มีฟังก์ชั่นยูทิลิตี้เช่น gluLookAt ซึ่งเรียงลำดับรายละเอียดบางอย่างเกี่ยวกับเรื่องนี้
เพื่อให้สิ่งต่าง ๆ ดูเรียบง่าย สมมติว่าคุณมีเวกเตอร์สองตัวที่แสดงถึงกล้องของคุณ: ตำแหน่งและทิศทาง
gluLookAt รับตำแหน่ง ปลายทาง และเวกเตอร์ขึ้น
หากคุณใช้คลาสเวกเตอร์ destinaion = position + direction
ควรให้จุดปลายทางแก่คุณ
อีกครั้งเพื่อทำให้ทุกอย่างง่ายขึ้น คุณสามารถถือว่าเวกเตอร์ขึ้นเป็น (0,1,0) เสมอ
จากนั้น ก่อนที่จะเรนเดอร์สิ่งใดๆ ในฉากของคุณ ให้โหลดเมทริกซ์เอกลักษณ์และเรียก gluLookAt
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt( source.x, source.y, source.z, destination.x, destination.y, destination.z, 0, 1, 0 );
จากนั้นเริ่มวาดวัตถุของคุณ
คุณสามารถปล่อยให้ผู้ใช้ขยายได้โดยเปลี่ยนตำแหน่งไปทางขวาหรือซ้ายเล็กน้อย การหมุนจะซับซ้อนกว่าเล็กน้อยเนื่องจากคุณต้องหมุนเวกเตอร์ทิศทาง สมมติว่าสิ่งที่คุณหมุนคือกล้อง ไม่ใช่วัตถุในฉาก
ปัญหาหนึ่งคือ หากคุณมีเพียงเวกเตอร์ทิศทาง "ไปข้างหน้า" คุณจะเคลื่อนมันอย่างไร ซ้ายและขวาอยู่ที่ไหน?
แนวทางของฉันในกรณีนี้คือหาผลคูณไขว้ของ "ทิศทาง" และ (0,1,0)
ตอนนี้คุณสามารถเลื่อนกล้องไปทางซ้ายและขวาได้โดยใช้สิ่งต่อไปนี้
position = position + right * amount; //amount < 0 moves to the left
คุณสามารถเคลื่อนที่ไปข้างหน้าได้โดยใช้ "เวกเตอร์ทิศทาง" แต่ IMO จะเป็นการดีกว่าถ้าจำกัดการเคลื่อนที่ให้อยู่ในระนาบแนวนอน ดังนั้นให้หาเวกเตอร์ไปข้างหน้าในลักษณะเดียวกับที่เราได้เวกเตอร์ที่ถูกต้อง:
forward = cross( up, right )
พูดตามตรง นี่เป็นแนวทางที่ค่อนข้างแฮ็ก
แนวทางที่เหมาะสมคือการใช้โครงสร้างข้อมูลที่ "ซับซ้อน" มากขึ้นเพื่อแสดง "การวางแนว" ของกล้อง ไม่ใช่แค่ทิศทางไปข้างหน้า อย่างไรก็ตาม เนื่องจากคุณเพิ่งเริ่มต้น จึงเป็นการดีที่จะดำเนินการทีละขั้น
person
hasen
schedule
25.02.2009