两个3D矢量之间的X角?

时间:2012-09-01 17:41:19

标签: vector geometry coordinates space angle

我有两个叫做A和B的3D矢量,它们都只有一个3D位置。我知道如何通过以下方式找到沿着单位圆的角度(0-360度)和atan2函数:

编辑:(我的atan2功能毫无意义,现在应该找到2个向量之间的“y-angle”):

toDegrees(atan2(A.x-B.x,A.z-B.z))+180

但是这给了我两个向量之间的Y角。 我需要找到它们之间的X角。它与使用x,y和z位置值有关。不仅仅是x和z,因为它给出了两个向量之间的Y角。 我需要X角,我知道它听起来很模糊,但我不知道如何解释。例如,如果你向上或向下看而不是旋转x轴,你可能在3D空间中有一个摄像头。但是现在我需要获得2个向量之间的“上/下”角度。如果我沿y轴旋转3D相机,则x轴不会改变。因此,使用2个向量,无论它们之间的“y角度”是什么,如果y角度改变,2个向量之间的x角将保持相同,因为它是“向上/向下”角度,就像在camara中一样

请帮帮忙?我只需要一行数学/伪代码或解释。 :)

3 个答案:

答案 0 :(得分:6)

atan2(crossproduct.length,scalarproduct)

使用atan2而不是arccos或arcsin的原因是准确性。 arccos表现得非常接近0度。参数中的小计算错误将导致结果中不成比例的大错误。 arcsin有接近90度的相同问题。

答案 1 :(得分:5)

计算高度角

好的,我可能最终理解你的评论,关于结果独立于 y 角度,以及它与两个向量的关系。看来你对两个向量和之间的角度并不感兴趣,而是你对差异向量和一个人在水平面上形成的角度。在horizontal coordinate system(通常用于天文学)中,该角度将被称为“高度”或“高度”,而不是您使用(编辑)问题中的公式计算的“方位角”。 “高度”与相机的“tilt”密切相关,而“方位角”则与“panning”有关。

我们仍有2D问题。 2D矢量的一个坐标是差矢量的 y 坐标。另一个坐标是在水平面上投影后的矢量长度,即sqrt(x*x + z*z)。最终的解决方案是

x = A.x - B.x
y = A.y - B.y
z = A.z - B.z
alt = toDegrees(atan2(y, sqrt(x*x + z*z)))
az = toDegrees(atan2(-x, -z))

根据下面的评论选择顺序(A - B而不是B - A),使得“A高于B”产生正y,因此产生正高度。上面方位角计算中的减号应该替换你问题代码中的+ 180,除了现在的范围是[-180,180]而不是你的[0,360]。只是为了给你一个选择,选择你喜欢的。实际上,无论哪种方式都可以计算B - A的方位角。你对这两个角度使用不同的顺序这一事实可能有些令人困惑,所以想想这是否真的是你想要的,或者是否要反转高度的符号或将方位角改变180°。


正交投影

作为参考,我将在下面列出我原来的答案,对于那些实际上正在寻找围绕某个固定x轴的旋转角度的人,原始问题建议的方式。

如果您在问题中提到的 x angle 确实是围绕 x 轴的旋转角度,正如相机示例所示,那么您可能想要考虑一下这样:将 x 坐标设置为零,最终将在 yz 平面中使用2D矢量。您可以将此视为对平原的正交投影。现在你回到2D问题并且可以在那里解决它。

就我个人而言,我只需拨打atan2两次,每个矢量一次,然后减去产生的角度:

toDegrees(atan2(A.z, A.y) - atan2(B.z, B.y))

x=0隐含在上述公式中,因为我只对yz进行操作。

我还没有完全理解你的单atan2电话背后的逻辑,但事实上我必须长时间考虑它,这表明我不想维持它,至少在没有好的解释性评论。

我希望我能正确理解你的问题,这就是你要找的东西。

答案 2 :(得分:4)

就像二维矢量一样,你可以通过求解点积的cos来计算它们的角度

Dot product of a 3d vector
您不需要 atan ,因为它是矢量的基本操作,所以您总是选择点积,然后使用 acos 来获取角度。

double angleInDegrees = acos ( cos(theta) ) * 180.0 / PI;