2010-02-18 38 views
13

Tôi đang làm việc trên một vấn đề về thị lực máy tính đòi hỏi phải vẽ một mô hình 3D bằng cách sử dụng máy ảnh được hiệu chỉnh. Tôi đang viết một chức năng phá vỡ ma trận máy ảnh đã hiệu chuẩn thành ma trận modelview và ma trận chiếu, nhưng tôi đã chạy vào một hiện tượng thú vị trong opengl mà bất chấp sự giải thích (ít nhất là bởi tôi).Tại sao ký hiệu trong ma trận chiếu opengl

Mô tả ngắn gọn là phủ nhận ma trận chiếu dẫn đến kết quả không có gì được hiển thị (ít nhất là theo kinh nghiệm của tôi). Tôi hy vọng rằng nhân ma trận chiếu bằng bất kỳ vô hướng nào sẽ không có hiệu lực, bởi vì nó biến đổi các tọa độ thuần nhất, không bị ảnh hưởng bởi việc nhân rộng.

Dưới đây là lý do tại sao tôi thấy điều này là bất ngờ; có lẽ ai đó có thể chỉ ra nơi mà lý luận của tôi là thiếu sót.

Hãy tưởng tượng ma trận chiếu quan điểm sau đây, mà sẽ cho kết quả chính xác:

[ a b c 0 ] 
P = [ 0 d e 0 ] 
    [ 0 0 f g ] 
    [ 0 0 h 0 ] 

Nhân này bằng camera phối cho đoạn đồng nhất phối:

[x_c] [ a b c 0 ] [X_e] 
[y_c] = [ 0 d e 0 ] * [Y_e] 
[z_c] [ 0 0 f g ] [Z_e] 
[w_c] [ 0 0 h 0 ] [W_e] 

Cuối cùng, để có được tọa độ thiết bị bình thường, chúng tôi chia x_c, y_c và z_c theo w_c:

[x_n] [x_c/w_c] 
[y_n] = [y_c/w_c] 
[z_n] [z_c/w_c] 

Bây giờ, nếu chúng ta phủ định P, tọa độ clip kết quả sẽ bị loại bỏ, nhưng vì chúng là các tọa độ đồng nhất, nhân với bất kỳ vô hướng nào (ví dụ: -1) sẽ không ảnh hưởng đến tọa độ thiết bị chuẩn hóa. Tuy nhiên, trong openGl, phủ nhận kết quả P không có gì được hiển thị. Tôi có thể nhân P với bất kỳ vô hướng âm nào và nhận được kết quả tương tự chính xác, nhưng ngay sau khi nhân với một vô hướng âm, không có gì ám. Chuyện gì đang xảy ra ở đây??

Cảm ơn!

Trả lời

10

Vâng, ý chính của nó được rằng cắt thử nghiệm được thực hiện thông qua:

-w_c < x_c < w_c 
-w_c < y_c < w_c 
-w_c < z_c < w_c 

Nhân với một phá vỡ giá trị âm kiểm tra này.

+1

Câu trả lời hay! Tôi cho rằng thử nghiệm cắt sẽ là: -1

2

Tôi chỉ tìm thấy miếng ngon này, mà làm cho tiến bộ về một câu trả lời:

Từ Sổ đỏ, phụ lục G:

Tránh sử dụng tiêu cực w đỉnh phối và tọa độ texture q tiêu cực. OpenGL có thể không nén các tọa độ như vậy một cách chính xác và có thể tạo ra các lỗi nội suy khi tô bóng các nguyên thủy được xác định bởi các tọa độ như vậy.

Đảo ngược ma trận chiếu sẽ dẫn đến phối hợp cắt xén âm, và rõ ràng là opengl không thích điều này. Nhưng bất cứ ai có thể giải thích TẠI SAO opengl không xử lý trường hợp này?

tham khảo: http://glprogramming.com/red/appendixg.html

0

Lý do tôi có thể nghĩ:

  • Bằng cách đảo ngược những ma trận chiếu, tọa độ sẽ không còn nằm trong phạm vi zNear và zFar của bạn máy bay của frustum view (nhất thiết phải lớn hơn 0).
  • Để tạo tọa độ cửa sổ, tọa độ thiết bị được chuẩn hóa được dịch/thu nhỏ theo chế độ xem. Vì vậy, nếu bạn đã sử dụng một vô hướng âm cho tọa độ clip, tọa độ thiết bị chuẩn hóa (bây giờ ngược) dịch khung nhìn thành các tọa độ cửa sổ ... tắt khỏi cửa sổ của bạn (sang bên trái và bên dưới, nếu bạn muốn)

Ngoài ra, vì bạn đã đề cập sử dụng ma trận máy ảnh và bạn đã đảo ngược ma trận chiếu, tôi phải hỏi ... bạn sẽ áp dụng ma trận nào từ ma trận máy ảnh? Hoạt động trên ma trận chiếu tiết kiệm gần/xa/fovy/khía cạnh gây ra tất cả các loại vấn đề trong bộ đệm sâu bao gồm bất cứ điều gì có sử dụng z (kiểm tra độ sâu, mặt culling, vv).

Phần Câu hỏi thường gặp về OpenGL trên transformations có một số chi tiết khác.

+0

Sau khi chuyển đổi từ đồng nhất sang tọa độ không đồng nhất (tức là bằng cách chia cho w_c), tọa độ vẫn nằm giữa zNear và zFar, vì dấu âm của w_c hủy bỏ dấu đảo ngược của {x, y, z} _c. vì vậy tôi nghĩ rằng đây không phải là nó. Vì lý do tương tự, các tọa độ thiết bị chuẩn hóa, trên thực tế, cũng không đảo ngược. Tôi chỉ sử dụng ma trận chiếu cho các thông số máy ảnh nội tại (fovy, khía cạnh, trục nghiêng, v.v ...); các tham số bên ngoài đang đi vào ma trận modelview. Vì vậy, tôi nghĩ rằng đây không phải là vấn đề. –

+0

Tôi không biết chi tiết triển khai trình điều khiển nhưng tôi đoán đó không phải là trường hợp của zNear và zFar. Thử nghiệm clip có thể không có phạm vi nhưng độ sâu và do đó giá trị số được kiểm tra lớn hơn zNear (yêu cầu tích cực ở vị trí đầu tiên). Nếu toàn bộ hệ tọa độ và ma trận bị đảo ngược, phép thử không thành công như bahbar được chỉ ra. – charstar

Các vấn đề liên quan