Python 查找旋转矩阵以对齐两个向量

Python 查找旋转矩阵以对齐两个向量,python,rotation,Python,Rotation,我试图找到旋转矩阵来对齐两个向量 我有一个向量a=[ax,ay,az],我想把它和向量B=[1,0,0](x轴单位向量)对齐 我找到了以下解释并尝试实施: 当我应用它来寻找一个点的旋转时,我得到的是: x_axis = np.array([1, 0, 0], dtype=np.float64) direction = np.array([-0.02, 1.004, -0.02], dtype=np.float64) Ralign = align_vectors(x_axis, direction

我试图找到旋转矩阵来对齐两个向量

我有一个向量a=[ax,ay,az],我想把它和向量B=[1,0,0](x轴单位向量)对齐

我找到了以下解释并尝试实施:

当我应用它来寻找一个点的旋转时,我得到的是:

x_axis = np.array([1, 0, 0], dtype=np.float64)
direction = np.array([-0.02, 1.004, -0.02], dtype=np.float64)
Ralign = align_vectors(x_axis, direction)
point = 1000 * np.array([-0.02, 1.004, -0.02], dtype=np.float64) # Point in the direction of the unit vector
result = Ralign.dot(point)

结果点未与单位向量对齐。

如果只想旋转一个向量
a
b
对齐,而不是整个坐标包含该向量,请使用简单向量投影和
a
的长度:

a_norm = np.linalg.norm(a)
b_norm = np.linalg.norm(b)
result = b * a_norm / b_norm
下面修复了输入不是逐向量归一化的单位向量的问题

def align_向量(a,b):
b=b/np.linalg.norm(b)#规范化a
a=a/np.linalg.norm(a)#规范化b
v=np.交叉(a,b)
#s=np.线性范数(v)
c=np.点(a,b)
v1,v2,v3=v
h=1/(1+c)
Vmat=np.array([[0,-v3,v2],
[v3,0,-v1],
[-v2,v1,0]]
R=np.eye(3,dtype=np.float64)+Vmat+(Vmat.dot(Vmat)*h)
返回R
测试:


def角度(a、b):
“向量之间的角度”
a=a/np.线性范数(a)
b=b/np.线性范数(b)
返回np.arccos(a.dot(b))
点=np.数组([-0.02,1.004,-0.02])
方向=np.数组([1,0,0.]))
旋转=对齐向量(点、方向)
#沿与方向对齐的方向旋转点。结果向量与方向对齐
结果=旋转。点(点)
打印(结果)
打印('角度:',角度(方向,点))#0.0
print('Length:',np.isclose(np.linalg.norm(point),np.linalg.norm(result))#True
#按矩阵旋转方向,结果与方向不对齐,但原始向量(方向)与结果2之间的角度相同。
结果2=旋转点(方向)
打印(结果2)
打印('相同角度:',np.isclose(角度(点,结果),角度(方向,结果2))#真
print('Length:',np.isclose(np.linalg.norm(direction),np.linalg.norm(result2))#True

数学交换中的答案假设
a
b
是单位向量。您需要重新计算,以便在计算中包括长度。或者先让它们正常化。非常感谢。这个方法看起来非常类似于罗德里格斯公式。但是,正弦系数不适用于倾斜矩阵。知道为什么推荐使用这种形式吗?这里的旋转矩阵将
a
b
对齐(将
a
投影到
b
上,并保持长度不变)。因此,将
a
表示的向量空间与
b
对齐。罗德里格斯围绕向量
k
旋转坐标系。见维基百科。结果向量与
k
(在wiki上)对齐,当且仅当输入向量为。画一些图表来看看这些向量是如何关联的。谢谢。我可以看出这两者是相关的,可以根据我们现有的信息来使用。如果第二个命名为“罗德里格斯公式”,那么第一个命名为什么?
a_norm = np.linalg.norm(a)
b_norm = np.linalg.norm(b)
result = b * a_norm / b_norm