我试图旋转vector1(红色),使其与vector2(蓝色)在三维空间中对齐。但是,只能绕X轴和Z轴旋转。
到目前为止,我已经用一种优化算法解决了这个问题,这种算法试图最小化矢量之间围绕X轴和Z轴的Angular 。这种方法在大多数情况下都很有效,但由于我必须计算大量的矢量,所以速度太慢了。
用于优化方法的代码:
vector1 = np.array([0., -1., 0.])
vector2 = np.array([0.2, -0.2, -0.5])
def find_a_c(x, *args):
vector1, vector2 = args[0], args[1]
angle_x, angle_z = x[0], x[1]
# Rotation matrices to rotate around X and Z
Rx = np.array([[1., 0., 0.],
[0., np.cos(angle_x), -np.sin(angle_x)],
[0., np.sin(angle_x), np.cos(angle_x)]])
Rz = np.array([[np.cos(angle_z), -np.sin(angle_z), 0.],
[np.sin(angle_z), np.cos(angle_z), 0.],
[0., 0., 1.]])
vector1 = vector1.dot(Rx).dot(Rz)
# calulate the angle between the vectors around X and Z
angle_x = angle_between_vectors([vector2[1], vector2[2]], [vector1[1], vector1[2]])
angle_z = angle_between_vectors([vector2[0], vector2[1]], [vector1[0], vector1[1]])
return np.abs(angle_x) + np.abs(angle_z)
solution = minimize(fun=find_a_c,
x0=[0., 0.],
args=(vector1, vector2))
angle_x, angle_z = solution.x[0], solution.x[1]
print("Angle around X: {}°\nAngle around Z: {}°".format(np.rad2deg(angle_x), np.rad2deg(angle_z)))
印刷品:
Angle around X: -60.46948402478365°
Angle around Z: -45.0000003467713°
现在我在寻找一种解析方法来解决我的问题。例如,用两个旋转Angular (围绕X和Z)形成的旋转矩阵来对齐vector1和vector2。
1条答案
按热度按时间q8l4jmvw1#
这是一个数学问题,我不知道该怎么写,但你可以这样做。如果你先绕X轴旋转,然后绕Z轴旋转,最后一次旋转不会改变z投影。如果
(a, b, c)
是起始赋范向量,(x, y, z)
是结束赋范向量,你可以写b * sin(f) + c * cos(f) = z
,基于绕X轴的旋转矩阵。其中f
是绕X轴的旋转Angular 。然后根据维基百科的等式(似乎不太正确:sng(c)部分应删除),您可以找到f
的值。因此,您可以计算X轴旋转矩阵,并获得应用此旋转(a', b', c')
后的向量。然后将其乘以Z轴旋转矩阵,并为x
和y
写等式,您可以找到Z轴旋转Angular 的sin和cos值。