Tại sao chúng ta sử dụng ma trận 4 x 4 để biến đổi mọi thứ trong 3D?


36

Để dịch một vectơ 10 đơn vị theo hướng X, tại sao chúng ta phải sử dụng ma trận?

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

Chúng tôi chỉ có thể thêm 10 vào mat [0] [0] và chúng tôi cũng nhận được kết quả tương tự.

Câu trả lời:


28

Có, bạn có thể thêm một vectơ trong trường hợp dịch. Lý do sử dụng ma trận giúp có một cách thống nhất để xử lý các phép biến đổi kết hợp khác nhau.

Ví dụ: xoay thường được thực hiện bằng cách sử dụng ma trận (kiểm tra bình luận @MickLH để biết các cách khác để xử lý các phép quay), do đó, để xử lý nhiều biến đổi (xoay / dịch / chia tỷ lệ / chiếu ... vv) theo cách thống nhất, bạn cần mã hóa chúng trong một ma trận.

Vâng, nói nhiều về mặt kỹ thuật; một phép biến đổi đang ánh xạ một điểm / vectơ sang một điểm / vectơ khác.

p` = T(p); 

Trong đó p` là điểm biến đổi và T (p) là hàm biến đổi.

Vì chúng ta không sử dụng ma trận, chúng ta cần thực hiện điều này để kết hợp nhiều phép biến đổi:

p1 = T (p);

p cuối cùng = M (p1);

Không chỉ một ma trận có thể kết hợp nhiều loại biến đổi thành một ma trận đơn (ví dụ: affine, tuyến tính, chiếu).

Sử dụng một ma trận cho chúng ta cơ hội để kết hợp các chuỗi biến đổi và sau đó nhân hàng loạt chúng. Điều này giúp chúng tôi tiết kiệm rất nhiều chu kỳ thường bằng GPU (cảm ơn @ChristianRau vì đã chỉ ra nó).

T cuối cùng = T * R * P; // dịch dự án xoay

p chung kết = T cuối cùng * p;

Cũng tốt khi chỉ ra rằng GPU và thậm chí một số CPU được tối ưu hóa cho các hoạt động của vectơ; CPU sử dụng SIMD và GPU là bộ xử lý song song điều khiển dữ liệu theo thiết kế, do đó sử dụng ma trận phù hợp hoàn hảo với khả năng tăng tốc phần cứng (thực tế, GPU được thiết kế để phù hợp với hoạt động của ma trận / vectơ).


vâng, tôi biết rằng ma trận rất hữu ích cho việc quay vòng. nhưng mọi hướng dẫn đều hướng dẫn tôi sử dụng ma trận để thực hiện phép tính đơn giản như vậy: D
ngoaho91 17/03/14

1
Nói xoay vòng có thể "chỉ" được thực hiện với một ma trận là không chính xác, ngoài đỉnh đầu của tôi Đệ tứ và lượng giác cũng sẽ hoạt động tốt
MickLH 17/03/2016

17
Và hơn thế nữa, một khi bạn đã xoay và dịch cả hai ma trận 4 x 4, bạn có thể nhân chúng và biến đổi kết hợp trong một ma trận đơn lẻ mà không cần phải biến đổi mọi đỉnh bằng hàng ngàn phép biến đổi khác nhau bằng các cấu trúc khác nhau. Thực tế là một ma trận 4x4 là quá mức cần thiết cho một bản dịch hoặc một vòng quay đơn lẻ vượt trội bởi thực tế là bạn thường không chỉ chuyển đổi một đỉnh bằng một bản dịch hoặc một lần xoay.
Chris nói Phục hồi Monica

1
@ concept3d Vâng, tôi biết, câu trả lời là tốt. Tuy nhiên, lợi thế thậm chí còn lớn hơn có được từ cách sử dụng ma trận thống nhất không chỉ là tính đồng nhất, mà còn thể hiện toàn bộ chuỗi biến đổi trong một hoạt động. Trong khi điều đó có thể đã được ngụ ý, tôi thấy nó không rõ ràng và đủ quan trọng để đề cập đến nó một cách rõ ràng. Nhưng dù sao câu trả lời vẫn tốt, đó không phải là một bài phê bình.
Chris nói Phục hồi Monica

1
Đúng, trig tính toán ma trận quay, nhưng toán học vectơ thực sự "xoay" các điểm bằng cách sử dụng bộ dữ liệu trig-infuse. Khi tôi nói lượng giác, tôi đã ngụ ý sử dụng nó trực tiếp, không thông qua ma trận, để tạo ra một số điều đơn giản.
MickLH

6

Nếu tất cả những gì bạn sẽ làm là di chuyển dọc theo một trục duy nhất và không bao giờ áp dụng bất kỳ chuyển đổi nào khác thì những gì bạn đang đề xuất là ổn.

Sức mạnh thực sự của việc sử dụng ma trận là bạn có thể dễ dàng ghép một chuỗi các hoạt động phức tạp lại với nhau và áp dụng cùng một chuỗi các hoạt động cho nhiều đối tượng.

Hầu hết các trường hợp không đơn giản và nếu bạn xoay đối tượng trước, và muốn chuyển đổi dọc theo trục cục bộ của nó thay vì trục thế giới, bạn sẽ thấy mình không thể thêm 10 vào một trong các số và giải quyết chính xác .


5

Để trả lời ngắn gọn câu hỏi "tại sao", đó là bởi vì ma trận 4 x 4 có thể mô tả tất cả các thao tác xoay, dịch và chia tỷ lệ cùng một lúc. Có thể mô tả bất kỳ trong số này một cách nhất quán đơn giản hóa rất nhiều thứ.

Các loại biến đổi khác nhau có thể được biểu diễn đơn giản hơn với một phép toán khác nhau. Như bạn lưu ý, dịch thuật có thể được thực hiện chỉ bằng cách thêm. Chia tỷ lệ đồng nhất bằng cách nhân với một vô hướng. Nhưng một ma trận 4x4 được chế tạo phù hợp có thể làm bất cứ điều gì. Vì vậy, việc sử dụng liên tục 4 x 4 giúp mã và giao diện đơn giản hơn nhiều. Bạn phải trả một số phức tạp để hiểu những chiếc xe 4 x 4 này, nhưng sau đó rất nhiều thứ trở nên dễ dàng và nhanh hơn vì nó.


2
Điều này nên được trả lời được lựa chọn.
Kỹ sư

4

lý do để sử dụng ma trận 4 x 4 là để hoạt động là một phép biến đổi tuyến tính . đây là một ví dụ về tọa độ đồng nhất . Điều tương tự được thực hiện trong trường hợp 2d (sử dụng ma trận 3x3). Lý do sử dụng tọa độ đồng nhất là để có thể thực hiện cả 3 phép biến đổi hình học bằng một thao tác; nếu không, người ta sẽ cần phải thực hiện phép nhân ma trận 3x3 và phép cộng ma trận 3x3 (đối với bản dịch). liên kết này từ cegprakash là hữu ích.


2
Bạn nên giải thích. Một lời giải thích ngắn gọn là tốt hơn so với chỉ liên kết với wikipedia.
Seth Battin

3

Bản dịch không thể được biểu diễn bằng ma trận 3D

Một đối số đơn giản là bản dịch có thể lấy vectơ gốc:

0
0
0

tránh xa nguồn gốc, nói với x = 1:

1
0
0

Nhưng điều đó sẽ đòi hỏi một ma trận sao cho:

| a b c |   |0|   |1|
| d e f | * |0| = |0|
| g h i |   |0|   |0|

Nhưng điều đó là không thể.

Một đối số khác là định lý Phân rã giá trị số ít , nói rằng mọi ma trận có thể được tạo thành với hai phép quay và một phép chia tỷ lệ. Không có bản dịch ở đó.

Tại sao ma trận có thể được sử dụng?

Nhiều vật thể được mô hình hóa (ví dụ khung xe ô tô) hoặc một phần của các vật thể được mô hình hóa (ví dụ lốp xe hơi, bánh xe lái xe) là chất rắn: khoảng cách giữa các đỉnh không bao giờ thay đổi.

Các phép biến đổi duy nhất mà chúng ta muốn thực hiện đối với chúng là phép quay và bản dịch.

Phép nhân ma trận có thể mã hóa cả phép quay và bản dịch.

Ma trận xoay có các công thức rõ ràng, ví dụ: ma trận xoay 2D cho góc acó dạng:

cos(a) -sin(a)
sin(a)  cos(a)

Có các công thức tương tự cho 3D , nhưng lưu ý rằng các phép quay 3D có 3 tham số thay vì chỉ 1 .

Các bản dịch ít tầm thường hơn và sẽ được thảo luận sau. Chúng là lý do chúng ta cần ma trận 4D.

Tại sao nó là mát mẻ để sử dụng ma trận?

Bởi vì thành phần của nhiều ma trận có thể được tính toán trước bằng cách nhân ma trận .

Ví dụ: nếu chúng ta sẽ dịch một nghìn vectơ vcủa khung xe ô tô của mình bằng ma trận Tvà sau đó xoay bằng ma trận R, thay vì thực hiện:

v2 = T * v

và sau đó:

v3 = R * v2

đối với mỗi vector, chúng ta có thể tính toán trước:

RT = R * T

và sau đó thực hiện chỉ một phép nhân cho mỗi đỉnh:

v3 = RT * v

Thậm chí tốt hơn: nếu sau đó chúng ta muốn đặt các đỉnh của lốp xe và bánh xe lái so với xe hơi, chúng ta chỉ cần nhân ma trận trước đó RTvới ma trận so với chính chiếc xe.

Điều này tự nhiên dẫn đến việc duy trì một chồng ma trận:

  • tính toán ma trận khung
  • nhân với ma trận lốp (đẩy)
  • loại bỏ ma trận lốp xe (pop)
  • nhân với ma trận bánh xe (đẩy)
  • ...

Cách thêm một chiều giải quyết vấn đề

Chúng ta hãy xem xét trường hợp từ 1D đến 2D để dễ hình dung hơn.

Một ma trận trong 1D chỉ là một số và như chúng ta đã thấy trong 3D, nó không thể dịch, chỉ là một tỷ lệ ..

Nhưng nếu chúng ta thêm kích thước phụ như:

| 1 dx | * |x|  = | x + dx |
| 0  1 |   |1|    |      1 |

và sau đó chúng ta quên đi chiều không gian mới, chúng ta nhận được:

x + dx

như chúng tôi muốn

Phép biến đổi 2D này quan trọng đến mức nó có một tên: phép biến đổi cắt .

Thật tuyệt khi hình dung sự chuyển đổi này:

Nguồn hình ảnh .

Lưu ý cách mọi đường ngang (cố định y) chỉ được dịch.

Chúng tôi chỉ tình cờ lấy dòng y = 1là dòng 1D mới của mình và dịch nó với ma trận 2D.

Mọi thứ tương tự như 3D, với ma trận cắt 4D có dạng:

| 1 0 0 dx |   | x |   | x + dx |
| 0 1 0 dy | * | y | = | y + dy |
| 0 0 1 dz |   | z |   | z + dz |
| 0 0 0  1 |   | 1 |   |      1 |

Và xoay / thu nhỏ 3D cũ của chúng tôi bây giờ có dạng:

| a b c 0 |
| d e f 0 |
| g h i 0 |
| 0 0 0 1 |

Video hướng dẫn này của Jamie King cũng đáng xem.

Không gian affine

Không gian affine là không gian được tạo bởi tất cả các phép biến đổi tuyến tính 3D của chúng tôi (phép nhân ma trận) cùng với phép cắt 4D (bản dịch 3D).

Nếu chúng ta nhân một ma trận cắt và biến đổi tuyến tính 3D, chúng ta luôn nhận được một cái gì đó có dạng:

| a b c dx |
| d e f dy |
| g h i dz |
| 0 0 0  1 |

Đây là phép biến đổi affine tổng quát nhất có thể, thực hiện xoay / chia tỷ lệ 3D và dịch.

Một thuộc tính quan trọng là nếu chúng ta nhân 2 ma trận affine:

| a b c dx |   | a2 b2 c2 dx2 |
| d e f dy | * | d2 e2 f2 dy2 |
| g h i dz |   | g2 h2 i2 dz2 |
| 0 0 0  1 |   |  0  0  0   1 |

chúng tôi luôn nhận được một ma trận affine khác của hình thức:

| a3 b3 c3 (dx + dx2) |
| d3 e3 f3 (dy + dy2) |
| g3 h3 i3 (dz + dz2) |
|  0  0  0          1 |

Các nhà toán học gọi đóng cửa thuộc tính này và được yêu cầu xác định một khoảng trắng.

Đối với chúng tôi, điều đó có nghĩa là chúng tôi có thể tiếp tục thực hiện các phép nhân ma trận để tính toán các phép biến đổi cuối cùng một cách vui vẻ, đó là lý do tại sao sử dụng ma trận đã sử dụng ở vị trí đầu tiên, mà không bao giờ nhận được các phép biến đổi tuyến tính 4D tổng quát không liên quan.

Frustum chiếu

Nhưng chờ đã, có một biến đổi quan trọng hơn mà chúng ta thực hiện mọi lúc : glFrustum, làm cho một đối tượng gấp 2 lần, xuất hiện nhỏ hơn gấp 2 lần.

Trước tiên hãy lấy một số trực giác về glOrthovs glFrustumtại: https://stackoverflow.com/questions/2571402/explain-the-usage-of-glortho/36046924#36046924

glOrthocó thể được thực hiện chỉ với bản dịch + chia tỷ lệ, nhưng làm thế nào chúng ta có thể thực hiện glFrustumvới ma trận?

Giả sử rằng:

  • mắt của chúng ta là nguồn gốc, nhìn vào -z
  • màn hình (gần mặt phẳng) nằm ở z = -1đó là một hình vuông có chiều dài 2
  • mặt phẳng xa của sự thất vọng là ở z = -2

Nếu chỉ chúng ta cho phép 4 vectơ tổng quát loại:

(x, y, z, w)

với w != 0, và ngoài ra, chúng tôi xác định mọi (x, y, z, w)với (x/w, y/w, z/w, 1), sau đó một phép biến đổi với ma trận sẽ là:

| 1 0  0 0 |   | x |   |  x |               | x / -z |
| 0 1  0 0 | * | y | = |  y | identified to | y / -z |
| 0 0  1 0 |   | z |   |  z |               |     -1 |
| 0 0 -1 0 |   | w |   | -z |               |      0 |

Nếu chúng ta vứt đi zwcuối cùng, chúng ta sẽ nhận được:

  • x_proj = x / -z
  • y_proj = y / -z

đó chính xác là những gì chúng tôi muốn! Chúng tôi có thể xác minh rằng đối với một số giá trị, ví dụ:

  • nếu z == -1, chính xác trên máy bay chúng ta đang chiếu x_proj == xy_proj == y.
  • if z == -2, then x_proj = x/2: các đối tượng có kích thước bằng một nửa.

Lưu ý cách glFrustumbiến đổi không phải là dạng affine: nó không thể được thực hiện chỉ với phép quay và dịch.

"Thủ thuật" toán học của việc thêm wvà chia cho nó được gọi là tọa độ đồng nhất

Xem thêm: câu hỏi về Stack Overflow liên quan: https://stackoverflow.com/questions/2465116/under Hiểu-opl -matrices


@Downvoters, vui lòng giải thích để tôi có thể học hỏi và cải thiện.
Ciro Santilli 心 心

Cá nhân tôi nghĩ rằng điều này chỉ dài và lan man, phần giải quyết câu hỏi ban đầu không có gì mới (không được bao phủ bởi các câu trả lời khác) và phần còn lại của nó là không liên quan, khiến nó thực sự khó khăn để vượt qua.
Josh

@JoshPetrie cảm ơn đã phản hồi! Tôi nghĩ rằng những người chưa hiểu sẽ có nhiều khả năng hiểu từ câu trả lời của tôi, vì nó rõ ràng và trực quan hơn. Nếu bạn tìm thấy các lỗi cụ thể hoặc các điểm hoàn toàn không liên quan, hãy chỉ ra chúng để tôi có thể cải thiện. Chúc mừng.
Ciro Santilli 心 心

Như tôi đã nói, tôi nghĩ rằng hầu hết các câu trả lời là không liên quan. Câu hỏi đặt ra "tại sao sử dụng ma trận 4 x 4, tại sao chúng ta không thể thêm?" Câu trả lời được trình bày rất rõ với một lời giải thích như "có, bạn có thể thêm, nhưng một ma trận cũng cho phép bạn dịch / xoay / chia tỷ lệ, nhưng do cách thức toán học ma trận hoạt động, 3x3 không thể mã hóa bản dịch, nhưng là 4 x 4 người ta có thể." Nếu bạn bao gồm tất cả trong bức tường văn bản này, thì rất khó tìm. Phần còn lại của nó là một kiến ​​thức cơ bản về toán học ma trận không được hỏi về, và trong khi nó có thể sẽ tốt khi trả lời cho một câu hỏi khác, tôi không nghĩ rằng nó phù hợp với câu hỏi này .
Josh

1
Tôi đánh giá cao sự chú ý đến từng chi tiết. Để giải quyết mối quan tâm của người dùng trước đó, câu trả lời phải được sắp xếp lại để bắt đầu tại "Bản dịch không thể được biểu diễn bằng ma trận 3D". Điều này trả lời câu hỏi ngay lập tức và OP có thể tiếp tục với các chi tiết được viết tốt và nhiệt tình hơn được cung cấp; những chi tiết tốt hơn là những gì tôi quan tâm ở đây vì vậy tôi có thể bị thiên vị, nhưng điều này chắc chắn không phải là "lan man".
dskinner

1

Xem video này để hiểu các khái niệm về mô hình, xem và chiếu.

Ma trận 4 x 4 không chỉ được sử dụng để dịch một đối tượng 3D. Nhưng cũng cho các mục đích khác nhau.

Xem điều này để hiểu cách các đỉnh trên thế giới được biểu diễn dưới dạng Ma trận 4D và cách chúng được biến đổi.


1
Điều này không thực sự trả lời câu hỏi OP.
Concept3d

Đã chỉnh sửa. Nghe có vẻ hay?
cegprakash
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.