Câu trả lời:
Ý 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.
X
là -Y
.