前面两篇博客主要讲了如何从全景图转到小行星、水晶球视图。今天来说下如何从全景图中取一块儿平面视图出来。
当然最简单的是直接从全景图里画一个ROI,然后扣一块儿区域出来。但是很多时候这样的操作并不方便,如果要是截取的区域跨越了拼接缝的话就麻烦了。
一劳永逸的方法当然还是将全景图贴到球面去做,假设观察者(比如我)在球内部贴着球面观看,只能看到球的一部分区域。那我不断转动这个球,我就能看到这个球不同位置的局部区域图,因为我贴的很近,我真是闲得慌。
依然使用下面这张风景秀丽的全景图:
1. 还是将全景图贴到球面,经纬展开法应该是老方法了。建立球面坐标系,x轴向右,y轴垂直向内,z轴向上,符合右手坐标系。
2. 仍然采用反向映射的方法,首先在球的南极点放置一张与南极点相切的平面(也就是我们要获取的局部平面图)。
3.设定视场角FOV,设定要获取的局部平面图的大小(W,H)。我们可以粗略计算出一个归一化的焦距f = (0.5*W)/tan(fov *0.5)。
4.局部视图上的坐标(u,v),转换到球面坐标系坐标为(x,y,z):
其中x = u - W*0.5, y = H*0.5 - v, z =f
5. 得到(x, y, z)后就好办了,转换到球坐标(theta, fi):
theta = acos( z/sqrt(x*x+y*y+z*z) )
fi = acos( x/sqrt(x*x+y*y) ) if (y<0) fi=2*pi - fi
6. 得到球坐标后就可以获取全景图的坐标(U, V),如果全景图的尺寸是(panoW, panoH):
U = fi * panoW/ (2 * pi);
V = theta * panoH / pi;
7. 老样子,双线性插值,从(U,V)周围四个点插值得到(u,v)。
这样就获取了南极点一小片区域的平面图。那如果我需要观看其他位置,我又懒地跑过去贴上去,我只用转动球就行。也就是在第5步中,对x, y, z施加一个旋转矩阵R,得到新的X, Y, Z 后再投影即可。
利用上述方法再也不担心跨越拼接缝的问题了,想看哪里看哪里。生成一段环视赤道的局部平面图,fov为75度,如下图所示,头好晕: