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

Aru*_*del 6 geometry space vector angle coordinates

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

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

toDegrees(atan2(A.x-B.x,A.z-B.z))+180
Run Code Online (Sandbox Code Playgroud)

但是这给了我两个向量之间的Y角.我需要找到它们之间的X角.它与使用x,y和z位置值有关.不仅仅是x和z,因为它给出了两个向量之间的Y角.我需要X角,我知道它听起来很模糊,但我不知道如何解释.例如,如果你向上或向下看而不是旋转x轴,你可能在3D空间中有一个摄像头.但是现在我需要获得2个向量之间的"上/下"角度.如果我沿y轴旋转3D相机,则x轴不会改变.因此,与2个载体,不管是什么"Y-角"是他们之间,2个向量之间的x角度西港岛线留如果y角变化,同样因为它的"向上/向下"的角度,像在卡马拉.

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

max*_*000 6

atan2(crossproduct.length,scalarproduct)
Run Code Online (Sandbox Code Playgroud)

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


MvG*_*MvG 5

计算高度角

好吧,我可能最终理解你的评论,关于结果独立于y角度,以及它与两个向量的关系.看起来你并不是真的对两个向量和这两个向量之间的角度感兴趣,而是你对差异向量和水平面形成的角度感兴趣.在水平坐标系(通常用于天文学)中,该角度将被称为"高度"或"高程",而不是您使用(编辑)问题中的公式计算的"方位角"."高度"与相机的" 倾斜 "密切相关,而"方位角"则与" 平移 "有关.

我们仍然有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))
Run Code Online (Sandbox Code Playgroud)

选择顺序(A - B相对于B - A)y,根据下面的评论,"A高于B"产生正高度,因此产生正高度.上面方位角计算中的减号应该替换+ 180你问题中的代码,除了现在的范围是[-180,180]而不是你的[0,360].只是为了给你一个选择,选择你喜欢的.实际上,您可以计算B - A任一方向的方位角.对这两个角度使用不同顺序的事实可能会有些混乱,因此请考虑这是否真的是您想要的,或者您是想要反转高度的符号还是将方位角改变180°.


正交投影

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

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

就个人而言,我只需要调用atan2两次,每次向量调用一次,然后减去结果角度:

toDegrees(atan2(A.z, A.y) - atan2(B.z, B.y))
Run Code Online (Sandbox Code Playgroud)

x=0仅仅是因为我仅操作上是在上述式中的隐式yz.

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

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