将3D极坐标转换为笛卡尔坐标

3

我一直在研究这种转换背后的数学原理,目前为止,我所找到的最好的解释如下:

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)

你的 z 值应该只与垂直角度有关,而不是水平角度。 - RBarryYoung
当你有(0,1,0)时,你失去了水平角度的信息。 - Near
3个回答

8
正确的转换公式为:
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”和“y”在极角为零(或180、360等)时正确为零,因为垂直角度与垂直Z轴对齐。同样,当“alpha”为零(或180、360等)时,水平角度与X轴对齐,所以“y”必须为零。当“alpha”为90(或270、450等)时,它与Y轴对齐,使“x”为零。

5

你的公式对于所有角度都是正确的。但你给这些角度起的名字可能不太准确。你所称之为“水平角度”实际上是倾斜角度-即向量与z轴之间的角度。因此,如果“水平角度”为0,则点位于z轴上,这意味着将x和y都设置为0是正确的。你所说的“垂直角度”实际上是在x-y平面上的角度。如果它为0,则该点位于x-z平面上,因此将y设置为0是正确的。


0

使用维基百科上的极坐标转换中的公式,我的计算结果如下:

x = r * cos(polar) * cos(alpha)
y = r * cos(polar) * sin(alpha)
z = r * sin(polar)

其中:

r     is the Radius
alpha is the horizontal angle from the X axis
polar is the vertical angle made by r vector with the x-y plane 
      ( 90 - <angle with Z axis> )

然后意识到@RBarryYoung的答案是正确的,而我的答案也是正确的,只是考虑了不同的角度。只是我没有在他的答案中使用正确的Z轴角度,而是它的补角(90-极角)由向量与x-y平面形成的角度。所以请考虑这一点。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接