给定一个单位向量,找出使该向量与轴对齐的两个旋转角度
所以我不太精通线性代数,所以我正在努力解决这个问题。
我有一个单位向量v。我想找到两个角度(角度 1,绕 x 轴旋转,角度 2,绕 z 轴旋转),这样当我旋转v它们时,矢量v与 y 轴对齐。从这个问题我有一个函数可以找到任意向量之间的角度并返回一个旋转。但是这个函数返回 3 个角度。本质上有无数个v与 y 轴对齐的 3d 旋转,所以我想要两个独特的角度。
这是我现在拥有的代码,它需要 numpy 和 scipy:
import numpy as np
import random
from scipy.spatial.transform import Rotation as R
def rotation_from_unit_vectors(a, b):
v = np.cross(a, b)
c = np.dot(a, b)
s = np.linalg.norm(v)
kmat = np.array([[0, -v[2], v[1]], [v[2], 0, -v[0]], [-v[1], v[0], 0]])
rotation_matrix = np.eye(3) + kmat + kmat.dot(kmat) * ((1 - c) / (s ** 2))
return R.from_matrix(rotation_matrix)
y_axis = np.asarray([0.0, 1.0, 0.0])
alpha = random.uniform(0, 10)
beta = random.uniform(0, 10)
gamma = random.uniform(0, 10)
v = np.asarray([alpha, beta, gamma])
v = v / np.linalg.norm(v)
r = rotation_from_unit_vectors(v, y_axis)
print(r.as_euler('xyz', degrees = True))
print(r.apply(v))