Ma trận đại diện cho cái gì?


19

Gần đây tôi bắt đầu học OpenGL và gặp vấn đề khi hình dung ma trận là gì và vai trò của chúng trong đồ họa máy tính. Cho mẫu của ma trận 4 x 4 như thế này:

nhập mô tả hình ảnh ở đây

Tôi cho rằng mỗi ma trận như thế này là tọa độ của một đỉnh trong không gian thế giới. Và một vài trong số chúng đặt lại với nhau và tô bóng cho một đối tượng?

Nhưng tại sao có a Xx, a Xyvà an Xz? Tôi đọc rằng đó là một trục khác nhau (lên, trái, về phía trước) nhưng vẫn không thể tạo ra đầu hoặc đuôi có ý nghĩa.

Câu trả lời:


19

Ma trận trong đồ họa máy tính là các phép biến đổi được cung cấp cho mỗi tọa độ trong mô hình. Mỗi Ma trận là sự kết hợp của nhiều phép biến đổi để áp dụng cho tọa độ (một điểm trong 3 không gian).

Xây dựng một biến đổi dựa trên một trong ba loại biến đổi: Dịch, Xoay và Tỷ lệ.

Một ma trận dịch là một cái gì đó như:

Ma trận dịch

Và một ma trận tỷ lệ: Ma trận tỷ lệ

Ma trận xoay trông giống như:

nhập mô tả hình ảnh ở đây

Để kết hợp bất kỳ ma trận nào, bạn chỉ cần nhân chúng lại với nhau. Để áp dụng phép biến đổi cho một đỉnh, chỉ cần nhân với đỉnh (như đã thấy trong sơ đồ dịch).


4
O vì vậy ma trận không đại diện cho điểm. Tôi đã sẵn sàng ngay bây giờ
Nhà phát triển buồn CRUD

Rất nhiều lần chúng được áp dụng cho toàn bộ một đối tượng hoặc toàn bộ khung nhìn (đó là cách bạn có được ortho so với các khung nhìn phối cảnh)
Alex Shepard

3
@BDillan: Không, nhưng chắc chắn chúng có thể chứa điểm. Chẳng hạn, cột cuối cùng trong ma trận ModelView (GL / cột-chính) xác định cách dịch gốc. Hay nói cách khác, nó xác định vị trí của mắt trong không gian thế giới và theo nghĩa đen có thể được sử dụng như một điểm.
Andon M. Coleman

phối hợp của bạn một tuple. Tại sao ma trận không phải là 3 lần 3? Giả sử để có thể kết hợp ba loại biến đổi thành một ma trận duy nhất mà vẫn có đủ không gian, thì góc dưới bên phải đang làm gì, có vẻ như nó luôn luôn là 1?
n611x007

Hàng / cột thứ tư đặc biệt có để dịch. Một trong những tính năng thú vị nhất của toán học ma trận là tôi có thể kết hợp tất cả các bản dịch & phép quay mà tôi muốn thực hiện thành một ma trận duy nhất. Điều này có nghĩa là các bộ biến đổi rất, rất phức tạp (vô hạn về mặt lý thuyết) có thể được nén xuống 1 ma trận. Vâng, ô cuối cùng đó vẫn là 1, nhưng nó cho phép chúng ta làm phần còn lại của toán học.
Alex Shepard

10

Trong đồ họa máy tính, chúng tôi sử dụng ma trận để mã hóa các phép biến đổi .

Ma trận chỉ chứa các phép biến đổi dịch, xoay hoặc chia tỷ lệ có cách hiểu thường được khai thác: 3x3 phía trên bên trái của ma trận chỉ chứa dữ liệu xoay hoặc tỷ lệ, hàng dưới cùng hoặc cột bên phải chứa dữ liệu dịch. Đây không phải là một tổng quát, nhưng thường đúng cho tập hợp các biến đổi được thể hiện trong đồ họa máy tính mà mọi người sử dụng nó.

Tương tự, có một mối quan hệ giữa các giá trị của ma trận và khung tọa độ tương ứng mà ma trận đại diện (không phải luôn luôn là "không gian thế giới", tôi nên lưu ý). Các cột 3x3 phía trên bên trái (hoặc các hàng) đại diện cho các trục X, Y và Z của khung tọa độ.

Các hàng có đại diện cho trục hay cột hay không phụ thuộc vào việc bạn có đang sử dụng quy ước nhân như row vector * matrixhay không matrix * column vector. Khi thực hiện phép nhân ma trận, kích thước bên trong của hai ma trận phải đồng ý và do đó, việc bạn biểu diễn các vectơ như ma trận hàng hay ma trận cột có tác động đến sự lựa chọn đó (OpenGL và toán học truyền thống có xu hướng thích vectơ cột).

Tôi khuyên bạn nên có một cuốn sách hay về đại số tuyến tính, hoặc ít nhất là xem qua Câu hỏi thường gặp về Ma trận và Đệ tứ và bài đăng này về bố cục ma trận trong DirectX và OpenGL .


có rất nhiều sách "hay" về đại số tuyến tính, một số trong đó tôi thậm chí đã đọc và hiểu. có điều là nó không giúp được chút nào, không phải tôi cũng không hiểu. Tôi có cảm giác lời khuyên cuối cùng của bạn là trả lời sai.
n611x007

9

Ma trận là gì?

Một ma trận với mcác cột và ncác hàng biểu thị một hàm tiêu thụ một vectơ * với mcác phần tử (hoặc tọa độ) và tạo ra một vectơ với ncác phần tử.

Từ đó bạn có thể quan sát thấy rằng nếu và chỉ khi một ma trận vuông, thì chiều của vectơ sẽ không thay đổi. Ví dụ. bạn có được một vectơ 3D từ việc chuyển đổi một vectơ 3D, 2D từ 2D, v.v.

* : Trong vật lý, vectơ thường được sử dụng để chỉ các lực hoặc "ảnh hưởng" khác "di chuyển xung quanh" những thứ như vận tốc hoặc gia tốc. Nhưng không có gì ngăn bạn sử dụng một vectơ để biểu thị một điểm hoặc bất kỳ mảng số tùy ý nào (một số thư viện và ngôn ngữ lập trình thậm chí sử dụng "vectơ" để có nghĩa là "mảng 1D"). Để sử dụng với ma trận, bất cứ thứ gì cũng có thể là các phần tử của vectơ của bạn (thậm chí là chuỗi hoặc màu), miễn là bạn có cách thêm, trừ và nhân chúng với bất kỳ yếu tố nào trong ma trận của bạn. Do đó , vectơ tên , có nghĩa là "người vận chuyển" - nó mang hoặc giữ các giá trị cho bạn.

Nhân với một ma trận có nghĩa là gì?

Vậy nếu một ma trận là một hàm thì loại hàm nào? Hàm này làm gì? Công thức cho nó được xác định bởi các yếu tố của ma trận. Chúng ta hãy gọi đầu vào u, đầu ra v, ma trận M(phép nhân M*u=vgiống như sau f(u)=v) và u(i)đưa ra iphần tử thứ của u(ví dụ phần tử thứ 2 là tọa độ y). Đối với ma trận, M(i,j)có nghĩa là hàng i, cột j.

Xây dựng phần tử v(1), phần đầu tiên trong kết quả, được mô tả bởi hàng đầu tiên của ma trận. u(1)lần M(1,1), cộng u(2)lần M(1,2), ... cộng u(i)lần M(1,i). Một ma trận giống như một ngôn ngữ lập trình rất đơn giản, chỉ tốt cho các chức năng lập trình hoạt động bằng cách xáo trộn xung quanh các đầu vào, thêm chúng vào chính chúng, v.v. **

Thật hữu ích khi tưởng tượng rằng bạn đang làm việc trên một yếu tố đầu ra tại một thời điểm, do đó, bạn chỉ sử dụng một hàng của ma trận tại một thời điểm. Bạn viết ra utheo chiều ngang. Bạn viết hàng thứ i Mbên dưới nó. Bạn nhân từng cặp trên / dưới và viết các sản phẩm bên dưới, sau đó thêm các sản phẩm. Lặp lại cho mỗi hàng để có được mọi yếu tố v. (Bây giờ bạn thấy tại sao một ma trận mtheo nphải hoạt động trên một mvectơ và tạo ra một nvectơ.)

Một cách khác để suy nghĩ về điều này - giả sử chúng ta đang thực hiện chuyển đổi 3D sang 3D, do đó, ma trận 3x3 (hoặc biến đổi 3D như chúng thường được gọi vì bạn có thể giả vờ "chức năng" này là "di chuyển" các điểm 3D, mặc dù thực sự đó là chỉ cần thay đổi số lượng). Hãy nói hàng đầu tiên là [1 2 0]. Điều này có nghĩa, để có được x kết quả, hãy lấy 1 của x đầu vào, 2 của y đầu vào và 0 của z của đầu vào. Vì vậy, nó thực sự là một công thức.

** : Nếu một ma trận là ngôn ngữ lập trình, thì nó thậm chí còn chưa hoàn thành Turing.

Nhân hai ma trận có nghĩa là gì?

Nếu họ là cả hai ma trận kích thước thích hợp, sau đó A*Bcó nghĩa là "một chức năng mà áp dụng đầu tiên Bsau đó A". Bạn có thể thấy lý do tại sao các ràng buộc về kích thước cho phép nhân tồn tại, bởi vì kích thước xác định kích thước đầu vào và đầu ra và một ma trận tiêu thụ đầu ra của cái kia. Tại sao phép nhân có nghĩa là kết hợp các hàm? Nó dễ dàng hơn để nhận thấy rằng nó phải được. Nếu A*ulà giống như f(u)B*ulà giống như g(u)sau đó f(g(u))là giống như f(B*u)là giống như A*(B*u).

Tương tự, các ứng dụng lặp lại của cùng một chức năng có thể được hiển thị dưới dạng quyền hạn, vì A*A*Acó nghĩa là áp dụng chức năng Ađại diện cho ba lần.

Ma trận hữu ích như thế nào?

Điều gì tốt khi thực hiện chuyển đổi như thế nào new_x = 1*x+2*y+0*z(nếu hàng đầu tiên là [1 2 0])? Điều đó không rõ ràng lắm, nhưng hãy lấy một ma trận 2D khác để giải thích điều đó. Ma trận là:

[ 0 1
  1 0 ]

Hoặc [0 1; 1 0]sử dụng ký hiệu Matlab thuận tiện. Ma trận này làm gì? Nó biến đổi một vectơ 2D như vậy: Đối với x kết quả, lấy 1 trong số y của đầu vào. Đối với y kết quả, lấy 1 trong số x của đầu vào. Chúng ta vừa hoán đổi tọa độ x và y của đầu vào - ma trận này phản ánh các điểm về đường x = y. Điều đó thật hữu ích! Bằng cách mở rộng, bạn sẽ thấy rằng tất cả các ma trận có 1s dọc theo đường SW - NE phản ánh. Bạn cũng có thể thấy lý do tại sao ma trận danh tính cung cấp cho bạn đầu vào trở lại (đối với x đầu ra, lấy x đầu vào; đối với y đầu ra, lấy y đầu vào ...).

Bây giờ bạn thấy tại sao các biểu tượng là ví dụ. Xx,Yx - họ có nghĩa là có bao nhiêu đầu vào X, Yvv đi vào sản lượng x.

Làm thế nào khác là ma trận hữu ích?

Những chuyển đổi khác bạn có thể làm gì? Bạn có thể thay đổi kích thước bằng cách lấy một ma trận danh tính, nhưng với một số khác với 1 dọc theo đường chéo. Ví dụ,[2.5 0; 0 22.5] sẽ nhân mọi tọa độ của đầu vào với 2,5 và nếu bạn áp dụng ma trận này cho mọi điểm trong ảnh, ảnh sẽ lớn hơn 2,5. Nếu bạn chỉ đặt 2,5 trong một hàng ( [2.5 0; 0 1]) thì chỉ tọa độ x sẽ được nhân, do đó bạn sẽ chỉ kéo dài dọc theo x.

Các ma trận khác có thể đưa ra các phép biến đổi khác, chẳng hạn như "xiên", có mức độ hữu dụng khác nhau. Cá nhân, xiên là yêu thích ít nhất của tôi bởi vì ma trận trông rất đơn giản nhưng bản thân biến đổi hiếm khi làm bất cứ điều gì ngoại trừ mang một hình ảnh. Một cách hữu ích là "xoay" - làm thế nào để bạn xoay một điểm? Hãy thử làm việc ở vị trí của điểm(x, y) sau khi xoay theo thetađộ ngược chiều kim đồng hồ về điểm gốc. Bạn sẽ thấy rằng cả tọa độ x và y mới đều xuất phát từ việc nhân x và y cũ với một số sin và cosin của theta. Bạn sẽ có thể dễ dàng viết một ma trận xoay bằng cách sử dụng sin và cos tương ứng với chức năng này.

Với ma trận không vuông, bạn cũng có thể thay đổi kích thước của đầu vào. Biến đầu vào 2D thành 3D không hữu ích lắm, vì thật khó để "sản xuất" thứ gì đó để đưa vào tọa độ mới, nhưng 3D thành 2D rất hữu ích. Trong số những thứ khác, đây là cách máy tính của bạn biết để chiếu *** một cảnh 3D vào hình ảnh 2D để vẽ trên màn hình của bạn.

Vì các vectơ có thể chứa những thứ khác nhau, bạn thậm chí có thể mô tả một ma trận mã hóa một chuỗi ký tự n tại một thời điểm, bằng cách xáo trộn chúng xung quanh hoặc "nhân" chúng (bạn sẽ phải đưa ra hàm nhân / cộng).

*** : Khi bạn chiếu , bạn lấy một vật thể 3D như một tác phẩm điêu khắc, chiếu ánh sáng vào nó và xem loại bóng 2D nào rơi trên tường.

Những hạn chế của ma trận là gì?

Bạn có thể làm mọi chức năng với ma trận? Không. Suy nghĩ bằng đồ họa, thật khó để tưởng tượng điều gì đó mà ma trận không thể làm được (nhưng nó tồn tại: chẳng hạn như hiệu ứng "xoáy"). Tuy nhiên, đây là một ví dụ dễ hiểu: Giả sử chức năng flà như vậy f(u)mang lại cho bạn u mọi bình phương . Bạn sẽ thấy rằng bạn không thể viết một ma trận cho điều này: Với ma trận chỉ có cơ sở để mô tả các công thức nhân các tọa độ với một số không đổi, không có chức năng ưa thích nào khác như sức mạnh có thể được biểu thị.

**** : Đây cũng là lý do tại sao nó được gọi là đại số tuyến tính - hàm công suất là phi tuyến tính , nó không tạo ra một đường thẳng khi được vẽ.

Trên hàng phụ kỳ lạ trong ma trận 4D

Bây giờ, tại sao ma trận trong ví dụ 4 của bạn là 4? Điều này không có nghĩa là không gian 4 chiều? Chúng ta không có máy tính 4D, vậy tại sao? Đây thực sự là một mẹo thú vị với ma trận liên quan đến điểm trước đó về các hoạt động tuyến tính.

Về các chức năng không thể được thực hiện với ma trận: Ma trận để di chuyển điểm 2D bằng 2 đơn vị sang phải (điều này tạo ra điểm (x+2, y) ? Một lần nữa, chúng ta bị kẹt. Có một cách để nhân đầu vào, nhưng không có cách nào để thêm Đối với công việc 2D, mẹo là giả vờ bạn thực sự không ở trong không gian 2D, nhưng trong không gian 3D, ngoại trừ chiều cao (tọa độ z hoặc phần tử thứ 3) của mọi thứ luôn là 1 (giống như cách vũ trụ 2D chỉ là một "cái đĩa" nằm phẳng dọc theo sàn của vũ trụ 3D - trong trường hợp đó tọa độ thứ ba luôn là 0). Sau đó, bạn có thể sử dụng phép phối hợp cuối cùng này như một hằng số, bởi vì bạn biết nó luôn luôn là 1 cho mỗi đầu vào.

Tương tự, để di chuyển các điểm 3D, bạn cần tọa độ 4D. Đó cũng là lý do tại sao tất cả các ma trận chuyển đổi 3D mà bạn thấy sẽ có [0 0 0 1]hàng cuối cùng - bạn không bao giờ phải thay đổi kích thước thứ 4, hoặc kết quả sẽ quá phức tạp để thể hiện trong 3D!


Vậy làm thế nào để bạn làm một ma trận cho bổ sung? nói một hàng là Xx Yx Zx Tx... và hàng cuối cùng thực sự được 0t 0t 0t 1tthay thế từ Xt Yt Zt Tt. Để làm (x+2, y)từ (x, y)bạn có thể đi 1x 0y 0z 2tmà sẽ cung cấp cho bạn 1*x + 0*y + 0*z + 2*1kể từ t=1phải không? Mà khá nhiều số tiền cho x + 2. Trời ơi, bây giờ bạn có thể làm rối tung kết xuất của mình bằng các giá trị T vui nhộn, phải không? -grin- (đọc lâu, vẫn có giá trị tốt nhất, thx)
n611x007

2

Đó là một ma trận chính của cột 4 x 4 và từ vẻ ngoài của nó, một ma trận xem.

3 cột đầu tiên xác định hướng của các vectơ cơ sở của bạn (lên, sang trái, chuyển tiếp khi bạn gọi chúng) và cột cuối cùng xác định bản dịch của điểm mắt. Đặt chúng lại với nhau và bạn có thể mô tả hướng của máy ảnh của mình và quan trọng hơn là bạn có thể sử dụng ma trận này để biến đổi các điểm thành không gian tọa độ được gọi là "không gian mắt", "không gian xem" hoặc "không gian camera".

Đó là tất cả các từ đồng nghĩa cho cùng một không gian tọa độ. Thật không may, bạn phải học tất cả các từ đồng nghĩa khi xử lý đồ họa máy tính vì các cuốn sách khác nhau và mọi người sẽ gọi chúng bằng các tên khác nhau. Hầu hết các không gian tọa độ có nhiều tên.

Nhân tiện, ba cột trong ma trận xem của bạn nói chung là trực giao, nghĩa là chúng tạo thành các góc vuông với nhau. Điều này là không bắt buộc, nhưng nó là một tài sản rất phổ biến khi xây dựng một máy ảnh truyền thống.


1

Phiên bản TL; DR:

Ba phần tử đầu tiên [x y z]trong mỗi hàng đại diện cho một vectơ cơ sở duy nhất của một hệ thống kết hợp được chuyển đổi. Yếu tố cuối cùng wlà một thành phần dịch thuật.

Phiên bản dài

Nếu bạn muốn một ma trận, khi được áp dụng cho một đỉnh, sẽ xoay đỉnh về gốc tọa độ bằng 45 độ, bạn sẽ lấp đầy ma trận bằng ba vectơ đại diện cho các trục biến đổi:

  • Một điểm itrên xtrục [1 0 0], nhưng xoay 45 độ. Điều này chỉ đơn giản [i_x i_y i_z], ở đâu i_xi_ylà các chân của một hình tam giác với góc trong 45 độ so với trục X : [cos(45) sin(45) 0].
  • Một điểm jtrên trục y [0 1 0], nhưng xoay 45 độ so với trục đó. Phác thảo nó trên một tờ giấy và bạn sẽ thấy rằng, khi quay ngược chiều kim đồng hồ, các thành phần sẽ trở thành [-sin(45) cos(45) 0].
  • Một điểm ktrên ztrục. Trong ví dụ này, zkhông bị ảnh hưởng vì chúng ta đang quay trong mặt phẳng xy (căn chỉnh màn hình)

Vì vậy, chúng ta có ba vectơ mới: i, j, k. Cách dễ dàng để hình dung điều này chỉ là lấy các trục X và Y và xoay toàn bộ bố trí chéo.

Làm thế nào để chúng ta đặt những thứ này trong một ma trận?

i_x i_y i_z
j_x j_y j_z
k_x k_y k_z

Hoặc là

 cos(45)  sin(45)    0
-sin(45)  cos(45)    0
    0        0       1

Nếu bạn nhân bất kỳ đỉnh nào với ma trận đó, bạn sẽ nhận được

v1_x = v_x cos(Θ)     - v_y sin(Θ) + v_z * 0
V1_y = v_x*sin(Θ)    + v_y cos(Θ) + v_Z * 0
V1_z = v_x * 0        + v_y * 0    + v_z * 1

cho v = [1 0 0], và Θ = 90°, điều này trở thànhv1 = [0 1 0]

Để dịch, chúng tôi thêm một hàng và cột thứ tư, và đặt các thành phần dịch vào cột cuối cùng. Chúng tôi thêm một thành phần thứ tư vào đỉnh wthường 1. Điều này là để khi chúng ta nhân đỉnh với ma trận, thành phần w làm cho cột cuối cùng được thêm vào đỉnh đầu vào, do đó đỉnh được di chuyển hoặc dịch. Chúng tôi gọi đây là "tọa độ đồng nhất." (Đối với mục đích của chúng tôi, "đồng nhất" chỉ có nghĩa là có một thành phần thứ 4 wtrong mỗi vectơ và chúng tôi sử dụng ma trận 4 x 4 thay vì 3x3. Thường thì bạn sẽ thấy các shader sử dụng ma trận 4x3 để tránh gửi hàng thứ 4 vô dụng cho GPU, tiêu thụ bộ nhớ và băng thông có giá trị. Hàng thứ 4 là cần thiết để chiếu phối cảnh, nhưng không nhiều thứ khác.)

Hi vọng điêu nay co ich.


2
Khoảnh khắc đó khi bạn nhận ra mình vừa trả lời một câu hỏi đã được trả lời từ ba năm trước ...
3Dave

: P Luôn luôn nhìn vào ngày câu hỏi trước khi trả lời ...
HolyBlackCat
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.