답변:
http://blog.nobel-joergensen.com/2010/10/22/spherical-coordinates-in-unity/
public static void SphericalToCartesian(float radius, float polar, float elevation, out Vector3 outCart){
float a = radius * Mathf.Cos(elevation);
outCart.x = a * Mathf.Cos(polar);
outCart.y = radius * Mathf.Sin(elevation);
outCart.z = a * Mathf.Sin(polar);
}
public static void CartesianToSpherical(Vector3 cartCoords, out float outRadius, out float outPolar, out float outElevation){
if (cartCoords.x == 0)
cartCoords.x = Mathf.Epsilon;
outRadius = Mathf.Sqrt((cartCoords.x * cartCoords.x)
+ (cartCoords.y * cartCoords.y)
+ (cartCoords.z * cartCoords.z));
outPolar = Mathf.Atan(cartCoords.z / cartCoords.x);
if (cartCoords.x < 0)
outPolar += Mathf.PI;
outElevation = Mathf.Asin(cartCoords.y / outRadius);
}
r
: 반경 거리θ
: 경사φ
: 방위각Wikipedia 를 통해
public Vector3 getCartesianFor(float radius, float inclination, float azimuth)
{
return new Vector3(radius*Sin(inclination)*Cos(azimuth), radius*Sin(inclination)*Sin(azimuth), radius*Cos(inclination));
}
에 의한 경우 polar
당신이하는 벡터의 크기를 의미하고, elevation
벡터 및 XY 평면 (이름이 의미하는 바와 같이) 사이의 각도로 정의, 기능은 다음과 같습니다
public Vector3 getCartesianFor(float elevation, float asimuth, float polar)
{
return new Vector3(polar*Cos(elevation)*Cos(asimuth),
polar*Cos(elevation)*Sin(asimuth),
polar*Sin(inclination));
}
이것은 MLM의 답변과 매우 유사하며 elevation
각도 를 정의하는 방법에 따라 다릅니다 . 함수 템플릿 서명도 존중했지만 몇 가지 변경 사항을 제안합니다.
asimuth
오타입니다. 올바른 철자는 azimuth
polar
일반적으로 2 차원 좌표를 의미 시스템 (R, θ). 벡터의 크기는 일반적으로radius
radius
첫 번째 매개 변수입니다.