罗德里格旋转公式

1,307 阅读1分钟

三维空间坐标系下,点绕定轴的旋转公式;该公式可用于计算透视投影的eye,target和up。

已知旋转向量 V(u, v, w);旋转轴K(x, y z);旋转角度θ; 求旋转后的向量 V’。

V’ = Vcosθ + (K × V)sinθ + K(K · V)(1 - cosθ);

V’x = ucosθ + (yw - zv)sinθ + x(xu + yv + zw)(1 - cosθ);
V’y = vcosθ + (zu - xw)sinθ + y(xu + yz + zw)(1 - cosθ);
V’z = wcosθ + (xv - yu)sinθ + z(xu + yz + zw)(1 - cosθ);

附录代码实现:

export type V = [number, number, number];

/**
* 罗德里格旋转公式
* @param t 旋转向量
* @param k 旋转轴
* @param r 旋转角度
*/
function rodrigo(t: V, k: V, r: number) {
    const [u, v, w] = t;
    const [x, y, z] = k;
    const sin = Math.sin(r);
    const cos = Math.cos(r);
    const m = (x * u + y * v + z * w) * (1 - cos);
    const result: V = [
        u * cos + (y * w - z * v) * sin + x * m,
        v * cos + (z * u - x * w) * sin + y * m,
        w * cos + (x * v - y * u) * sin + z * m,
    ];
    return result;
}

export default rodrigo;