我有一个用 WebGL 制作的天空纹理的球形投影,它采用 CameraAngleX、CameraAngleY 和 CameraZoom 参数通过光线方向函数计算坐标:
vec3 GetRayDirection(vec2 uv, vec3 ro, float zoom) {
vec3 cf = normalize(-ro);
vec3 cr = normalize( cross( vec3(0,1,0), cf ));
vec3 cu = cross(cf,cr);
vec3 c = ro + cf * zoom;
vec3 i = c + uv.x*cr + uv.y*cu;
vec3 rd = normalize(i - ro);
return rd;
}
我需要在这个投影的顶部绑定一些 JavaScript 元素,所以当
Zoom = 1.0
并且没有失真时,使用标准的 spherical-to-cartesian 公式出价效果很好:
x = r * sin(θ) * cos(φ);
y = r * sin(θ) * sin(φ);
x = r * cos(φ);
但是当Zoom小于1.0时出现广角视野畸变,就不行了,因为。根据扭曲的 FOV 投影,屏幕中心的元素移动速度应该比屏幕角落的移动速度慢得多。
我正在寻找一个可以对广角 FOV 进行相同绑定的公式。请告诉我一些公式或文章指向广角球坐标到笛卡尔坐标的转换!谢谢。