Я делал много искать по математике за это преобразование, и лучшее, что я смог придумать до сих пор это:Преобразование 3D полярных координат в декартовой координаты
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 проецируется на экран), а не в традиционную трехмерную среду, но почему-то не думал, что это будет фактором.
Окончательная формула, которая работала для меня, чтобы полюса расположены правильно:
x = cos(horizontal_angle) * sin(vertical_angle)
y = cos(vertical_angle)
z = sin(horizontal_angle) * sin(vertical_angle)
Ваш 'z' должен зависеть только от вертикального угла, а не от горизонтали. – RBarryYoung