Mục đích của khối lượng xem chính tắc là gì?


15

Tôi hiện đang học OpenGL và chưa thể tìm thấy câu trả lời cho câu hỏi này.

Sau khi ma trận chiếu được áp dụng cho không gian xem, không gian xem được "chuẩn hóa" để tất cả các điểm nằm trong phạm vi [-1, 1]. Điều này thường được gọi là "khối lượng xem chính tắc" hoặc "tọa độ thiết bị chuẩn hóa".

Trong khi tôi đã tìm thấy nhiều tài nguyên cho tôi biết về việc này xảy ra như thế nào, tôi chưa thấy gì về lý do tại sao nó xảy ra.

Mục đích của bước này là gì?

Câu trả lời:


7

Điều quan trọng nhất là nó chuyển đổi các điểm (đỉnh) của bạn từ không gian thế giới 3D sang không gian màn hình 2D.

Điều đó có nghĩa là sau khi đỉnh được nhân với ma trận X và Y này là vị trí trên màn hình (giữa [-1, 1]) và Z là độ sâu. Z được sử dụng cho bộ đệm sâu và xác định khoảng cách đỉnh (hoặc đoạn) từ máy ảnh của bạn gần mặt phẳng.

Chiếu có nghĩa là các đỉnh nằm gần mặt phẳng gần hơn ở xa giữa màn hình -> tam giác gần camera hơn dường như lớn hơn so với mặt phẳng. Và điều này dựa trên trường quan sát của bạn - bạn đang nhập nó vào một số hàm createdProjectionMatrix hoặc createdFrustum. Nó hoạt động mà nó cắt và chia tỷ lệ máy ảnh của bạn và các đỉnh trong nó thành khối lập phương. Các giá trị lớn hơn 1 và nhỏ hơn -1 không được hiển thị.

Cũng giữ tỷ lệ khung hình pixel, vì vậy pixel có thể là sqaure. Điều đó thật đơn giản. Nó chỉ làm hỏng máy ảnh như thế này: màn hình rộng hơn -> cắt dọc hơn và ngược lại.

Câu trả lời đơn giản:
Nó xác định sự thất vọng máy ảnh của bạn và tốt cho:

  • làm cho các vật ở gần bạn trông to hơn các vật ở xa bạn.
  • giữ tỷ lệ khung hình pixel - Mọi người đều thích pixel vuông phải không? :)

Tôi không thấy bất kỳ phần nào mà anh ta hỏi ma trận chiếu làm gì. Anh ta dường như tự hỏi tọa độ thiết bị chuẩn hóa là để làm gì.
Chris nói Phục hồi lại

Các ma trận chiếu xác định frustum camera. Nhưng điều này không giải thích lý do có [-1,1] là âm lượng xem chuẩn. Tại sao không có [-100,100] thay thế?
bobobobo

1
bởi vì 1 là "số phổ biến hơn" 100: D (0 thậm chí còn phổ biến hơn, nhưng khối 0x0x0 không thú vị lắm ...)
Ivan Kuckir

5

Câu trả lời này là rất lâu sau khi thực tế, nhưng vì tôi tìm thấy điều này trên google có lẽ điều này vẫn sẽ giúp được ai đó. Tôi chỉ muốn làm rõ những gì JasonD và Notabene đang nói: Việc thực hiện các phép tính cắt sẽ dễ dàng hơn rất nhiều (tìm ra những gì bạn nên thấy và những gì bạn không nên nhìn vì cách bạn đang nhìn, cách đó bao xa, ect .). Thay vì kiểm tra xem mọi thứ có giao nhau với các mặt phẳng trên đường viền của chế độ xem không, bạn chỉ cần so sánh x, y, z của mọi thứ với xMax, xMin, yMax, ect. , vì bạn chỉ đơn giản là có một khối lập phương. Nó phức tạp hơn một chút nếu bạn muốn chỉ có một phần của một cái gì đó hiển thị, nhưng toán học vẫn tốt hơn với một khối đơn vị hơn là với một sự thất vọng.

Một vài điều tôi thấy sai lệch trong các câu trả lời khác:

-Bạn không cắt các mặt của chế độ xem, bạn sắp xếp nó thành một khối bằng cách sử dụng các phép biến đổi ma trận đồng nhất.

-Chúng tôi không chuyển đổi sang màn hình 2D với bước này. Bước này không cần thiết để làm như vậy. Về mặt lý thuyết, chúng ta có thể thực hiện tất cả công việc của mình mà không cần chuyển đổi sự thất vọng thành khối lập phương, điều này sẽ trực quan hơn nhưng toán học khó hơn - nhưng đồ họa là tất cả về việc tính toán rất nhanh vì có rất nhiều phép tính mỗi giây cho trò chơi trung bình / bất cứ điều gì.

Chi tiết hơn: Nó không nhất thiết phải là một khối đơn vị mà chúng tôi đang chuyển đổi, nó chỉ phải là một hộp hình chữ nhật để các phép tính tối đa của chúng tôi hoạt động. Trong thực tế trong lớp, chúng tôi đã sử dụng một hộp trong đó máy ảnh quay xuống trục z, z đi từ 0 đến 1, x đi từ -1 đến 1 và y đi từ -1 đến 1. Nói chung trong toán 1, 0, và -1 là những con số tốt để thực hiện các phép tính dễ dàng hơn, tôi cho rằng đó là lý do tại sao chúng ta không đi từ -100 đến 100 hoặc một cái gì đó.

TLDR: Nó làm cho việc cắt dễ dàng hơn.

Chỉnh sửa: bobobobo có ý chính của nó. Tất cả mọi thứ là hình tam giác, nói chung: D.

Nguồn: Tham gia lớp học đồ họa đại học


Trong khi thú vị, có vẻ như điểm của bạn là một phần đúng. Bạn không sử dụng ma trận đồng nhất, chỉ là trong không gian clip, các điểm được xác định trong không gian đồng nhất. 2) đúng, ponts không gian clip chưa được chiếu lên màn hình. Nó xảy ra sau khi phân chia phối cảnh, mặc dù lưu ý rằng điều này nhất thiết xảy ra khi bạn quay lại từ không gian clip trở lại không gian cartesian. 3) có và không. Chuyển đổi tọa độ điểm sang không gian NDC vẫn cần thiết. Điều không cần thiết là không gian clip, dành riêng cho GPU. ...
user18490 7/1/2015

... Đó là giai đoạn không gian clip không cần thiết, không phải là ánh xạ lại cho khối đơn vị. Giả định cuối cùng của bạn cũng không đúng. Bạn sắp xếp lại thành -1 đến 1 vì sau đó dễ dàng hơn từ không gian NDC sang không gian raster (biến đổi chế độ xem). Nó thực sự thậm chí còn dễ dàng hơn nếu không gian NDC của bạn nằm trong phạm vi [0,1], đây là trường hợp thực hiện. Cuối cùng, tất cả đều là toán học, vì vậy chắc chắn các quy ước khác có thể được sử dụng. xem trang web Scratchapixel tốt để biết thêm chi tiết.
dùng18490


1

Tôi tin rằng điều này là do OpenGL không thể đưa ra các giả định về cách hiển thị hình ảnh (tỷ lệ khung hình hoặc độ phân giải, chi tiết phần cứng, v.v.). Nó kết xuất và hình ảnh thành một hình thức trung gian mà hệ điều hành hoặc trình điều khiển hoặc bất kỳ tỷ lệ nào có độ phân giải / kích thước chính xác.


Bạn không chính xác khi bạn đang xem xét chi tiết về phần cứng. Có không. Ngoài ra nếu bạn đang viết rastarizator của riêng bạn trên cpu (tại sao phải làm điều đó? Để tìm hiểu cách thức hoạt động của công cụ này :)) bạn đang sử dụng ma trận giống như trên gpu. Bạn thật may mắn vì tôi vẫn không có quyền riêng tư để bỏ phiếu :)
Notabene

Có cần phải biết tỷ lệ khung hình không? Theo những gì tôi hiểu, nó lưu trữ các yếu tố tỷ lệ cho X và Y để hình ảnh sẽ có tỷ lệ khung hình chính xác sau này.
Breadjesus

3
Sửa lỗi cho tôi nếu tôi sai, nhưng anh ấy đang nói về sau khi bạn chiếu điểm, và do đó chúng tôi đang nói chuyện 2D. Nếu đây là trường hợp, thì OpenGL không biết bạn đang đặt hình ảnh này ở đâu trên màn hình, cũng như về cách nó sẽ được hiển thị. Nó tạo ra một hình ảnh sau đó dễ dàng chia tỷ lệ và đặt chính xác, nhưng nó không làm điều đó cho bạn. Tôi đồng ý rằng các chi tiết phần cứng là một tên xấu cho nó, tôi chỉ đơn giản có nghĩa là ở trên. Ngoài ra, bạn có thể chỉ định ma trận chiếu với tỷ lệ khung hình, nhưng tỷ lệ đó không nhất thiết phải giống với màn hình của bạn.
Chewy Gumball

3
Tôi phải nói rằng tôi thực sự thích cuộc trò chuyện này. Bạn đang ở gần để được đúng. Hãy đi sâu hơn. Không có hình ảnh sau các đỉnh nhân của projMat. Kết quả chỉ là thiết lập điểm 2D với độ sâu. Hơn rastarization bắt đầu và nó tạo ra hình ảnh. . Và tỷ lệ khung hình đặt các điểm nên được "thu nhỏ" thành các giá trị lớn hơn 1 hoặc nhỏ hơn -1 và chúng sẽ không được hiển thị.
Notabene

2
À! Tôi thấy vấn đề ở đây. Ông nói "Điều này thường được gọi là" khối lượng xem chính tắc "hoặc" tọa độ thiết bị chuẩn hóa "." Tôi đã trả lời như thể anh ta đang hỏi về tọa độ thiết bị được chuẩn hóa, tuy nhiên anh ta thực sự không hỏi về những thứ đó. Thực tế, chúng là hai thứ hoàn toàn khác nhau và đó là lý do tại sao chúng ta bất hòa ở đây. Có lẽ điều đó nên được làm rõ để mọi người không mắc phải sai lầm tương tự tôi đã làm.
Chewy Gumball

1

Tôi lưu ý rằng một câu trả lời đã được chấp nhận, nhưng nói chung nó rất hữu ích cho việc cắt xén để biến chế độ xem thành một khối đơn vị.


Đúng, tôi ít chỉnh sửa câu trả lời của mình để rõ hơn về điều này.
Notabene

Nhân tiện, một khối đơn vị là một khối bên 1. Vì vậy, tên không phù hợp. Nó nên được gọi là khối lượng xem chính tắc thay thế.
dùng18490

1

Tôi cũng đã tự hỏi điều này. Có một vài điều cần xem xét.

Đầu tiên, vâng, mọi thứ trên thế giới đều được chuyển thành khối đơn vị đó [-1,1] xoay quanh gốc tọa độ. Nếu một cái gì đó không có trong khối đơn vị đó thì nó sẽ không được hiển thị.

Điều tốt đẹp về điều này là bây giờ, bạn có thể loại bỏ các hình tam giác khá dễ dàng. (Nếu cả 3 đỉnh của một tam giác đều có x > 1hoặc x < -1thì tam giác đó có thể được loại bỏ).


0

Tôi khuyên bạn nên kiểm tra bài học về ma trận chiếu phối cảnh trên Scratchapixel

http://www.scratchapixel.com/lessons/3d-basic-rendering/pers perspective-and -orthographic-projection-gramrix / build-basic -pers perspective-projection-gramrix

Nó giải thích rõ ràng rằng lý do tại sao phải làm cong không gian của khung nhìn thành một khối đơn vị. Tại sao? Về cơ bản là do quá trình chiếu các điểm 3D trên khung vẽ có liên quan để chuyển đổi không gian NDC của chúng, đó là khoảng trống trong đó các điểm trên màn hình được ánh xạ lại trong phạm vi [-1,1] (giả sử màn hình là hình vuông). Bây giờ chúng tôi cũng sắp xếp lại tọa độ điểm Z thành phạm vi [0,1] (hoặc đôi khi [-1,1]) do đó cuối cùng bạn kết thúc với một khối lập phương. Thực tế là khi các điểm được chứa trong một khối lập phương, việc xử lý chúng sẽ dễ dàng hơn so với khi chúng được xác định trong chế độ xem bực bội (đó là một không gian kỳ lạ, một kim tự tháp bị cắt cụt). Một lý do khác là nó mang lại tất cả các loại chuyển đổi phóng chiếu mà bạn có thể tưởng tượng trong CG đến cùng một không gian (khối lập phương đơn vị). Vì vậy, bất kể bạn sử dụng phối cảnh hay hình chiếu chính tả chẳng hạn,

Mặc dù có lẽ bạn tập trung quá nhiều vào lý do tại sao. Khối đơn vị thực sự chỉ là kết quả của quá trình toán học liên quan hoặc được sử dụng để chiếu các đỉnh lên màn hình và sau đó ánh xạ lại tọa độ của chúng vào không gian raster.

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.