直角坐标系和球坐标系

在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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值