投影的數學意義

A projection is the transformation of points and lines in one plane onto another plane by connecting corresponding points on the two planes with parallel lines.
投影的概念很簡單,就是投射的影子。好比黑暗屋子有一處光,投到你偉岸的身軀,牆上必然會有影子,這個影子就是你的身體對應這面牆的投影。
如上圖, 求向量y到平面W的最短距離。對於點y,沿着平面W的法線方向(垂直於平面W),和W相交於y’,此時誤差z最小,就是我們要找的答案。因為該射線是垂直於該平面(perpendicular),因此稱為正交(orthogonal)投影。現實生活中,從一大堆統計點中擬合出一條有規律的線,就需要用最小二乘法,其實就是正交投影的思路。對應的數學描述為:當W平面中Ax = y無解時,轉換為Px= y的形式,使其有解。
當然,這樣做有什么好處?大家對比一下自己的身體和身影的區別,答案就是把三維的問題變成了一個二維的問題,這就是一個降維的思想,也是投影的價值。為了簡化問題,限定在某一范圍內,就要進行必要的降維(消元),如果因此導致問題無解,通過合適的投影矩陣P找到解。
投影的現實意義
各種原因吧,很多時候我們都需要抽象到二維空間,方便理解,降低成本。比如,顯示器明明是平的,如何帶給我們“深度”的錯覺;地球明明是圓的,可地圖看起來是平的。
兩者的區別如上,前者采用了透視投影,眼睛認知世界也是采用該投影方式,因此,我們可以通過“平”幕感覺出深度。而后者采用正交投影,無論遠近大小都一樣。但兩者在數學理論上並無本質區別,都是矩陣P,只是P中的元素不同罷了。
這里主要看氣質,我們並不詳細給出兩個投影矩陣的推導過程, 如上是透視投影的示意圖,視錐體的任意一點(),求出在平面(z = -n)對應的點,就是一個相似三角形的過程。透視投影是一個點光源,而正交投影像一束平行光,但推算過程一致。

地圖投影也沒有本質區別,如上,在球心處一盞燈,地球投影到這個圓柱體側面,然后展開,形成右圖的效果。
投影的硬件加速
通過上面的介紹,雖然投影要理解的內容很多,但操作上非常簡單,每個點只需要乘以投影矩陣P,就可以得到投影后的點。


在數值計算上,這有三個特點,第一是簡單,每個點的計算過程都是獨立的,可封閉的,並不和其他相鄰點之間有關聯。其次是粗暴,矩陣運算計算量很大,最后基本都是浮點運算。
比如動態投影,計算量巨大,特別是B/S應用,受限於客戶端的計算能力,往往都是基於服務端做動態投影計算,然后將結果返回給客戶端。但即使如此,對於C/S而言,動態投影的性能也是瓶頸。
相比CPU,GPU沒有邏輯單元,且浮點運算能力突出,非常適合用並行的方式來解決這類簡單粗暴的計算密集型問題。
這是一種很好的解決動態投影的方式,在性能、實時、資源消耗和兼容性上都表現出色。比如墨卡托投影轉WGS,可以錯誤的理解為把圖片1高度不變,長度拉伸2倍的過程。我們完全把投影轉換的計算放到着色器中,通過GPU頂點和片元着色器實現。
從CPU到GPU的轉移,看上去很完美的,但動態投影有一個效果上的問題,畢竟是對紋理的操作,難免會有一些位置上偏移縮放等。如果用肉眼仔細看,你還是會發現不如以前的紋理清晰。
Cesium在這個問題上有一個很精妙的辦法,還是要進行動態投影的,只是轉換的對象不是Texture,保證紋理信息不變,而是對Texture Coordinate進行轉換。
如下是動態投影的效果對比。當然受限於現實,目前僅支持墨卡托和WGS之間的轉換,但在理論上,只要是點對點的動態投影都可以采用這種思路,當然最后還得看效果和數據易用性等問題。

