使用下面的算法,当投影平面与赤道相切时(等距矩形图像的中心线),投影图像看起来是直线的。
但是当投影平面倾斜时,(py0!= panorama.height / 2),线条会变形。
下面算法中的最后两条“线”需要“整流”,以便在目标平面的中心线与equirectangular的中心线不在同一水平时调整px和/或py图像。
// u,v,w :
// Normalized 3D coordinates of the destination pixel
// elevation, azimuth:
// Angles between the origin (sphere center) and the destination pixel
// px0, py0 :
// 2D coordinates in the equirectangular image for the
// the destination plane center (long*scale,lat*scale)
// px, py:
// 2D coordinates of the source pixel in the equirectangular image
// (long*scale,lat*scale)
angularStep=2*PI/panorama.width;
elevation=asin(v/sqrt(u*u+v*v+w*w));
azimuth=-PI/2+atan2(w,u);
px=px0+azimuth/angularStep;
py=py0+elevation/angularStep;
我可以计算每个目标像素的法线与球体之间的交点p,然后使用可用的C代码将笛卡尔坐标转换为long / lat:
但是我知道有一种更简单,更省时的方法,包括调整equirectangular图像(px,py)中的源像素坐标,知道投影平面的中心与“的相交的经度/纬度(px0,py0)”球”。
你能帮忙吗?
答案 0 :(得分:0)
我设法使用webgl着色器中的gnomonic投影公式http://mathworld.wolfram.com/GnomonicProjection.html
float angleOfView
float phi1
float lambda0 //centre of output projection
float x = PI2*(vTextureCoord.s - 0.5) ; //input texture coordinates,
float y = PI2*(vTextureCoord.t - 0.5 );
float p = sqrt(x*x + y*y);
float c = atan(p, angleOfView);
float phi = asin( cos(c)*sin(phi1) + y*sin(c)*cos(phi1)/p );
float lambda = lambda0 + atan( x*sin(c), (p*cos(phi1)*cos(c) - y*sin(phi1)*sin(c)));
vec2 tc = vec2((lambda /(PI*2.0) + 0.5, (phi/PI) + 0.5); //reprojected texture coordinates
vec4 texSample = texture2D(tEqui, tc); //sample using new coordinates