gpt4 book ai didi

opengl - OpenGL GLSL中的atan(y/x)和atan2(y,x)有什么区别

转载 作者:行者123 更新时间:2023-12-02 02:23:11 25 4
gpt4 key购买 nike

我在理解 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] .

我说得对吗?是否有更精确的球坐标变换的数值实现?

最佳答案

atan2 正确考虑了所有 4 个象限,并且可以处理 x==0

atan2(-1,-1) 正确返回 -3/4*PI,而 atan(-1/-1) 会返回返回1/4*PI

关于opengl - OpenGL GLSL中的atan(y/x)和atan2(y,x)有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25782895/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com