Một số điều hữu ích về phép quay:
- Bất kỳ ba vectơ trực giao sắp xếp như hàng xác định một sự biến đổi thành một cơ sở mới (vòng xoay vào cơ sở đó).
- Chuyển vị của bất kỳ phép quay nào là nghịch đảo của nó.
- Vì vậy, bất kỳ ba vectơ trực giao nào được sắp xếp làm cột xác định một vòng quay từ cơ sở nào đó đến khung tham chiếu "thế giới" của bạn.
Vì vậy, vấn đề là tìm thấy bất kỳ bộ ba vectơ trực giao và sắp xếp chúng như
| x1 x2 x3 0 |
| y1 y2 y3 0 |
| z1 z2 z3 0 |
| 0 0 0 1 |
này là chính xác những gì phương pháp bạn mô tả cố gắng để làm, nếu nó không hoạt động sau đó là một vấn đề với việc triển khai của bạn. Chúng tôi rõ ràng có thể sử dụng bình thường của bạn như (x1, y1, z1), nhưng vấn đề là hệ thống có vô số giải pháp cho hai vectơ còn lại (mặc dù biết một trong số chúng cung cấp cho bạn cái kia, như sản phẩm chéo) . Các mã sau đây phải đưa ra một vector ổn định vuông góc với (x1, y1, z1):
float normal[3] = { ... };
int imin = 0;
for(int i=0; i<3; ++i)
if(std::abs(normal[i]) < std::abs(normal[imin]))
imin = i;
float v2[3] = {0,0,0};
float dt = normal[imin];
v2[imin] = 1;
for(int i=0;i<3;i++)
v2[i] -= dt*normal[i];
này về cơ bản sử dụng Gram-Schmidt orthogonalisation với kích thước đó là đã trực giao nhất để vector bình thường.v3 có thể lấy được bằng cách lấy sản phẩm chéo của normal
và v2
.
Bạn có thể cần phải cẩn thận thiết lập vòng xoay, đó là về nguồn gốc, do đó bạn cần áp dụng bản dịch sau khi xoay và nó dành cho vectơ cột thay vì vectơ hàng. Nếu bạn đang sử dụng đồng hồ OpenGL mà OpenGL lấy mảng theo thứ tự cột lớn (thay vì thứ tự lớn của hàng C), do đó bạn có thể cần phải chuyển vị trí.
Tôi sợ rằng tôi chưa thử nghiệm ở trên, tôi chỉ đơn thuần là nabbed nó từ một số mã tôi đã viết một lúc trước và thích nghi nó với vấn đề của bạn! Hy vọng rằng tôi đã không quên bất kỳ chi tiết nào.
Edit: tôi đã quên một cái gì đó :)
Ma trận trên giả bình thường của bạn để đa giác là dọc theo trục x, và tôi có một sự nghi ngờ tinh quái nó sẽ không thể được, tất cả các bạn cần làm là đặt vectơ "bình thường" vào cột chính xác của ma trận xoay và v2/v3 trong hai cột còn lại. Vì vậy, nếu bình thường đối với đa giác của bạn nằm dọc theo trục z, thì bình thường sẽ đi vào cột thứ 3 và v2/v3 sẽ nằm trong hai cột đầu tiên.
Xin lỗi nếu điều đó gây ra bất kỳ sự nhầm lẫn nào.
Vì một lý do ngẫu nhiên tôi thấy mình xem lại câu trả lời này, khi tôi chọn kích thước trực giao nhất tôi nên đã sử dụng giá trị tuyệt đối của các thành phần vectơ bình thường - Tôi đã sửa lỗi này trong câu trả lời. –
Điều gì xảy ra nếu bình thường không nằm dọc theo bất kỳ trục nào? Nếu, thay vào đó, nó giống như <1, 1, 1>? – Ren
Thuật toán ánh xạ một tùy ý bình thường để nằm dọc theo một trong các trục (hoặc cách khác thông qua nghịch đảo), nếu bạn muốn xoay bình thường sang một giá trị bình thường khác, tôi sẽ tìm một vòng quay về sản phẩm chéo của hai chuẩn. –