2010-05-21 41 views
9

Tôi có hai vectơ mô tả phép quay; một vòng quay bắt đầu A và một vòng quay mục tiêu B. Làm thế nào tốt nhất tôi nên đi về phép nội suy A theo hệ số F để tiếp cận B?Làm cách nào để nội suy các phép quay?

Sử dụng một lerp đơn giản trên vectơ không hoạt động khi nhiều thứ nguyên cần được nội suy (tức là tạo ra các phép quay không mong muốn). Có thể xây dựng quaternions từ vectơ quay và sử dụng slerp là con đường để đi. Nhưng làm thế nào, sau đó, tôi có thể trích xuất một vector mô tả các vòng quay mới từ quaternion kết quả?

Xin cảm ơn trước.

+0

Bạn có thể giải thích rõ hơn một chút tại sao SLERP không hoạt động cho bạn không? Bạn ngụ ý gì khi nội suy nhiều hơn một chiều, tôi tin rằng nó chỉ bắt đầu tại một điểm (vector A) và kết thúc bằng một vector khác (vector B) tạo vòng quay ngắn nhất xung quanh gốc. – catchmeifyoutry

+0

Bởi nhiều hơn một chiều, tôi có nghĩa là nhiều hơn một trục, ví dụ: một vòng quay xung quanh X và Y cùng một lúc, trái ngược với việc chỉ xoay quanh một trục đơn. Và đây là khi LERP thất bại. – uhuu

+0

Về cơ bản, điều đó không có ý nghĩa gì nhiều, vì mỗi vòng xoay xung quanh nhiều trục là * tương đương * với một vòng quay về một số trục khác. Vì vậy, thực sự không có lý do tại sao nội suy tuyến tính sẽ không hoạt động trong mọi trường hợp. – Joren

Trả lời

2

Vâng, cách tiếp cận slerp của bạn sẽ hoạt động và có lẽ là tính toán hiệu quả nhất (mặc dù có một chút khó khăn để hiểu). Để quay trở lại từ quaternion đến vectơ, bạn cần sử dụng một bộ công thức mà bạn có thể tìm thấy here.

Ngoài ra còn có một chút mã có liên quan here, mặc dù tôi không biết liệu nó có tương ứng với cách bạn có dữ liệu được biểu thị hay không.

+0

Cảm ơn bạn. Tôi đã xoay sở để lấy lại vectơ từ Quaternion. Các thiết lập bằng cách sử dụng SLERP hoạt động tốt nếu tôi chỉ nội suy trên một trục. Tuy nhiên, khá tò mò với tôi, SLERP tạo ra hành vi tương tự như LERP vector đơn giản khi sử dụng nhiều hơn một trục, nghĩa là, vòng xoay nhảy xung quanh một cách dữ dội vào những thời điểm. Bất kỳ ý tưởng? – uhuu

+1

Có vẻ như bạn đang bị khóa gimbal; đại diện xoay như một vector chỉ hoạt động nếu bạn đại diện cho nó trong tọa độ bên phải: http://en.wikipedia.org/wiki/Gimbal_lock –

+0

Uhuu, bạn có thể làm rõ những gì bạn có nghĩa là "quay xung quanh nhiều trục"? Khi bạn thực hiện slerp giữa quaternions a và b, bạn xoay quanh một trục; trục của quaternion c, trong đó c = b * a^-1 – SuperElectric

1

Nếu bạn đã quyết định đi với Quaternions (mà sẽ slerp rất độc đáo), xem câu trả lời của tôi ở đây trên nguồn lực để thực hiện Quaternions: Rotating in OpenGL relative to the viewport

Bạn sẽ tìm thấy nhiều ví dụ trong các liên kết trong bài đó.

9

Vì tôi dường như không hiểu câu hỏi của bạn, đây là một chút thực hiện SLERP trong python sử dụng gọn gàng. Tôi vẽ kết quả bằng cách sử dụng matplotlib (v.99 cho Axes3D). Tôi không biết nếu bạn có thể sử dụng python, nhưng trông giống như thực hiện SLERP của bạn? Dường như với tôi để cho kết quả tốt ...

from numpy import * 
from numpy.linalg import norm 

def slerp(p0, p1, t): 
     omega = arccos(dot(p0/norm(p0), p1/norm(p1))) 
     so = sin(omega) 
     return sin((1.0-t)*omega)/so * p0 + sin(t*omega)/so * p1 


# test code 
if __name__ == '__main__': 
    pA = array([-2.0, 0.0, 2.0]) 
    pB = array([0.0, 2.0, -2.0]) 

    ps = array([slerp(pA, pB, t) for t in arange(0.0, 1.0, 0.01)]) 

    from pylab import * 
    from mpl_toolkits.mplot3d import Axes3D 
    f = figure() 
    ax = Axes3D(f) 
    ax.plot3D(ps[:,0], ps[:,1], ps[:,2], '.') 
    show() 
4

Một đơn giản LERP (và renormalizing) chỉ hoạt động tốt khi các vectơ là rất gần nhau, nhưng sẽ dẫn đến kết quả không mong muốn khi các vectơ là xa nhau.

Có hai lựa chọn:

Simple chéo sản phẩm:

Xác định trục n đó là trực giao với cả A và B sử dụng một sản phẩm chéo (chăm sóc khi các vectơ được liên kết) và tính góc a giữa A và B bằng cách sử dụng sản phẩm chấm. Bây giờ bạn có thể dễ dàng tiếp cận B bằng cách cho phép một đi 0-một (điều này sẽ được Anew và áp dụng các chuyển động quay của Anew về trục n trên A.

Quaternions:

Tính quaternion q di chuyển A đến B và nội suy q với quaternion nhận dạng I bằng SLERP. Kết quả quaternion qNew sau đó có thể được áp dụng trên A.

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