【问题标题】:How to multiply two quaternions如何将两个四元数相乘
【发布时间】:2013-11-13 14:38:10
【问题描述】:

我有两个四元数,例如:

    w     x     y     z
1:  0.98  0.08  0.17  -0.01
2:  0.70  0.70  0.0   0.0

我需要将它们相乘,得到第三个,其中包含所有旋转,但没有想法。 如果 PHP / C++ / PAWN 中有一个函数来做这样的事情就完美了。

我搜索了很多,但几乎没有找到让我理解的内容。

感谢您的回答。

【问题讨论】:

标签: php c++ function 3d quaternions


【解决方案1】:

您应该选择一种语言。在 C++ 中,Boost.Math 库包括 quaternions;我不知道你提到的其他语言。或者对于简单的乘法,你可以使用乘法表(我从Wikipedia复制的):

*| 1  i  j  k
-------------
1| 1  i  j  k
i| i -1  k -j
j| j -k -1  i
k| k  j -i -1

例如,i*j 给出i 行和j 列中的值,即k

所以,假设你的四元数代表w*1 + x*i + y*j + z*k,乘法将类似于

quaternion operator*(quaternion a, quaternion b) {
    return {
        a.w * b.w - a.x * b.x - a.y * b.y - a.z * b.z,  // 1
        a.w * b.x + a.x * b.w + a.y * b.z - a.z * b.y,  // i
        a.w * b.y - a.x * b.z + a.y * b.w + a.z * b.x,  // j
        a.w * b.z + a.x * b.y - a.y * b.x + a.z * b.w   // k
    };
}

(注意:这是未经测试的,可能有错别字)。

【讨论】:

    【解决方案2】:

    好的,所以在wiki之后。

    我会做这样的事情:

    class Quaternion{
    double w,x,y,z;
    
    public:
     Quaternion(double w, double x, double y, double z) : w(w), x(x), y(y), z(z) {};
    
     operator*(const Quaternion& rhs){
       double _w, _x, _y, _z;
       //compute new values
       _w = w*rhs.w - x*rhs.x - y*rhs.y - z*rhs.z;
       _y = /* after wiki */;
       _x = /* after wiki */;
       _z = /* after wiki */;
    
       //update values
       w = _w; x = _x; y = _y; z = _z; 
     }
    }
    

    即做一个有 4 个实数的对象,写一个算子来计算新的系数。

    【讨论】:

      【解决方案3】:

      将假想的xi+yj+zk表示为向量,Qc{Wc,Vc} = Qa{Wa,Va} * Qb{Wb,Vb}的乘法如下: Qc{Wc,Vc} = {WaWb + WaVb + WbVa + VaVb}.

      VaVb = -(Va dot Vb) + (Va cross Vb)【前者为scaler,后者为vector】,然后对scaler和vector进行分组: Qc{Wc,Vc} = {WaWb + -(Va dot Vb), WaVb + WbVa + (Va cross Vb)}.

      【讨论】:

        猜你喜欢
        • 2013-09-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-23
        • 1970-01-01
        • 2022-10-19
        • 1970-01-01
        相关资源
        最近更新 更多