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