3인칭 카메라에 많이 사용하는 극좌표계를 정리해봤다.

* 데카르트 좌표계에서 극좌표계로의 변환 공식

* 극좌표계에서 데카르트 좌표계로의 변환 공식

단,
, 
* 소스
void CartesianToSpherical( vec3 vec, float& out_r, float& out_phi, float& out_theta )
{
out_r = vec.Length();
float x = vec.x;
float y = vec.y;
float z = vec.z;
* 소스
void CartesianToSpherical( vec3 vec, float& out_r, float& out_phi, float& out_theta )
{
out_r = vec.Length();
float x = vec.x;
float y = vec.y;
float z = vec.z;
if( x > 0 )
{
out_phi = (float)atan( y / x );
}
else if( x < 0 && y > 0 )
{
out_phi = (float)atan( y / x ) + MMath::PI;
}
else if( x < 0 && y < 0 )
{
out_phi = (float)atan( y / x ) - MMath::PI;
}
else if( x == 0 && y > 0 )
{
out_phi = MMath::PI / 2;
}
else if( x == 0 && y < 0 )
{
out_phi = - (float)MMath::PI / 2;
}
{
out_phi = (float)atan( y / x );
}
else if( x < 0 && y > 0 )
{
out_phi = (float)atan( y / x ) + MMath::PI;
}
else if( x < 0 && y < 0 )
{
out_phi = (float)atan( y / x ) - MMath::PI;
}
else if( x == 0 && y > 0 )
{
out_phi = MMath::PI / 2;
}
else if( x == 0 && y < 0 )
{
out_phi = - (float)MMath::PI / 2;
}
if( z > 0 )
{
out_theta = (float)atan( sqrt( x*x + y*y ) / z );
}
else if( z < 0 )
{
out_theta = (float)atan( sqrt( x*x + y*y ) / z ) + (float)MMath::PI;
}
else
{
// z == 0
out_theta = MMath::PI / 2;
}
}
{
out_theta = (float)atan( sqrt( x*x + y*y ) / z );
}
else if( z < 0 )
{
out_theta = (float)atan( sqrt( x*x + y*y ) / z ) + (float)MMath::PI;
}
else
{
// z == 0
out_theta = MMath::PI / 2;
}
}
vec3 SphericalToCartesian( float r, float phi, float theta )
{
float x = r * (float)sin(theta) * (float)cos(phi); // = r * cos(phi) * sin(theta)
float y = r * (float)sin(theta) * (float)sin(phi); // = r * sin(phi) * sin(theta)
float z = r * (float)cos(theta);
return (vec3(x,y,z));
}
{
float x = r * (float)sin(theta) * (float)cos(phi); // = r * cos(phi) * sin(theta)
float y = r * (float)sin(theta) * (float)sin(phi); // = r * sin(phi) * sin(theta)
float z = r * (float)cos(theta);
return (vec3(x,y,z));
}
TAG. 수학

::: 사람과 사람의 교감! 人터넷의 첫 시작! 댓글을 달아주세요! :::
ㄷㄷㄷ
역시 프로그래머는 대단해..;
이런거 가지고 뭘..-_-a