我一直在搜索这种转换背后的数学问题,到目前为止我能想出的最好的是:
x = sin(horizontal_angle) * cos(vertical_angle)
y = sin(horizontal_angle) * sin(vertical_angle)
z = cos(horizontal_angle)
对于任意角度,这都可以。我遇到问题的地方是其中一个旋转是0度。在0度(或180度,或360度,或......)时,sin()将为零,这意味着无论其他角度如何,我从上述公式中得到的x和y坐标都将为零。被设定为。
那里有更好的配方,在某些角度不会搞砸吗?到目前为止,我的搜索还没有找到,但必须有解决这个问题的方法。
更新 经过一些实验,我发现我的主要误解是我假设我的球坐标的极点是垂直的(如行星上的纬度和经度),而它们实际上是水平的(投射到屏幕中)。这是因为我在屏幕空间工作(x / y映射到屏幕,z投影到屏幕上),而不是传统的3D环境,但不知何故不认为这将是一个促成因素。
最终公式对我来说是正确的方向:
x = cos(horizontal_angle) * sin(vertical_angle)
y = cos(vertical_angle)
z = sin(horizontal_angle) * sin(vertical_angle)
答案 0 :(得分:3)
您的公式适用于所有角度。但是你给角度的名字可能并不完全正确。你所谓的“水平角度”是倾斜角度 - 矢量和z轴之间的角度。因此,如果“水平角度”为0,那么该点位于z轴上,这意味着x和y都是正确的。你所谓的“垂直角度”实际上是xy中的角度平面。如果它为0,则该点位于x-z平面中,因此y正确设置为0。
答案 1 :(得分:1)
正确的转换公式为:
x = r * sin(polar) * cos(alpha)
y = r * sin(polar) * sin(alpha)
z = r * cos(polar)
其中:
r is the Radius
alpha is the horizontal angle from the X axis
polar is the vertical angle from the Z axis
当x
为零(或180,360等)时, y
和polar
正确为零,因为垂直角度与这些值上的垂直Z轴对齐。同样,当alpha
为零(或180,360等)时,水平角度与X轴对齐,因此y
必须为零。当alpha
为90(或270,450等)时,它与Y轴对齐,使x
为零。