我一直在对这种转换背后的数学进行大量搜索,到目前为止我能想到的最好的结果是:
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)