2020年3月2日 星期一

四元數( Quaternion )的 Inverse 運算

四元數( Quaternion )的 Inverse 運算

前言

  最近發現需要四元數( Quaternion )的 Inverse 運算,發現以前的觀念是錯的,在此把學習的過程做個紀錄。

內容

  在我以前的觀念裡,Inverse 運算只要將 X 、 Y 與 Z 乘上 -1 即可,但最近發現這樣算出來會是錯的,在搜尋後找到 [ www.quora.com ]How do I find the inverse of a quaternion? ,在該文中還多做一個步驟,就是 X 、 Y 、 Z 與 W 都還要除以 Magnitude ,所以整個詳細的流程如下
struct Quaternion
{
  float x;
  float y;
  float z;
  float w;
};
Quaternion Inverse(Quaternion& quat)
{
  Quaternion tagQuat={0};
  float magnitude = 
    ( quat.x * quat.x ) +
    ( quat.y * quat.y ) +
    ( quat.z * quat.z ) +
    ( quat.w * quat.w );
  if( magnitude == 0.0f)
    return tagQuat;
  //
  tagQuat.x = -quat.x / magnitude;
  tagQuat.y = -quat.y / magnitude;
  tagQuat.z = -quat.z / magnitude;
  tagQuat.w = quat.w / magnitude;
  return tagQuat;
}
要注意的是 Magnitude 可能是零,而將 X 、 Y 與 Z 乘上 -1 這個結果稱為 Conjugate。

參考資料

[ www.quora.com ]How do I find the inverse of a quaternion?

沒有留言:

張貼留言