Nếu bạn có, hoặc có thể dễ dàng tính toán, véc tơ bình thường với mặt phẳng mà điểm của bạn hiện đang ở, tôi nghĩ cách dễ nhất để thực hiện việc này là xoay quanh trục chung với hai mặt phẳng. Đây là cách tôi muốn đi về nó:
- Hãy
M
là vector bình thường để máy bay hiện tại của bạn, và N
là vector vuông góc với mặt phẳng bạn muốn xoay vào. Nếu M == N
bạn có thể dừng ngay bây giờ và để nguyên điểm gốc không thay đổi.
Tính góc xoay như
costheta = dot(M,N)/(norm(M)*norm(N))
Tính trục quay như
axis = unitcross(M, N)
nơi unitcross
là một hàm thực hiện các sản phẩm chéo và bình thường hóa nó vào một vector đơn vị, ví dụ: unitcross(a, b) = cross(a, b)/norm(cross(a, b))
. Như user1318499 được chỉ ra trong nhận xét, bước này có thể gây ra lỗi nếu M == N
, trừ khi bạn triển khai unitcross
trả lại (0,0,0)
khi a == b
.
Tính ma trận xoay từ trục và góc như
c = costheta
s = sqrt(1-c*c)
C = 1-c
rmat = matrix([ x*x*C+c x*y*C-z*s x*z*C+y*s ],
[ y*x*C+z*s y*y*C+c y*z*C-x*s ]
[ z*x*C-y*s z*y*C+x*s z*z*C+c ])
nơi x
, y
, và z
là các thành phần của axis
. Công thức này được mô tả on Wikipedia.
Đối với mỗi điểm, tính điểm tương ứng của nó trên máy bay mới như
newpoint = dot(rmat, point)
nơi hàm dot
thực hiện phép nhân ma trận.
Đây không phải là duy nhất, tất nhiên; như đã đề cập trong câu trả lời của peterk, có một số lượng vô hạn các phép quay có thể bạn có thể làm cho máy biến đổi bình thường thành M
thành mặt phẳng bình thường thành N
. Điều này tương ứng với thực tế rằng, sau khi bạn thực hiện các bước được mô tả ở trên, sau đó bạn có thể xoay mặt phẳng quanh N
và điểm của bạn sẽ ở các vị trí khác nhau trong khi vẫn ở trong cùng một mặt phẳng. (Nói cách khác, mỗi vòng quay bạn có thể đáp ứng các điều kiện của bạn tương ứng với việc thực hiện quy trình được mô tả ở trên theo sau một vòng quay khác xung quanh N
.) Nhưng nếu bạn không quan tâm đến điểm nào trên mặt phẳng, điểm gió của bạn sẽ tăng lên. trục chung là cách đơn giản nhất để chỉ nhận được điểm vào máy bay bạn muốn họ ở.
Nếu bạn không có M
, nhưng bạn không có tọa độ của các điểm trong mặt phẳng bắt đầu của bạn tương đối đến một nguồn gốc trong mặt phẳng đó, bạn có thể tính toán vectơ bình thường bắt đầu từ vị trí hai điểm x1
và x2
là
M = cross(x1, x2)
(bạn cũng có thể sử dụng unitcross
tại đây nhưng không tạo ra bất kỳ sự khác biệt nào). Nếu bạn có những điểm tọa độ tương đối so với nguồn gốc đó không phải là trong mặt phẳng, bạn vẫn có thể làm điều đó, nhưng bạn sẽ cần ba điểm các vị trí:
M = cross(x3-x1, x3-x2)
Nguồn
2012-02-24 00:56:54
+1 Câu trả lời hay. Các chỉ gripe (đến mức nó tăng lên đến mức độ của một gripe, đó là vấn đề) Tôi có là bạn đã không đề cập đến Quaternion Rotation như là một thay thế có thể để bước 4 và 5. Họ là phần nào hiệu quả hơn. – andand
@andand: thông thường tôi đang làm loại điều này một cách phân tích, vì vậy tôi không hoàn toàn quen thuộc với quaternions. Nhưng nếu tôi có thời gian, tôi sẽ chỉnh sửa nội dung đó. –
Tóm tắt tốt là tại http://en.wikipedia.org/wiki/Quaternion_rotation – andand