我对线性代数不是很精通,所以我在这方面遇到了困难。
我有一个单位向量v
。 我想找到两个角度(angle1和绕x轴的旋转,angle2和绕z轴的旋转),使得当我通过它们旋转v
时,将其与y轴对齐。 从 这个 问题中,我有一个可以找到任意向量之间夹角并返回旋转的函数。 但是,这个函数返回3个角度。基本上有无限数量的三维旋转可以将v
与y轴对齐,因此我需要这两个唯一的角度。
这是我现在拥有的代码,需要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))