Làm thế nào để có được bản dịch từ ma trận xem


11

Làm cách nào tôi có thể truy xuất vị trí không gian thế giới của máy ảnh từ ma trận chế độ xem của nó? Các câu trả lời duy nhất tôi thấy cho câu hỏi này cho thấy bản dịch nằm ở hàng / col cuối cùng nhưng điều này sẽ không hoạt động vì ma trận chứa [x (dấu chấm) phải, y (chấm) lên, z (dấu chấm) nhìn]

Câu trả lời:


10

Câu trả lời ngắn

Đầu tiên đảo ngược ma trận xem. Sau đó lấy bản dịch từ hàng / cột cuối cùng.

Câu trả lời dài

Một cách để suy ra nội dung của ma trận xem là bắt đầu bằng cách xem máy ảnh như bất kỳ đối tượng nào khác trên thế giới và tính toán ma trận thế giới cho nó:

RightX  RightY  RightZ  0
UpX     UpY     UpZ     0
LookX   LookY   LookZ   0
PosX    PosY    PosZ    1

Một ma trận thế giới biến đổi tọa độ từ không gian địa phương sang không gian thế giới. Nhưng trong trường hợp này, không gian cục bộ của máy ảnh và không gian xem là một và giống nhau, vì vậy chúng ta cũng có thể nói ma trận này biến đổi tọa độ từ không gian xem sang không gian thế giới.

Vì chúng ta cần một chuyển đổi theo hướng ngược lại , chúng ta phải đảo ngược ma trận. Kết quả là cái mà chúng ta gọi là ma trận khung nhìn biến đổi tọa độ từ không gian thế giới sang không gian xem:

   RightX        UpX        LookX      0
   RightY        UpY        LookY      0
   RightZ        UpZ        LookZ      0
-(Pos*Right)  -(Pos*Up)  -(Pos*Look)  1      // * = dot product

Và đó là loại ma trận bạn có. Vì vậy, để lấy lại vị trí camera từ vị trí đó, trước tiên bạn sẽ cần đảo ngược nó, và sau đó bạn có thể lấy bản dịch từ hàng cuối cùng (hoặc cột tùy thuộc vào hệ thống).


1
Tại sao đảo ngược ma trận trước? Nếu bạn (hy vọng) biết bạn đang ở hàng chính hay chuyên ngành cột, vị trí của vectơ dịch sẽ rõ ràng.
3Dave

7

Trước hết tôi rất khuyến nghị chỉ lưu trữ vị trí dưới dạng một vectơ riêng biệt, nó sẽ giúp mọi việc dễ dàng hơn nhiều về mặt tính toán. Dù sao ...

[x (dot) right, y (dot) up, z (dot) look]không phải là ma trận xem thực tế. Ma trận chính nó có dạng:

1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1

trong đó ma trận 3x3 trên cùng bên trái thể hiện các góc quay, tỷ lệ, v.v ... Tất cả hướng của máy ảnh được thực hiện ở đó. Hàng và cột còn lại được sử dụng để dịch và một số nội dung phối cảnh phức tạp khác mà tôi sẽ không truy cập ngay bây giờ.

Khi bạn nhận được ma trận (giả sử đó là ma trận 4 x 4), bản dịch sẽ luôn được lưu trữ ở hàng cuối cùng hoặc cột cuối cùng, tùy thuộc vào việc lớp ma trận của bạn là thứ tự chính hàng hay cột chính.

Những gì bạn có thể nhận được nhầm lẫn là thực tế là bạn cần các sản phẩm chấm. Điều gì đang xảy ra là đơn giản hóa toán học ma trận, có nhiều câu trả lời chi tiết hơn trong câu hỏi Stack Overflow này: https://stackoverflow.com/questions 4329050 / calatingating-a-lookat-gramrix

Giải pháp có thể được tìm thấy ở đây , bạn cần lấy nghịch đảo của ma trận và lấy bản dịch của nó:

Vector3 ViewTrans = Matrix.Invert(ViewMatrix).Translation;
Position = ViewTrans;

5

Các câu trả lời khác ở đây giải thích làm thế nào để có được vị trí camera từ nghịch đảo ma trận camera.

Nếu phần 3x3 của ma trận camera chỉ xoay (không chia tỷ lệ hoặc cắt) như thường lệ, phép tính có thể được tối ưu hóa bằng cách nhân bản dịch ma trận camera với chuyển vị của xoay camera. Vị trí máy ảnh sau đó là vectơ dịch chuyển đổi nhân với -1. Trong GLSL, đây là:

vec3 cameraPosition = -transpose(mat3(worldToCameraMatrix)) * worldToCameraMatrix[3].xyz;

hoặc là

vec3 cameraPosition = -worldToCameraMatrix[3].xyz * mat3(worldToCameraMatrix);

Đây là những gì tôi đã và đang sử dụng trong các shader đỉnh của mình nếu tôi không muốn tính toán và vượt qua vị trí máy ảnh như một bộ đồng phục.

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.