Hiểu ma trận chiếu phối cảnh trong OpenGL


7

Đặt ma trận chiếu phối cảnh trong Open GL (bao gồm OpenGL ES 2.0) có định dạng chung sau:

glm::mat4 perspective(float fovy, float aspect, float zNear, float zFar);

Lưu ý hai tham số cuối cùng ; Đầu tiên chỉ định mặt phẳng zNear , là mặt phẳng gần camera hơn. Cái thứ hai chỉ định mặt phẳng zFar ở xa camera.

Một kiến ​​thức phổ biến là, trong OpenGL, những thứ xa hơn, nói cách khác là "sâu hơn vào màn hình", có trục Z âm . Tại sao sau đó tất cả các ví dụ OpenGL, đặt ma trận chiếu phối cảnh (được lấy từ các nguồn đáng tin cậy như OpenGL SuperBible và simmilar) trông giống như hai tham số được đề cập ở trên (zNear, zFar) của chức năng chiếu phối cảnh được hoán đổi?

Ví dụ này được lấy từ webiste GLM (OpenGL Math) :

glm::mat4 Projection = glm::perspective(45.0f, 4.0f / 3.0f, 0.1f, 100.f); 

Bạn có thể thấy rằng tham số zNear thực sự nằm xa camera hơn so với tham số zFar, gần hơn 100 điểm so với camera / trình xem.

Bạn có thể cung cấp giải thích dễ hiểu , xin vui lòng? Tôi không chỉ là một mà là tất cả các ví dụ, vượt qua zFar với giá trị dương cao hơn zNear. Cảm ơn.


Ví dụ của tôi:

Trong mã của tôi, khi tôi đặt:

glm::mat4 Projection = glm::perspective(45.0f, 4.0f / 3.0f, 1000.0f, -500.0f); 

Tôi giả sử sự thất vọng của tôi là 1000 điểm theo hướng z dương500 điểm theo hướng âm z .

Khi tôi đặt những thứ như thế này, tôi có thể thấy ít nhất một số đối tượng, mặc dù mọi thứ không hoàn hảo: vì một số lý do tôi chỉ thấy các đối tượng được định vị trên tọa độ z âm.

Điều này có thể liên quan đến sự hiểu biết không chính xác của tôi về chức năng chiếu phối cảnh.


1
bởi vì zNear và zFar chỉ định khoảng cách các mặt phẳng từ máy ảnh, không phải vị trí của chúng ... hoặc tôi hiểu nhầm câu hỏi của bạn?
jeffythedragonslayer

@da mã khỉ: +1, không phải bạn không hiểu lầm gì cả. Vì vậy, bạn nói, hai tham số được đề cập ở trên không chứa tọa độ mặt phẳng vật lý, nhưng chúng đại diện cho các giá trị bù từ máy ảnh. Nếu máy ảnh được di chuyển, sự thất vọng theo sau nó. Điều này cần được nhấn mạnh trong sách OpenGL.
Bunkai.Satori

Nó được phát âm khá rõ ràng trong hầu hết các cuốn sách đó; Bạn có ví dụ cụ thể về các đoạn chỉ ra rằng các giá trị là tuyệt đối không?

Cũng không nên chỉ đơn giản là theo quy ước rằng những thứ "sâu hơn" có chiều sâu "tiêu cực hơn". Bạn có thể sắp xếp nó theo cách bạn muốn.

@da code khỉ: Nếu bạn muốn, hãy gõ lại câu trả lời của bạn như một câu trả lời thường xuyên vào chủ đề này. Sau đó, tôi sẽ có thể đánh dấu nó là Câu trả lời được chấp nhận . Cảm ơn đã giúp đỡ, tôi đã có rất nhiều đau đầu từ việc này.
Bunkai.Satori

Câu trả lời:


5

Phương thức trong câu hỏi ( glm::perspective) và ilk của nó về cơ bản là các hàm bao hoặc triển khai lại gluPers perspective . Như bạn có thể thấy từ tài liệu của hàm đó, các giá trị gần / xa là khoảng cách từ mặt phẳng khung nhìn và luôn dương.


+1 cho câu trả lời hữu ích. Xin chào Josh, và cảm ơn đã làm rõ. Đó là sự giải thích sai của tôi về văn bản. Nhân tiện, kiến ​​thức này là chìa khóa để giải quyết hành vi không thể đo lường được của đồ họa OpenGL của tôi. Vì không có gì để thêm, hãy để tôi đánh dấu đây là Câu trả lời được chấp nhận .
Bunkai.Satori
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.