using UnityEngine; namespace NewHorizons.Utility { public static class CoordinateUtilities { // Longitude and latitude are in degrees // Using the phi and theta convention used on https://mathworld.wolfram.com/SphericalCoordinates.html (Mathematics not physics convention) public static Vector3 CartesianToSpherical(Vector3 v, bool useUnityCoords = true) { float x, y, z; if (useUnityCoords) { // Y is up in unity x = v.x; y = v.z; z = v.y; } else { x = v.x; y = v.y; z = v.z; } float dist = Mathf.Sqrt(x * x + y * y + z * z); // theta var longitude = Mathf.Rad2Deg * Mathf.Atan2(y, x); // phi float latitude = Mathf.Rad2Deg * Mathf.Acos(z / dist); return new Vector3(longitude, latitude, dist); } public static Vector3 SphericalToCartesian(Vector3 v, bool useUnityCoords = true) { var longitude = v.x; var latitude = v.y; var r = v.z; var theta = Mathf.Deg2Rad * longitude; var phi = Mathf.Deg2Rad * latitude; float x, y, z; if (useUnityCoords) { x = r * Mathf.Cos(theta) * Mathf.Sin(phi); z = r * Mathf.Sin(theta) * Mathf.Sin(phi); y = r * Mathf.Cos(phi); } else { x = r * Mathf.Cos(theta) * Mathf.Sin(phi); y = r * Mathf.Sin(theta) * Mathf.Sin(phi); z = r * Mathf.Cos(phi); } return new Vector3(x, y, z); } } }