Có một số nhầm lẫn ở đây.
OpenGL phù hợp với không gian đối tượng và không gian thế giới.
Nhưng trong không gian cửa sổ (hay còn gọi là không gian màn hình), chúng ta đột nhiên thuận tay trái .
Làm thế nào điều này xảy ra ?
Cách chúng ta chuyển từ tay phải sang tay trái là một mục nhập tỷ lệ z âm trong ma trận glOrtho
hoặc glFrustum
ma trận chiếu. Chia tỉ lệ z bằng -1 (trong khi vẫn giữ nguyên x và y) có tác dụng thay đổi độ thuận của hệ tọa độ.
Đối với glFrustum,
xa và gần được cho là tích cực, với xa > gần . Nói xa = 1000 và nói gần = 1. Khi đó C = - (1001) / (999) = -1,002.
Xem tại đây để biết thêm chi tiết và sơ đồ.
Từ góc độ trực quan , glOrtho tạo ra một ma trận như sau:
Ở đây, trái , phải , dưới và trên chỉ là tọa độ cho các mặt phẳng cắt ngang trái , dọc phải , ngang dưới , trên cùng (tương ứng) .
Các gần và xa máy bay, tuy nhiên, được quy định khác nhau . Các gần tham số được định nghĩa là
- Gần: Khoảng cách đến mặt phẳng cắt độ sâu gần hơn. Khoảng cách này là âm nếu máy bay ở phía sau người xem.
và xa:
- zFar Khoảng cách đến mặt phẳng cắt độ sâu xa hơn. Khoảng cách này là âm nếu máy bay ở phía sau người xem.
Ở đây chúng tôi có một lượng chế độ xem chuẩn điển hình
Vì cấp số nhân của z là (-2 / (xa-gần)), nên dấu trừ sẽ chia z thành -1 . Điều này có nghĩa là "z" được quay sang trái trong quá trình chuyển đổi chế độ xem, hầu hết mọi người không biết vì họ chỉ làm việc trong OpenGL như một hệ tọa độ "thuận tay phải".
Vì vậy, nếu bạn gọi
glOrthof(-1, 1, -1, 1, 10, -10) ; // near=10, FAR=-10,
Khi đó KẾ HOẠCH GẦN hơn bạn 10 đơn vị . Bạn ở đâu? Tại sao, tại điểm gốc, với trục x ở bên phải, trục y ở trên đầu và mũi của bạn hướng xuống trục z âm (đó là mặc định "Theo mặc định, máy ảnh được đặt ở điểm gốc , hướng xuống trục z âm và có vectơ hướng lên là (0, 1, 0). " ). Vậy mặt phẳng gần nhất là z = -10. Máy bay xa sau bạn 10 đơn vị, tại z = + 10 .