【发布时间】:2025-12-01 21:05:02
【问题描述】:
所以我不太精通线性代数,所以我在努力解决这个问题。
我有一个单位向量v。我想找到两个角度(角度 1,围绕 x 轴旋转,角度 2,围绕 z 轴旋转),这样当我通过它们旋转 v 时,它会将矢量 v 与 y 轴对齐。从this 问题我有一个函数可以找到任意向量之间的角度并返回一个旋转。但是这个函数返回 3 个角度。本质上,有无限数量的 3d 旋转将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))
【问题讨论】:
-
即使是那些受限的旋转也不是唯一的(甚至超出了正常的角度对称性)。你在乎你得到哪一个吗?
-
@DavisHerring 嗯,你能举一个例子,说明除了角对称之外不是唯一的两个例子吗?我真的无法想象它......
-
@DavisHerring 对于上下文:我想描述向量的方向(所以没有幅度)。其中中性方向将与 Y 轴对齐。我认为 2 次旋转可以唯一地识别这样一个方向。但从你的评论来看,你说情况并非如此。然后我想知道:什么用(最好)2个参数唯一地描述了3D方向。
-
从 开始,您可以旋转 -90 度到 ,然后旋转 45 度到 或旋转 90 度到 然后再旋转 135。两次旋转可以识别每个可能的方向(或无特征对象的旋转,如点或对称杆通过原点),但不是单射的,因此即使是这种受限类型,这种方向也不能确定唯一的旋转对。这对您的用例可能无关紧要。
-
@DavisHerring 嗯……没错。但是,如果您只能从 -90 度旋转到 +90 度,就不会出现这个问题,对吧?我想要独特旋转的原因是我想稍后比较不同的方向并检查它们是否相同。无论如何,我会检查您的答案是否很快并接受!
标签: python numpy rotation linear-algebra