2013-04-21 73 views
14

Tôi hiện đang làm việc để triển khai trình kết xuất đồ họa OpenGL được cung cấp thành công cụ trò chơi 2D.Cách chuyển đổi 2D thế giới sang tọa độ màn hình OpenGL

Vì không gian tọa độ màn hình OpenGL là [-1,1], tôi hơi bối rối về cách nó nên được giao tiếp với một hệ thống phối hợp chung trên toàn thế giới Cartesian 2D.

Giả sử chế độ xem trong thế giới của tôi là [-500, -500] đến [1200, 1200], trong đó [0, 0] là nguồn gốc của thế giới. Tôi chỉ cần dịch và giảm tỷ lệ xuống tọa độ giữa -1 và 1? Hay có một dạng chuyển đổi nào khác cần được thực hiện?

Làm cách nào để tính toán vị trí vẽ đối tượng trên màn hình đã xác định vị trí trong hệ tọa độ của riêng bạn?

Tôi sẽ đánh giá cao giải thích có và không có glOrtho (vì vậy chúng tôi có thể sử dụng trục Z cũng như hiệu ứng phối cảnh).

Trả lời

13

Đầ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 perspectivelookat 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.

+0

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

+0

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'. –

+0

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

1

Sử dụng glOrtho trên ma trận chiếu và sau đó vẽ bình thường. Ví dụ của bạn, tôi đoán bạn muốn glOrtho (0, 1000, 0, 3000, -1, 1) sẽ cung cấp cho bạn chế độ xem 1000 đơn vị chiều rộng và 3000 đơn vị chiều cao

0

Đặt cảnh của bạn theo bất kỳ hệ tọa độ nào bạn muốn. Tôi khuyên bạn nên sử dụng glm (http://glm.g-truc.net/) để khởi tạo ma trận và thực hiện các phép toán vv Vì vậy, bạn có thể có một công cụ đồ thị cảnh, nơi bạn quản lý tất cả các đối tượng trong thế giới 2D/3D của mình. Chỉ cần thiết lập xem và chiếu chính xác trong glm. Trên thực tế, bạn không cần bất kỳ chi tiết triển khai kênh đồ họa nào - vì vậy có thể có một quyết định thiết kế tồi trong công cụ trò chơi của bạn.