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;