三维空间坐标系下,点绕定轴的旋转公式;该公式可用于计算透视投影的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;