56 lines
1.3 KiB
C#
56 lines
1.3 KiB
C#
using UnityEngine;
|
|
using System.Collections;
|
|
|
|
public class LMath {
|
|
public static float frac(float value){
|
|
return value - (float)Mathf.FloorToInt(value);
|
|
}
|
|
}
|
|
|
|
public class SphericalCoordinate
|
|
{
|
|
private float polar;
|
|
private float elevation;
|
|
private Vector3 cartesian;
|
|
|
|
public float PolarAngle{
|
|
get{ return polar; }
|
|
set{ polar = value; UpdateCartesian(); }
|
|
}
|
|
|
|
public float ElevationAngle{
|
|
get{ return elevation; }
|
|
set{ elevation = value; UpdateCartesian(); }
|
|
}
|
|
|
|
public Vector3 Cartesian{
|
|
get{ return cartesian; }
|
|
set { UpdateSpherical(value); }
|
|
}
|
|
|
|
public SphericalCoordinate(){
|
|
UpdateCartesian();
|
|
}
|
|
|
|
private void UpdateCartesian(){
|
|
float a = Mathf.Cos(elevation);
|
|
cartesian.x = a * Mathf.Cos(polar);
|
|
cartesian.y = Mathf.Sin(elevation);
|
|
cartesian.z = a * Mathf.Sin(polar);
|
|
}
|
|
|
|
private void UpdateSpherical(Vector3 cartesianCoord){
|
|
if (cartesianCoord.x == 0.0f)
|
|
cartesianCoord.x = Mathf.Epsilon;
|
|
float radius = Mathf.Sqrt((cartesianCoord.x * cartesianCoord.x)
|
|
+ (cartesianCoord.y * cartesianCoord.y)
|
|
+ (cartesianCoord.z * cartesianCoord.z));
|
|
|
|
polar = Mathf.Atan(cartesianCoord.z / cartesianCoord.x);
|
|
if (cartesianCoord.x < 0.0f)
|
|
polar += Mathf.PI;
|
|
elevation = Mathf.Asin(cartesianCoord.y / radius);
|
|
}
|
|
|
|
}
|