项目遇到一个问题,就是需要根据原始向量和目标向量求他们两个之间的旋转矩阵,网上结果很少,也有很多错误,因此写了一个,项目中使用过程没出现问题。
原理参考的是知乎大佬的对 Rodrigues' rotation formula 和 知乎 的总结,主要如下:

- import math
- import numpy as np
- origin_vector = np.array([1, 0 ,0])
- location_vector = np.array([0, 0 ,1])
-
- # 注意,如果向量没有归一化,可以先考虑归一化下。
-
- c = np.dot(origin_vector, location_vector)
- n_vector = np.cross(origin_vector, location_vector)
- s = np.linalg.norm(n_vector)
- print(c, s)
-
- n_vector_invert = np.array((
- [0,-n_vector[2],n_vector[1]],
- [n_vector[2],0,-n_vector[0]],
- [-n_vector[1],n_vector[0],0]
- ))
- I = np.eye(3)
- # 核心公式:见上图
- R_w2c = I + n_vector_invert + np.dot(n_vector_invert, n_vector_invert)/(1+c)
- print(R_w2c)