Как правильно преобразовывать в сферические координаты? Всем здравствуйте, возник вопрос по переводу декартовых координат в сферические и обратно. Просмотрел формулы на википедии, поспрашивал в чате. Сделал конвертер:using System.Collections; using System.Collections.Generic; using UnityEngine; public static class SphericalConverter { public static Vector3 CartesianToSpherical(Vector3 cartesianCoordinates) { float x = cartesianCoordinates.x; float y = cartesianCoordinates.y; float z = cartesianCoordinates.z; return new Vector3(Mathf.Sqrt(x*x+y*y+z*z),Mathf.Acos(z/ Mathf.Sqrt(x * x + y * y + z * z)), Mathf.Atan2(y,x)); } public static Vector3 SphericalToCartesian(Vector3 sphericalCoordinates) { float r = sphericalCoordinates.x; float theta = sphericalCoordinates.y; float phi = sphericalCoordinates.z; return new Vector3(r * Mathf.Sin(theta) * Mathf.Cos(phi), r * Mathf.Sin(theta) * Mathf.Sin(phi), r * Mathf.Cos(theta)); } } Проверил что работают взяв координаты точки и прогнав туда-обратно через обе функции получил ту же самую точку, но сферические координаты задаются не по ISO (фи[0 до 360] тета [-90 до 90]), а в другом представлении (фи[0-180] тета [-180 до 180]). Перевод нужен именно пользователю, который задаёт сферические координаты, и для просчёта длин отрезков/площадей. Подскажите пожалуйста как исправить код к таким координатам.
Для перевода в другое представление сферических координат вам нужно просто поменять способ вычисления углов theta и phi в методе CartesianToSpherical. Вот как это можно сделать:
public static class SphericalConverter { public static Vector3 CartesianToSpherical(Vector3 cartesianCoordinates) { float x = cartesianCoordinates.x; float y = cartesianCoordinates.y; float z = cartesianCoordinates.z; float r = Mathf.Sqrt(x*x + y*y + z*z); float phi = Mathf.Acos(z / r); // от 0 до 180 градусов float theta = Mathf.Atan2(y, x); // от -180 до 180 градусов // Преобразование theta к интервалу [-180, 180] theta = theta * Mathf.Rad2Deg; if (theta > 180) { theta -= 360; } return new Vector3(r, phi * Mathf.Rad2Deg, theta); } public static Vector3 SphericalToCartesian(Vector3 sphericalCoordinates) { float r = sphericalCoordinates.x; float phi = sphericalCoordinates.y * Mathf.Deg2Rad; float theta = sphericalCoordinates.z * Mathf.Deg2Rad; return new Vector3(r * Mathf.Sin(phi) * Mathf.Cos(theta), r * Mathf.Sin(phi) * Mathf.Sin(theta), r * Mathf.Cos(phi)); } }
Теперь у вас будет правильное преобразование в другое представление сферических координат. Не забудьте также обновить способы использования этих координат в вашем проекте для корректного отображения и расчетов.
Для перевода в другое представление сферических координат вам нужно просто поменять способ вычисления углов theta и phi в методе CartesianToSpherical. Вот как это можно сделать:
public static class SphericalConverter{
public static Vector3 CartesianToSpherical(Vector3 cartesianCoordinates)
{
float x = cartesianCoordinates.x;
float y = cartesianCoordinates.y;
float z = cartesianCoordinates.z;
float r = Mathf.Sqrt(x*x + y*y + z*z);
float phi = Mathf.Acos(z / r); // от 0 до 180 градусов
float theta = Mathf.Atan2(y, x); // от -180 до 180 градусов
// Преобразование theta к интервалу [-180, 180]
theta = theta * Mathf.Rad2Deg;
if (theta > 180)
{
theta -= 360;
}
return new Vector3(r, phi * Mathf.Rad2Deg, theta);
}
public static Vector3 SphericalToCartesian(Vector3 sphericalCoordinates)
{
float r = sphericalCoordinates.x;
float phi = sphericalCoordinates.y * Mathf.Deg2Rad;
float theta = sphericalCoordinates.z * Mathf.Deg2Rad;
return new Vector3(r * Mathf.Sin(phi) * Mathf.Cos(theta), r * Mathf.Sin(phi) * Mathf.Sin(theta), r * Mathf.Cos(phi));
}
}
Теперь у вас будет правильное преобразование в другое представление сферических координат. Не забудьте также обновить способы использования этих координат в вашем проекте для корректного отображения и расчетов.