vector - 两个3D向量之间的X角?

标签 vector geometry coordinates space angle

我有两个分别称为A和B的3D矢量,它们都只有一个3D位置。我知道如何使用atan2函数查找沿单位圆在0-360度范围内的角度,方法是:

编辑:(我的atan2函数没有意义,现在它应该在2个向量之间找到“y角”):

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

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

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

最佳答案

计算高度角

好的,可能是我终于理解了您在下面的评论中,关于该结果与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角确实是围绕x轴的旋转角度(如相机示例所示),那么您可能需要这样考虑:将x坐标设置为零,最后得到yz平面中的2D向量。您可以将其视为在所述平原上的正交投影。现在您又回到了二维问题,可以在那里解决它。

就我个人而言,我只需简单地两次调用atan2,每个向量一次,然后减去所产生的角度:
toDegrees(atan2(A.z, A.y) - atan2(B.z, B.y))
x=0在上面的公式中是隐式的,仅因为我仅对yz进行操作。

我还没有完全理解单个atan2调用背后的逻辑,但是我不得不花这么长时间考虑这一事实表明,我不想维护它,至少没有很好的解释性注释。

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

关于vector - 两个3D向量之间的X角?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12229950/

相关文章:

c# - 将C#数组传递给C++ vector

algorithm - OpenStreetMap:获取公园的所有入口

python - 在 Python 中创建二维坐标图

python - 来自两个向量的3D转换矩阵

python - 如何使用 Y 轴值将坐标值聚集到行中?

java - 从 GridBagLayout 中的特定坐标获取组件

java - 如何让物体持续跟随用户手指坐标?不拖动对象。物体跟随手指

c++ - 传递给函数的 vector 没有被修改

c++ - 搜索字符串 C++ 的结构 vector

c++ - 对于 C++ 中的给定类,是否可以将同一类对象的 vector 作为私有(private)变量?