如何计算 3D 中具有给定轴法线的 2 个向量之间的符号角?

How to calculate the signed angle between 2 vectors with a given axis normal in 3D?

假设如果我有两个向量,A 和 B,以及一个轴(归一化向量),我如何找到 A 和 B 之间的角度,使得旋转后 A 和 B 之间的角度差给定轴的 wrt 为 0。旋转后 A 不必等于 B。基本上我想找到指定平面中A和B之间的角度差。

注意:这不同于寻找 2 个向量之间的最短角度,因为轴不是 A 和 B 之间的叉积。因此,技术 here(以及许多 SO 答案)不适用。这需要在 3D 模式下工作。

我不认为这个问题有解决方案,除非 A 和 B 的长度相同并且 A 和 B 都与轴成相同的角度(通常意义上的向量之间的最短角度)。我会假设这些都是给定的。

在这种情况下,一种解决方案是计算 A 和 B 到与轴正交的平面的正交投影。这可以通过减去轴方向的分量来完成。因此,如果我在轴的方向上有一个单位向量并将其称为 X,则计算将类似于

Aproj = A - dot(A, X)X
Bproj = B - dot(B, X)X

那么AprojBproj之间的夹角(通常意义上的最短角)就是你问的绕轴旋转的角度。

我不确定这是否是最简单的计算方法,但它应该可以正常工作。

点积给出了 A 和 B 之间的角度。 在 Fortran 中类似于:dotAB = DASIN(DOT(A/|A|, B/|B|)).

叉积给出与 A 和 B 正交的向量。

乘以角度 DotAB 时,Xproduct 向量向平面(或轴)的投影应该可以到达那里。你可能在那里是正弦或余弦。