Làm thế nào để tính ma trận xoay 3x3 từ 2 vectơ chỉ hướng?


10

Tôi đã có 2 vectơ chỉ hướng cho trục X và trục Y của đối tượng. Làm thế nào để tôi tính toán ma trận xoay của đối tượng bằng cách sử dụng chúng?

Câu trả lời:


17

Ý tưởng cơ bản là sử dụng một sản phẩm chéo để tạo ra các trục trực giao bổ sung của ma trận xoay vòng của bạn, dựa trên các trục mà bạn đã có.

Matrix3x3 MakeMatrix( Vector3 X, Vector3 Y )  
{  
    // make sure that we actually have two unique vectors.
    assert( X != Y );

    Matrix3x3 M;  
    M.X = normalise( X );  
    M.Z = normalise( cross_product(X,Y) );
    M.Y = normalise( cross_product(M.Z,X) );  
    return M;
}

Lưu ý rằng ở trên không đưa ra các giả định về các vectơ X và Y (ngoài chúng không giống nhau) và có rất nhiều phép toán bổ sung mà nó có thể không phải làm trong tình huống của bạn.

Ví dụ, trong mã này, tôi đang thực hiện một sản phẩm chéo thứ hai để đảm bảo ma trận của chúng ta có trục Y trực giao, thay vì tin tưởng một cách mù quáng rằng các trục X và Y đầu vào cách nhau chính xác 90 độ. Nếu trong tình huống của bạn, bạn chắc chắn rằng các trục đầu vào của bạn thực sự trực giao với nhau, thì bạn có thể bỏ qua sản phẩm chéo thứ hai và chỉ cần gán trực tiếp vectơ Y đầu vào, thay vì tính toán lại.

Lưu ý rằng tôi giả sử rằng biểu diễn ma trận của bạn có các thành viên vectơ 'X, Y, Z' có thể truy cập. Thay vào đó, một số triển khai chỉ hiển thị một mảng gồm chín số float, trong trường hợp đó, vectơ 'X' sẽ là các phần tử 0, 1 và 2 hoặc 0, 3 và 6, tùy thuộc vào việc ma trận là hàng chính hay cột- chính. Trong tình huống (gây phiền nhiễu) này, tôi thường thấy rằng việc thử cả hai cách và xem cách nào hiệu quả hơn là tìm kiếm thông qua tài liệu để cố gắng tìm ra cách thực hiện ma trận cụ thể nào đang sử dụng. :)

Cuối cùng, lưu ý rằng tùy thuộc vào độ thuận tay của hệ tọa độ 3D của bạn, bạn có thể cần nhân MZ với âm, để tạo ma trận xoay vòng hợp pháp cho công cụ 3D của mình.


Cảm ơn rât nhiều! Tôi sẽ làm điều này và cho bạn biết kết quả của tôi.
TheFlash

Cảm ơn bạn đã trả lời rất hữu ích! Mặc dù vậy, tôi tò mò: không phải vectơ X luôn luôn là các phần tử 0, 1 và 2 bất kể ma trận là hàng hay cột chính? 0, 3 và 6 sẽ ngụ ý truy cập vào cột đầu tiên của ma trận hàng chính hoặc ngược lại.
fbrereto

1
+1 cho ít nhất khẳng định () ing rằng hai vectơ không bằng nhau, nhưng tôi nghĩ bạn cũng nên yêu cầu chúng không phải là vectơ không.
hans_meine

1
Lưu ý rằng điều này không đưa vào tài khoản một trường hợp X-Y.
Rafał Cieślak
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.