- ระบบพิกัดหน้าจอ / บิตแมป 2D ส่วนใหญ่มีแกน Y บวกที่ชี้ลง (โดยมีจุดเริ่มต้นที่มุมซ้ายบน)
- นี่เป็นสิ่งที่ตรงกันข้ามกับที่คนส่วนใหญ่คิดเชิงเรขาคณิตโดยมีแกน Y บวกชี้ขึ้น (โดยมีจุดกำเนิดอยู่ตรงกลาง)
เกมส่วนใหญ่จัดการระบบพิกัด 2D สองระบบที่ต่างกันได้อย่างไร มีสองประเภทหลักของพิกัด (หน้าจอเทียบกับคาร์ทีเซียน) แต่อาจมีช่องว่างพิกัดที่แตกต่างกันมาก: พื้นที่สไปรท์พื้นที่โลกพื้นที่ดูพื้นที่หน้าจอ ฯลฯ ...
พื้นหลัง:
เดิมทีฉันสร้างพิกัดโลกในเกมของฉันให้ตรงกับแบบแผนการประสานงานหน้าจอ 2 มิติ สิ่งนี้ทำให้เป็นเรื่องธรรมดามากที่จะใช้รูทีนการวาดภาพกราฟิก แต่ปัญหาที่ละเอียดอ่อนเกิดขึ้นเมื่อใช้ฟังก์ชันตรีโกณมิติเช่น atan2 () ผลลัพธ์ของการป้อนพิกัด atan2 () หน้าจอ 2D มีความสับสนอย่างมากเนื่องจาก atan2 () สมมติว่าแกน y บวกขึ้น
ดังนั้นฉันจึงเปลี่ยนพิกัดโลกของฉันให้เป็นไปตามระบบพิกัดคาร์ทีเซียนแบบคลาสสิก (โดยมีจุดเริ่มต้นที่ด้านล่างซ้ายของหน้าจอ) การใช้เหตุผลกับ atan2 () นั้นตรงไปตรงมามากกว่า แต่ตอนนี้การทำเหตุผลประเภทอื่น ๆ ทำได้ยากขึ้น:
- หากฉันคลิกที่หน้าจอที่นี่สิ่งที่สไปรต์อยู่ด้านล่าง
- ฉันคลิกที่เทพดาได้ที่ไหน
- หากสไปรต์ถูกวาดในตำแหน่งที่ไม่ถูกต้องคำนวณอะไรไม่ถูกต้อง พิกัดหน้าจอหรือพิกัดโลก
ฉันรู้ว่าการแปลงจากหน้าจอเป็นพิกัดคาร์ทีเซียนนั้นเกี่ยวข้องกับการปรับขนาดค่า y ด้วย -1 ด้วยการเลือกการแปลค่าทั้งสอง (x, y) ฉันสนใจวิธีปฏิบัติที่ดีที่สุดสำหรับการออกแบบเกม:
- เกมส่วนใหญ่ทำตามระเบียบของหน้าจอการประสานงานและเปลี่ยนความคิดของพวกเขาเกี่ยวกับวิธีการทำงานของ atan2 ()
- การแปลงระบบพิกัดเสร็จสิ้นเมื่อใด? (ใช้เมทริกซ์, OOP abstraction เป็นต้น)
- ที่เก็บสไปรต์ถูกจัดเก็บเป็นศูนย์กลางของสไปรต์หรือมุมใดมุมหนึ่งหรือไม่ ความสูง / ความกว้างของสไปรต์ไปในทิศทาง "ผิด" ดูเหมือนจะเป็นปัญหาทั่วไปเมื่อฉันวาด
แม้ว่าคำถามของฉันจะเกี่ยวกับเกม 2D เป็นหลัก แต่ดูเหมือนว่า OpenGL จะใช้ระบบพิกัดที่แกน Y ชี้ขึ้น ในที่สุด OpenGL จะต้องฉายพิกัด 3D เหล่านั้นลงในระบบพิกัดหน้าจอ 2D บางทีคำแนะนำบางอย่างอาจพบได้ในวิธีการของ OpenGL ...