3

glsl の関数 atan の結果を理解するのに問題があります。ドキュメントも不足しています。

たとえば、頂点を球座標に変換し、球座標の半径を変換してからデカルト座標に戻す必要があります。0 を中心とした半径 2 の icosphere の頂点に次の変換を使用しています。

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]

私は正しいですか?球面座標変換のより数値的に正確な実装はありますか?

4

1 に答える 1