구면 좌표를 직교 좌표로 변환하려면 어떻게합니까?


10

누군가 이것이 어떻게 달성 될 수 있는지에 대해 올바른 방향으로 나를 가리킬 수 있습니까? 3D 수학 / 기하학은 종종 나를 던집니다.

다음과 같은 것을 찾고 있습니다 (이상적으로 C #에서).

public Vector3 getCartesianFor(float elevation, float asimuth, float polar)
{
   return ????;
}

답변:


5

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);
}

정확히 무슨 일이 있었는지 ... 단일 수학 라이브러리 없이이 작업을 수행하는 방법을 알아야합니다 .... .Net에 대한 수학 라이브러리에 대한 권장 사항 ... 또는 어딘가에 내장되어 있습니까? 나는이 기능을 두 배로 만 볼 수있었습니다.
전쟁

10

  • 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));
}

구면 좌표


당신은 당신의 대답에서 (문자) 그리스어의 의미에 대해 자세히 설명해야합니다.
Seth Battin

@SethBattin 제안 해 주셔서 감사합니다! 답변이 업데이트되었습니다.
MLM

2
당신이 성향 이라고 부르는 것은 아마도 OP가 고도에 의미하는 것을 보완 하는 것 입니다. 벡터에서 z 축이 아닌 xy 평면에서 벡터까지의 각도
MestreLion

0

에 의한 경우 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첫 번째 매개 변수입니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.