您好,登錄后才能下訂單哦!
柏拉圖認為,盡管世間萬物是不完美的,但存在一種永恒不變的形式,這個形式是完美的,而生命的意義就是讓這個世界盡可能的接近這個完美的形式。
怎么理解這句話,和我們今天講的精度有什么關系。我們先舉一個例子,方便大家的理解。比如一個圓,對應的數學形式為:
相信大家都不會否認這個公式很優雅,真的可以用完美無瑕來形容了。現在畫出來,去其中的一段圓弧,你就意識到,要達到形式上的完美,步步維艱。
可見,在現實生活中不存在絕對的完美,總有更高的標準,讓它變得完美。對應到數字上,不完美就是精度的損失。當然,這種損失是不可避免的,甚至是有益的,首先,它能降低成本,比如有損壓縮技術。其次,也有助于我們對事物的理解,比如地球是一個不規則球體,我們會認為它是一個橢球,甚至會進一步簡化,認為它是一個圓球。
這就有了矛盾點,精度損失本來是一件壞事,怎么讓你三言兩語說成了一件好事。問題的癥結就在于我們對“形式”的理解深度,幫助我們更好的取舍,當我們合理的評估這種精度的損失,達到剛剛好的平衡,也是一種退而求其次的完美。
上一節我們講了球心坐標和本地坐標之間的轉換,這里也有一個精度的問題。假設赤道上相距1米的兩個點之間的delta,如果是球心坐標,我們用經緯度來表示的話,地球半徑R為6378137米,兩點之間的經度差為x,推算如下。而我們采用以其中一點為原點的本地坐標時,兩點之間的差就是1米(b)。
兩個答案哪一個更準確。分為三種情況,一部分人認為答案a詳細準確,比如我們在星戰類電影里面都會有一個畫面,艦長說,距離地球還有多遠,總會有一個人說出一串長長的的數字,讓人覺得準確無誤;一部分人認為答案b簡單準確;還有一部分人認為,兩者一樣準確。確實,兩個答案都是通過數學公式推到出來的,理論上講可以做到一樣準確,但從程序員的角度,浮點型是有精度損失,這是浮點型的存儲規范導致的,通常精度能夠滿足多數需求,但一旦滿足不了,損失是巨大的,而且難發現難解決。比如哥倫比亞號爆炸,就是因為double精度問題導致。
這部分之前做過一個視頻,可以在百度搜索:[編程]1 C++類型簡析,會有詳細介紹。如果不想花時間,只需要記住,float可以有7位有效數字,而double可以有16位,選擇合適的浮點類型,當你的精度需求超過這個范圍時,你就要小心了。
如果精度達不到要求,怎么辦?不妨把原點換到一個相對近的位置,這樣就可以大大提高精度。這不就是坐標轉換的意義嗎?
通常,我們都會有一個基準點,保證它是準確的,周邊的物體都是相對該基準點的位置,成為RTC,Relative to centre。但在Virtual Earth中,如果我們近地面瀏覽,RTC-rendering還是會出現瀏覽范圍超過float精度的情況,就會出現精度的丟失,也就是相機抖動。
這里有兩個步驟,第一將RTC改為RTE(eye),以前以某一個事先約定的中心點為基準點,在瀏覽中,總會出現偏離該點的情況,越遠精度損失就越大,這時我們改為以相機位置為中心點有機會在介紹相關的推導,模型試圖矩陣,法向量等相機矩陣推導后續會專門介紹。當距離物體非常近時,采用RTE的坐標轉換會更精確。
同時,因為shader中僅支持float類型,這里,Cesium提供了一種編碼方式,用float-float模擬一個double,來確保精度問題,對應EncodedCartesian3.encode方法。這樣,通過一個high的float和一個low的float,分別運算,解決抖動的問題,也算是GPU之duoble運算的一種思路吧。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。