计算高度角
好的,我可能终于理解了你在下面评论中关于结果与 y 角无关以及它如何与两个向量相关的问题。似乎你并不真正关心 两个 向量和这两个向量之间的夹角,而是关心 差向量 和一个相对水平面成的角度。在水平坐标系(常用于天文学)中,该角度称为“高度”或“仰角”,与你的相机的“倾斜”密切相关,而“方位角”则与“平移”有关,在你修改后的问题中使用公式计算“方位角”。
我们仍然有一个二维问题。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坐标设置为零,那么您将得到y-z平面上的2D向量。您可以将其视为对该平面的正交投影。现在您又回到了一个2D问题,可以在那里解决它。
个人建议只需两次调用atan2
,一次用于每个向量,并减去所得到的角度:
toDegrees(atan2(A.z, A.y) - atan2(B.z, B.y))
上述公式中的
x=0
是隐含的,因为我只对
y
和
z
进行操作。
目前我还没有完全理解你单个
atan2
调用背后的逻辑,但是,我需要这么长时间思考它的事实表明,如果没有很好的解释性注释,我不想维护它。
我希望我正确地理解了你的问题,这就是你正在寻找的东西。