2010-02-02 70 views
3

我想繪製一個地圖,由256x256像素瓷磚(很多他們)組成。這些覆蓋了地區。繪製世界地圖[WGS84]與廣泛的OpenGL

將緯度(從全球)轉換爲x | y(地圖)的變換產生了相當大的值。如果我遠離0/0點,我會得到兩個彼此相鄰的Tiles紋理之間多個像素的不準確性(例如2E8 | 0和2E8-1 | 0) 。

我該如何解決這些凌亂的不需要的電網出現?當前失敗的實現是使用float繪製基元(這應該不重要,因爲所有的Tiles在兩個座標方向上都被剪裁爲256的倍數)。

注意:我已經嘗試使用glTranslate d作爲偏移量,但是double的accurcy還不夠,或者這不是毛刺的原因。

+0

對此有一個downvote。原因?評論? – drahnr 2012-04-15 11:14:11

回答

4

實際上,我最近遇到了確切的同樣的問題,在我實現從空間到地面的整個行星的渲染。事實上,你需要做的是創建一個新的位置結構,以分隔不同花車之間的精度。例如,

struct location 
{ 
    vec3 metre; 
    vec3 megametre; 
    vec3 terametre; 
    vec3 examtre; 
    vec3 yottametre; 
};

然後你代碼的所有運營商和類型轉換功能,這種結構的(+, - ,*,/,toVec3),你再使用此位置結構進行編碼相機的位置和每個網格平鋪。在渲染時間上,您不需要翻譯相機,但是您可以通過差異來轉換拼貼。例如:

void render() 
{ 
    // ... 
    location diff = this->position - camera.position; 
    vec3 diffvec = diff.toVec3(); 
    glPushMatrix(); 
    glTranslatef(diffvec.x, diffvec.y, diffvec.z); 

    // render the tile 
    glPopMatrix(); 
}

它的作用是去除OpenGL的管道,只有擁有高達雙精度,並把你的程序,基本上可以有無限精度工作的差值計算。現在精度和準確度越遠離相機,而不是距離原點越遠。

快樂編碼。

+0

您的意思是,攝像頭位置的原點還是最後一點? 非常感謝回答 – drahnr 2010-02-02 10:19:43

+0

它是用C++編寫的,函數render()屬於tile類或結構體,因此這是一個指向正在渲染的tile的指針。所以this-> position是當前正在渲染的tile的類型位置的位置。 – 2010-02-02 19:22:36

+0

非常感謝:)你真的幫我擺脫了泥潭..繼續編碼 – drahnr 2010-02-03 11:50:21