Đầu tiên, OpenGL sử dụng nhiều hệ tọa độ, do đó không có "hệ thống tọa độ OpenGL". Những gì bạn đang đề cập đến là tọa độ thiết bị chuẩn hóa (NDC), trong đó tất cả ba tọa độ nằm trong khoảng [-1, 1]. Các hệ tọa độ khác nhau và tên của chúng được giải thích here, trong phần "9.011 Các tọa độ được chuyển đổi như thế nào? Các không gian tọa độ khác nhau là gì?". 1)
Thứ hai, để tránh nhầm lẫn, trong OpenGL thuật ngữ "khung nhìn" là phần của cửa sổ bạn đang hiển thị và nằm trong các tọa độ cửa sổ. Trong câu hỏi của bạn, bạn đã sử dụng nó để mô tả phần (l, r, t, b) = (- 500, -500, 1200, 1200) của thế giới của bạn mà bạn muốn kết xuất, đó là tọa độ trên thế giới.
Bạn đã hỏi cách "tính toán vị trí vẽ đối tượng trên màn hình". Những gì bạn cần làm là xác định một phép biến đổi (ma trận 4x4) ánh xạ từ một hệ tọa độ này sang một hệ tọa độ khác. Thế giới 2D của bạn được đưa ra trong các tọa độ thế giới, vì vậy bạn cần xác định ma trận biến đổi tọa độ thế giới thành các NDC, tức là ma trận chiếu. Trong shaders của bạn, bạn chỉ cần nhân các đỉnh của bạn với ma trận chiếu này, và bạn nhận được NDC. glm::ortho
/glOrtho
tính toán ma trận chiếu như vậy. Đối với phép chiếu phối cảnh, không rõ bạn muốn làm gì, nhưng bạn nên thử nghiệm với các hàm perspective
và lookat
trong trạng thái glm.
Để rõ ràng, bạn xác định các đỉnh trong bất kỳ hệ tọa độ nào bạn muốn (được gọi là hệ tọa độ thế giới) và chỉ vẽ các đỉnh này. Công việc của trình tạo đỉnh của bạn là áp dụng phép biến đổi mà bạn đã xác định.
Cũng lưu ý rằng bạn đã chỉ định một hình vuông và thường không phải là thứ bạn muốn. Màn hình và hầu hết các cửa sổ không phải là hình vuông, vì vậy nếu bạn lập bản đồ hình vuông đó trên một khung nhìn điển hình, bạn sẽ có một cái nhìn méo mó về thế giới của bạn. Bạn cần phải nhân tố tỷ lệ khung hình (chiều rộng: chiều cao) của chế độ xem. Tôi đã cố gắng giải thích rằng here.
1) Lưu ý là câu hỏi thường gặp khá cũ và đề cập đến phiên bản OpenGL cổ. Ngày nay, các lập trình viên được mong đợi và khuyến khích để quản lý cả mô hình xem và các ma trận chiếu, vì bạn cần chúng trong các trình đổ bóng của bạn. Tôi rất khuyên bạn nên glm, nó chỉ là tiêu đề, do đó rất dễ tích hợp và có cú pháp tốt đẹp phản chiếu GLSL.
Nếu bạn sử dụng ma trận chiếu bản đồ, chế độ xem có thể và sẽ chỉ bao giờ là 2D vì nó bỏ qua trục Z, đúng không? Đối với hầu hết mọi thứ tôi đang làm đó là tốt, nhưng tôi muốn để có thể thử nghiệm với việc sử dụng trục Z để tạo ra quan điểm ít phẳng trên thế giới 2D. Vậy làm thế nào để bạn xác định ma trận chuyển đổi cho phối cảnh chứ không phải là ortho? Chức năng GL làm gì? – bgroenks
1) Không, nó không bỏ qua trục Z, nó chỉ chiếu mọi thứ với cùng toạ độ xy vào cùng một pixel. Nhưng bạn vẫn có thể thực hiện kiểm tra độ sâu. 2) 'glm :: perspective'. –
Làm thế nào để bạn sử dụng glm :: perspective? Nó tương tác với 'gl_ModelViewProjectionMatrix' như thế nào? – bgroenks