- Hầu hết các hệ tọa độ màn hình / bitmap 2D đều có trục Y dương hướng xuống (với gốc tọa độ ở góc trên bên trái).
- Điều này trái ngược với cách mà hầu hết mọi người nghĩ về mặt hình học với trục Y dương hướng lên (với gốc tọa độ ở giữa).
Làm thế nào để hầu hết các trò chơi quản lý hai hệ tọa độ 2D khác nhau? Có hai loại tọa độ chính (màn hình so với Cartesian), nhưng có thể có nhiều không gian tọa độ khác nhau: không gian sprite, không gian thế giới, không gian xem, không gian màn hình, v.v ...
Lý lịch:
Ban đầu tôi đã làm cho tọa độ thế giới trong trò chơi của mình khớp với quy ước tọa độ màn hình 2D. Điều này làm cho nó rất tự nhiên khi sử dụng các thói quen vẽ đồ họa, nhưng các vấn đề tinh tế nảy sinh khi sử dụng các hàm lượng giác như atan2 (). Kết quả cho ăn tọa độ màn hình 2D atan2 () rất khó hiểu vì atan2 () giả định trục y dương hướng lên.
Vì vậy, tôi đã thay đổi tọa độ thế giới của mình để theo hệ tọa độ Cartesian cổ điển (với gốc ở phía dưới bên trái màn hình). Lý luận với atan2 () đơn giản hơn nhiều, nhưng bây giờ khó thực hiện các loại lý luận khác:
- Nếu tôi nhấp vào màn hình ở đây, sprite bên dưới là gì?
- Tôi đã nhấp vào sprite đó ở đâu?
- Nếu một sprite được vẽ ở vị trí sai, những gì đã được tính toán không chính xác? Các tọa độ màn hình hay tọa độ thế giới?
Tôi nhận thấy việc chuyển đổi từ màn hình sang tọa độ Descartes chỉ đơn giản là thay đổi giá trị y theo -1 với một bản dịch tùy chọn của cả hai giá trị (x, y). Tôi quan tâm nhiều hơn đến các thực tiễn tốt nhất cho thiết kế trò chơi:
- Có phải hầu hết các trò chơi chỉ gắn bó với quy ước phối hợp màn hình và thay đổi suy nghĩ về cách mọi thứ như atan2 () nên hoạt động?
- Khi nào / làm thế nào để chuyển đổi hệ thống phối hợp được thực hiện? (Sử dụng ma trận, trừu tượng OOP, v.v.)
- Là các vị trí sprite được lưu trữ như là trung tâm của sprite hoặc một trong các góc? Chiều cao / chiều rộng của sprite đi theo hướng "sai" dường như là một vấn đề phổ biến khi tôi vẽ chúng.
Mặc dù câu hỏi của tôi chủ yếu là về các trò chơi 2D, nhưng có vẻ như OpenGL sử dụng hệ thống tọa độ nơi trục Y hướng lên. OpenGL cuối cùng phải chiếu các tọa độ 3D đó lên hệ thống tọa độ màn hình 2D. Có lẽ một số hướng dẫn có thể được tìm thấy trong phương pháp của OpenGL ...