2012-02-24 80 views
7

Tôi đang làm một cái gì đó mà tôi có một chiếc máy bay trong một điều phối sys A với một tập hợp các điểm đã có trên nó. Tôi cũng có một vectơ bình thường trong không gian N. Làm thế nào tôi có thể xoay các điểm trên phối hợp sys A sao cho mặt phẳng bên dưới sẽ có cùng hướng bình thường như N?Xoay 3D của một mặt phẳng

Tự hỏi nếu có ai có ý tưởng hay về cách thực hiện việc này. Cảm ơn

Trả lời

16

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ó:

  1. 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.
  2. Tính góc xoay như

    costheta = dot(M,N)/(norm(M)*norm(N)) 
    
  3. 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.

  4. 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.

  5. Đố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 x1x2

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) 
+1

+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

+0

@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 đó. –

+1

Tóm tắt tốt là tại http://en.wikipedia.org/wiki/Quaternion_rotation – andand

0

Tôi đang nghĩ tạo một vector đơn vị [0,0,1] và sử dụng dấu chấm dọc hai mặt phẳng để tìm góc khác biệt và chuyển tất cả các điểm của bạn theo các góc đó. Giả sử bạn muốn trục z căn chỉnh với vectơ thông thường, chỉ cần sử dụng [1,0,0] hoặc [0,1,0] cho x và y tương ứng.

+0

Này sẽ không align trục z chỉ ? sẽ có nhiều Dof trong hoặc x hoặc y – bendervader

1

Một véc tơ đơn (bình thường - N) của bạn sẽ không đủ. Bạn sẽ cần hai vectơ khác cho hai chiều còn lại. (Hãy tưởng tượng rằng không gian 3D của bạn vẫn có thể xoay/quay xung quanh vectơ bình thường, và bạn cần thêm 2 vectơ nữa để làm móng nó xuống). Một khi bạn có bình thường và một cái khác trên máy bay, cái thứ ba nên dễ tìm (tay trái hoặc tay phải tùy thuộc vào hệ thống của bạn).

Đảm bảo cả ba được chuẩn hóa (chiều dài 1) và đặt chúng vào ma trận; sử dụng ma trận đó để chuyển đổi bất kỳ điểm nào trong không gian 3D của bạn (sử dụng phép nhân ma trận). Điều này sẽ cung cấp cho bạn các tọa độ mới.

+0

Làm cho tinh thần! Tôi sẽ cần phải tìm ra một cách để có được các vector khác: S Cảm ơn! – bendervader

+2

-1: Câu trả lời này mơ hồ và không đầy đủ. – andand

Các vấn đề liên quan