您可以通過計算偏航部分,然後應用其反算來去除四元數的偏航部分。假設您的四元數爲quat(w,x,y,z) == w + xi + yj + zk)
,並且圍繞Z軸定義偏航(來自this paper的euler 123或213)。
請注意,在這些幀中,圍繞Z軸的yaw
的旋轉由四元數quat(cos(yaw/2), 0, 0, sin(yaw/2))
表示。
分解四元數到歐拉角,我們已經偏航爲:
yaw = atan2(-2*x*y + 2*w*z, +w*w +x*x -y*y -z*z); // 123 angles (page 24)
yaw = atan2(-2*x*y + 2*w*z, +w*w -x*x +y*y -z*z); // 213 angles (page 28)
從中我們可以推導出
quat quat_2yaw = quat(w*w +x*x -y*y -z*z, 0, 0, -2*x*y + 2*w*z).normalize(); // 123 angles
quat quat_2yaw = quat(w*w -x*x +y*y -z*z, 0, 0, -2*x*y + 2*w*z).normalize(); // 213 angles
一個簡單的方法減半四元數的角度將其添加到身份四元數和規範:
quat quat_yaw = (1 + quat_2yaw).normalize();
要回答你原來的問題 - 我們想從q1
採取偏航,並取代q2
的偏航。我們能做到這一點,如下所示:
q2 = get_quat_yaw(q1) * get_quat_yaw(q2).conj() * q2;
我覺得這是後話http://math.stackexchange.com/ – Ishtar 2011-05-30 15:22:55
感謝這個提示 - didn't知道,一個特殊的數學板存在:) – Raboon 2011-05-31 10:14:35