Tại sao không gian clip trong OpenGL có 4 chiều?


13

Tôi sẽ sử dụng tài liệu này như một tài liệu tham khảo chung, nhưng càng nhiều trình duyệt tài liệu và sách trực tuyến, tôi càng không hiểu về điều này.

const float vertexPositions[] = {
    0.75f, 0.75f, 0.0f, 1.0f,
    0.75f, -0.75f, 0.0f, 1.0f,
    -0.75f, -0.75f, 0.0f, 1.0f,
};

trong cuốn sách trực tuyến này có một ví dụ về cách vẽ thế giới xin chào đầu tiên và cổ điển cho OpenGL về việc tạo ra một hình tam giác.

Cấu trúc đỉnh cho tam giác được khai báo như đã nêu trong đoạn mã trên.

Cuốn sách, như tất cả các nguồn khác về điều này, nhấn mạnh rằng Clip Space là cấu trúc 4D được sử dụng để quyết định về cơ bản những gì sẽ được rasterized và hiển thị trên màn hình.

Ở đây tôi có câu hỏi của tôi:

  • Tôi không thể tưởng tượng điều gì trong 4D, tôi không nghĩ rằng một con người có thể làm điều đó, 4D là gì cho không gian Clip này?
  • tài liệu dễ đọc nhất mà con người tôi đã đọc nói về một chiếc máy ảnh, nó chỉ là một sự trừu tượng hóa về khái niệm cắt, và tôi hiểu rằng, vấn đề là tại sao không sử dụng khái niệm máy ảnh ở nơi đầu tiên Cấu trúc 3D quen thuộc? Vấn đề duy nhất với khái niệm máy ảnh là bạn cần xác định triển vọng theo cách khác và do đó về cơ bản bạn phải thêm một tuyên bố khác về loại máy ảnh bạn muốn có.
  • Làm thế nào tôi phải đọc nó 0.75f, 0.75f, 0.0f, 1.0f? Tất cả những gì tôi nhận được là tất cả chúng đều là giá trị float và tôi hiểu ý nghĩa của 3 giá trị đầu tiên, ý nghĩa của cái cuối cùng là gì?

4
Chương 4 giải thích chính xác những gì thành phần thứ tư làm. Thật ra, gãi mà; Chương 1 giải thích biến đổi clip-NDC trong phần rasterization xuống một nửa .
Nicol Bolas

2
@NicolBolas tác giả đưa ra lời giải thích của mình trong chương đầu tiên và không đưa ra bất kỳ tài liệu tham khảo nào cho các chương tiếp theo, anh ta cũng giả vờ giải thích những gì xảy ra tiếp theo khi bình luận một số mã c ++ và vấn đề là nếu anh ta không giải thích đầy đủ mọi thứ trong chương 1 không có ý nghĩa gì khi đặt những gì tôi phải biết ở vị trí đầu tiên trong chương số 4, đặc biệt là nếu tôi cần khái niệm này để giải mã những gì bên trong chương 1. Tôi đang đọc điều này bây giờ, và không chỉ 1 lần, bây giờ tôi biết rằng tôi phải tìm kiếm thêm câu trả lời, tôi sẽ đi qua các chương khác nhau.
dùng827992

1
Bạn không cần phải giải mã bất cứ điều gì; nó nói trong chương 1: Thành phần W được chia thành 3 thành phần khác. Điều này cũng được nêu trong phần giới thiệu. Những gì được đưa ra cho đến chương 4 là lý do tại sao OpenGL làm điều này. Điều đó bị trì hoãn cho đến sau này vì nó không liên quan đến nhiệm vụ trong tay.
Nicol Bolas

3
Nó vẫn sẽ là thông tin không liên quan cho vấn đề hiện tại (ví dụ: hiển thị một hình tam giác). Bạn tò mò về nó, nhưng bạn không cần phải hiểu tại sao nó là cách để hiểu rằng đây là cách nó hoạt động. Trong việc học bất cứ điều gì, bước đầu tiên là hiểu nó là gì. Một khi bạn hiểu những gì đang diễn ra, thì một cuộc thảo luận có thể diễn ra về lý do tại sao nó lại như vậy.
Nicol Bolas

1
Câu trả lời này có thể giúp.
iammilind

Câu trả lời:


9

Thuật ngữ ma thuật là "Tọa độ đồng nhất" được sử dụng trong các hệ thống trong đó tính thuyết phục là một yếu tố. Kiểm tra wiki để biết tổng quan, nhưng đó là một quá trình nghiên cứu dài để thực sự hiểu về nó (mà tôi không biết).


10

Đọc phần giới thiệu những cuốn sách bạn đọc, bạn sẽ ngạc nhiên;)

http://arcsynthesis.org/gltut/Basics/Intro%20Graphics%20and%20Rendering.html dưới Rasterization Tổng quan

Giá trị "w" (trong đó 3 giá trị đầu tiên là x, y và z) về cơ bản cho biết kích thước của không gian clip là gì. Vì đây là 1 giá trị vô hướng, cả 3 chiều của không gian clip đều bằng nhau (và đó là lý do tại sao không gian clip là một khối). Mỗi đỉnh đều có không gian clip riêng mà nó tồn tại (và về cơ bản cần phải "khớp" vào, nếu không thì CLIPS: D), không có 1 "thế giới" nào là không gian clip (mặc dù tất cả các không gian clip đều giống nhau " thế giới "Tôi nghĩ, ngay cả tôi cũng gặp rắc rối với điều này; P).

Vì vậy, nếu đỉnh của bạn có ví dụ tọa độ [1,1,1], nếu không gian clip là 1 thì đỉnh nằm ở góc trên bên phải gần góc màn hình (khi tất cả là mặc định, tôi không biết nếu chỉ đường có thể thay đổi). Nhưng nếu đỉnh có không gian clip là 2, thì tọa độ [1,1,1] sẽ ở đâu đó, giả sử, 3 phần tư trên màn hình ở bên phải, 3 phần tư trên màn hình ở trên cùng và chiều thứ ba bạn có thể tự đoán.

Tôi nghĩ rằng giả sử không gian clip là 5 sẽ có nghĩa là các vị trí trong không gian clip đó nằm trong phạm vi từ -5 đến 5 trên mọi chiều, thay vì khối lập phương là 5x5x5. Nhưng đó có lẽ là vì đơn giản chỉ cần đặt: tất cả các tọa độ xy và z được chia cho kích thước không gian clip, vì vậy về cơ bản các đỉnh của bạn trải qua điều này:

x = x / w

y = y / w

z = z / w

Và đó là những gì làm cho tất cả có thể. Tôi nghĩ lý do này tồn tại là để so sánh dễ dàng. Nếu tọa độ được chia cho kích thước không gian clip, thì tọa độ có 1 hoặc nhiều thành phần có giá trị cao hơn 1, tồn tại bên ngoài không gian clip. Vì vậy, nếu không gian clip của bạn là giả sử 1024, nhưng tọa độ là [2000,3, -100] thì thành phần x (2000) nằm ngoài không gian clip (chỉ nằm trong khoảng từ -1024 đến 1024).

bằng máy tính, thật dễ dàng để biết liệu có thứ gì đó nằm trong không gian clip hay không nếu tất cả những gì bạn phải làm là (rất thô lỗ): (x / w) <1 && (x / w)> - 1 sau đó kết xuất. Ngoài ra, tôi cho rằng có tất cả các không gian clip của tất cả các đỉnh có cùng kích thước (vì vậy mọi khối không gian clip nằm trong khoảng từ -1 đến 1 ở mọi chiều) sẽ giúp dễ dàng hơn cho mọi thứ xuất hiện sau quá trình chuẩn hóa, nhìn từ thời điểm đó trên tất cả các tọa độ là số phao dao động từ 0 đến 1 (không tính đến cái đã bị cắt).


Câu hỏi đặt ra là tại sao clip-space lại như vậy, không phải là không gian clip nghĩa là gì. Đó là, điểm của sự phân chia W.
Nicol Bolas

2
Nó trả lời câu hỏi thứ 3 trong 3 điểm đạn mặc dù =)
dammkewl

8

TL; DR không phải là không gian 4D, đó là 3D cộng với một tỷ lệ gần như luôn luôn là 1. Nếu là 1, bạn có thể bỏ qua nó và ba số đầu tiên là x, y, z. Nếu không nó sẽ phức tạp hơn.

Đây là một lời giải thích đơn giản. Các đỉnh trong 3D chỉ nên có ba thành phần

⌈x⌉ v = |y| ⌊z⌋

Nếu chúng ta muốn thao tác với chúng (ví dụ xoay, chia tỷ lệ, v.v.), chúng ta sử dụng ma trận. Tất nhiên, ví dụ phổ biến nhất là ma trận Model-View-Projection (MVP) biến đổi tọa độ thế giới thành không gian clip. Như thế này:

⌈m11 m12 m13⌉ ⌈x⌉ c = |m21 m22 m23| * |y| ⌊m31 m32 m33⌋ ⌊z⌋

Tuy nhiên điều này có một lỗ hổng lớn: bạn không thể dịch. Nếu [x,y,z]bằng 0, cho dù mkết quả sẽ luôn là 0, vì vậy chúng ta không thể có MVP bao gồm dịch. Rõ ràng là chúng tôi muốn điều đó. Giải pháp là thêm 1 vào cuối các vectơ của chúng tôi và mở rộng ma trận thành 4 x 4:

⌈cx⌉ ⌈m11 m12 m13 tx⌉ ⌈x⌉ |cy| = |m21 m22 m23 ty| * |y| |cz| |m31 m32 m33 tz| |z| ⌊ 1⌋ ⌊ 0 0 0 1⌋ ⌊1⌋

(Nếu bạn nhìn vào bất kỳ ma trận MVP trực giao nào - ví dụ từ glOrtho()- bạn sẽ tìm thấy hàng thứ 4. 0 0 0 1Đôi khi, nó thậm chí còn bị ẩn.) Nếu bạn làm việc thông qua các phép toán, bạn sẽ thấy điều đó giống như

⌈cx⌉ ⌈m11 m12 m13⌉ ⌈x⌉ ⌈tx⌉ |cy| = |m21 m22 m23| * |y| + |ty| ⌊cz⌋ ⌊m31 m32 m33⌋ ⌊z⌋ ⌊tz⌋

Thành phần thứ 4 được gọi w, và trong khi nó không phải là 1, nó gần như luôn luôn là ( trước khi một sự chuyển đổi nào; sau đó nó thường được tái đồng nhất bằng cách chia toàn bộ vector bởi wvì nó là 1 lần nữa). Đó là một cách hack để cho phép ma trận biến đổi bao gồm dịch thuật.

Biên tập

Tôi tin rằng động lực ban đầu là cho các dự đoán phối cảnh , điều không thể với tọa độ 3D. Có những biến đổi khác bạn chỉ có thể thực hiện với vectơ 4D, nhưng dịch là dễ hiểu nhất.


2
Giải thích các downvote của bạn.
Timmmm

+1, giả sử thông tin là chính xác, đây là một lời giải thích tốt và hữu ích cho tôi. cảm ơn
Luke

1

Ngoài ra còn có một lý do nữa mà tôi thấy và điều đó không được đề cập trong các câu trả lời trước.

Ma trận dịch là 4 x 4 để bạn cũng có thể dịch đối tượng xung quanh "thế giới". Bởi vì với ma trận 3x3, bạn có thể xoay và chia tỷ lệ tọa độ 3d, nhưng bạn chỉ có thể dịch tọa độ 3d với ma trận 4 x 4, từ đây cần thể hiện tọa độ 3d trong một vectơ 4d.


bạn chỉ "cần" một vector 4d theo định nghĩa như vậy. một ma trận 4x4 không chỉ nhằm mục đích thêm vào như mọi người thích giả định và yêu cầu người khác. nếu tất cả những gì bạn muốn là thêm bản dịch sau khi xoay (đến điểm 3d), bạn chỉ cần xác định ma trận 4x3. Sẽ hiệu quả hơn nhiều nếu đó là tất cả những gì bạn theo đuổi. bạn không phải hạn chế các quy tắc được tạo ra cho cả đống lý do khác chỉ vì nó trông gọn gàng hơn. lol
Puddle
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.