根据旋转前后的两向量值求旋转矩阵
参考:https://www.cnblogs.com/xpvincent/archive/2013/02/15/2912836.html
旋转向量
两个向量间任意旋转都可以用一个旋转轴和一个旋角来表示,于是我们可以用一个向量来表示任意旋转。
理解:
两个向量PQ叉乘得到一个垂直于两向量的向量N,于是,绕着N旋转一个标量角θ。即可让向量P变到向量Q。那么N和θ就可以描述任意两向量的旋转,将它们组成向量:θN,即为旋转向量。
旋转向量与旋转矩阵
除了旋转向量可以表示旋转之外,旋转矩阵也可以表示旋转。它们之间的转换可由罗德里格斯公式实现:
其中的r为本文的N。I为单位向量。
python实现:求取旋转前后的两向量的旋转矩阵
# 代码是在blender环境中跑的,只需将Vector和Matrix转换到numpy版本即可在普通python环境中跑
// T_location 是目标向量
T_location = Vector((1.0 , 0 ,.0))
T_location_norm = T_location.copy()
T_location_norm.normalize()
// originVector是原始向量
originVector = Vector((.0 , .0 ,1.0))
print(T_location_norm)
// @是向量点乘
sita = math.acos(T_location_norm@originVector)
n_vector = T_location_norm.cross(originVector)
n_vector.normalize()
n_vector_invert = Matrix((
[0,-n_vector[2],n_vector[1]],
[n_vector[2],0,-n_vector[0]],
[-n_vector[1],n_vector[0],0]
))
print(sita)
print(n_vector_invert)
I = Matrix((
[1 , 0 , 0],
[0 , 1 , 0],
[0 , 0 , 1]
))
// 核心公式:见上图
R_w2c = I + math.sin(sita)*n_vector_invert + n_vector_invert@(n_vector_invert)*(1-math.cos(sita))