我一直在搜索这个转换背后的数学,我到目前为止能够想出的最好的是:
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坐标都将为零 . 被设定为 .
有没有一个更好的配方,在某些角度不会搞砸?到目前为止我的搜索还没有找到,但必须有解决这个问题的方法 .
Update: 经过一些实验,我发现我的主要误解是我假设我的球坐标的极点是垂直的(如行星上的纬度和经度),而它们实际上是水平的(投射到屏幕中) . 这是因为我认为这将是一个促成因素 .
最终公式对我来说是正确的方向:
x = cos(horizontal_angle) * sin(vertical_angle)
y = cos(vertical_angle)
z = sin(horizontal_angle) * sin(vertical_angle)
2 回答
您的公式适用于所有角度 . 但是你给角度的名字可能并不完全正确 . 你所谓的“水平角度”是倾斜角度 - 矢量和z轴之间的角度 . 因此,如果“水平角度”为0,那么该点位于z轴上,这意味着x和y都是正确的 . 你所谓的“垂直角度”实际上是xy中的角度平面 . 如果它为0,则该点位于x-z平面中,因此y正确设置为0 .
正确的转换公式是:
哪里:
当
polar
为零(或180,360等)时,x
和y
正确为零,因为垂直角度与这些值上的垂直Z轴对齐 . 同样,当alpha
为零(或180,360等)时,水平角度与X轴对齐,因此y
必须为零 . 当alpha
为90(或270,450等)时,它与Y轴对齐,使x
为零 .