2014-09-11 3 views
3

У меня есть некоторые проблемы с пониманием результата функции atan в glsl. Документации также не хватает.В чем отличие от atan (y/x) и atan2 (y, x) в OpenGL GLSL

Например, мне нужно преобразовать вершину в сферические координаты, преобразовать радиус сферической координаты и затем преобразовать ее обратно в декартовы координаты. Я использую следующее преобразование на вершинах IcoSphere радиуса 2 с центром в 0.

vec3 to_sphere(vec3 P) 
{ 
    float r = sqrt(P.x*P.x + P.y*P.y + P.z*P.z); 
    float theta = atan(P.y,(P.x+1E-18)); 
    float phi= acos(P.z/r); // in [0,pi] 
    return vec3(r,theta, phi); 
} 

vec3 to_cart(vec3 P) 
{ 
    float r = P.x; 
    float theta = P.y; 
    float phi = P.z; 
    return r * vec3(cos(phi)*sin(theta),sin(phi)*sin(theta),cos(theta); 
} 

void main() 
{ 
    vec4 V = gl_Vertex.xyz; 
    vec3 S = to_sphere(V.xyz); 
    S.x += S.y; 
    V.xyz = to_cartesian(S); 

    gl_Position = gl_ModelViewProjectionMatrix * V; 
} 

но результат отличается, если я использую atan(y/x) или atan2(y,x). Я поставил маленький 1E-18 постоянный, чтобы избежать полюса.

Почему это поведение? Я полагаю, что значение, возвращаемое atan(y/x) и atan2(y,x), имеет разный диапазон. В частности, в этой реализации я считаю, что theta должен варьироваться от [0-Pi], а Phi - в диапазоне [0,2Pi].

Я прав? Существуют ли более численно точные реализации преобразований сферических координат?

ответ

7

atan2 должным образом учитывает все 4 квадранта и может иметь дело с x==0.

atan2(-1,-1) правильно возвращает -3/4*PI в то время как atan(-1/-1) вернется 1/4*PI

+0

Так я должен придерживаться atan2 для правильной сферической преобразования координат? – linello

+0

@linello Да, вы должны. atan полезен, только если у вас нет координат, и даже тогда его следует использовать с осторожностью. – Arpegius

+0

Необычно, https://www.opengl.org/sdk/docs/man/html/atan.xhtml фактически говорит для atan (y, x), «Результаты не определены, если x равно нулю». Вероятно, это ошибка документации; atan (y, x) почти бесполезен, если это правда. –

Смежные вопросы