1. 程式人生 > >全景圖轉區域性平面檢視原理詳解

全景圖轉區域性平面檢視原理詳解

前面兩篇部落格主要講了如何從全景圖轉到小行星、水晶球檢視。今天來說下如何從全景圖中取一塊兒平面檢視出來。

當然最簡單的是直接從全景圖裡畫一個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度,如下圖所示,頭好暈: