前面兩篇博客主要講了如何從全景圖轉到小行星、水晶球視圖。今天來說下如何從全景圖中取一塊兒平面視圖出來。
當然最簡單的是直接從全景圖里畫一個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度,如下圖所示,頭好暈: