在Shader中如果我们需要去用向量去获取球坐标系中的坐标,涉及到转换问题。
例如:
const vec2 invAtan = vec2(0.1591, 0.3183);
vec2 SampleSphericalMap(vec3 v)
{
vec2 uv = vec2(atan(v.z, v.x), asin(v.y));
uv *= invAtan;
uv += 0.5;
return uv;
}
2D极坐标系
极坐标系为(r, Θ)。
由图像可知:
x = r * cos(Θ)
y = r * sin(Θ)
3D极坐标系
由图像可知,半径为r的球坐标系在平面投影为d,由三角函数基本定理可知 z / r = cos(Φ),当 Φ = 90°的时候r会映射到ab线段,并且Δaob相似Δxoy。
由三角形相似定理:
x / a = y / c = d / r
在2D极坐标下:
x = r * cos(Θ)
y = r * sin(Θ)
由以上条件推出:
x = cosΘ cosΦ
y = sinΘ
z = cosΘsinΦ
所以有如下代码:
vec2 uv = vec2(atan(v.z, v.x), asin(v.y));
其中Φ取值范围为 [-pi, pi] Θ取值范围为:[-pi / 2, pi / 2]。
由于UV取值范围为[0,1]而不是[-0.5, 0.5]
uv += 0.5;