四元数乘法 Multiplying Quaternions

整理四元数乘法代码实现、组合顺序以及左右乘旋转约定。

四元数乘法 Multiplying Quaternions

根据我们之前的数学推理,可知 单位四元数 乘法表示组合旋转

q绕 x 轴旋转90 度p绕 y 轴旋转30 度qp先绕 y 轴旋转30 度,再绕 x 轴旋转90 度\begin{align*} q & \quad \text{绕} \ x \ \text{轴旋转} 90 \ \text{度} \\ p & \quad \text{绕} \ y \ \text{轴旋转} 30 \ \text{度} \\ qp & \quad \text{先绕} \ y \ \text{轴旋转} 30 \ \text{度,} \text{再绕} \ x \ \text{轴旋转} 90 \ \text{度} \end{align*}
Quaternion Mul(Quaternion q, Quaternion p) {
    Quaternion result;
 
    result.x =   p.x * q.w  + p.y * q.z - p.z * q.y + p.w * q.x;
    result.y = -(p.x * q.z) + p.y * q.w + p.z * q.x + p.w * q.y;
    result.z =   p.x * q.y  - p.y * q.x + p.z * q.w + p.w * q.z;
    result.w = -(p.x * q.x) - p.y * q.y - p.z * q.z + p.w * q.w;  
 
    return result;
}

四元数相乘也可以表示为向量计算

qp=(pwqv+qwpv+qv×pv , pwqwqvpv)qp = ( p_w\vec{q}_v + q_w\vec{p}_v + \vec{q}_v \times \vec{p}_v \ , \ p_w q_w - \vec{q}_v \cdot \vec{p}_v)
Quaternion Mul_AlternateImplementation(Quaternion q, Quaternion p) {
    Vector3 q_v = Vector3(q.x, q.y, q.z);
    Vector3 p_v = Vector3(p.x, p.y, p.z);
 
    float q_r = q.w;
    float p_r = p.w;
 
    float scalar = q_r * p_r - Dot(q_v, p_v)
    // Assume + is vector addition here
    Vector3 vector = Scale(p_v, q_r) + Scale(q_v, p_r) + Cross(q_v, p_v);
 
    Quaternion result;
    result.w = scalar;
    result.x = vector.x;
    result.y = vector.y;
    result.z = vector.z;
    return result;
}