2010-02-02 4 views
3

Je veux dessiner une carte, composée de 256x256 Pixle Tiles (un lot d'entre eux). Ceux-ci couvrent une zone big.Dessiner la carte du monde [WGS84] avec OpenGL dans une large gamme

La transformation pour convertir lat | lon (du globe) en x | y (carte) génère des valeurs assez grandes. Avec ces grandes valeurs va exactitude et donc, si je m'éloigne du point 0/0, j'obtiens des inexactitudes de plusieurs pixels entre les textures de deux tuiles étant l'une à côté de l'autre (par exemple 2E8 | 0 et 2E8-1 | 0) .

Comment est-ce que je peux corriger ces apparences désagréables de grille? L'implémentation défaillante actuelle consiste à utiliser float pour dessiner les primitives (cela ne devrait pas avoir d'importance, car toutes les mosaïques sont tronquées à des multiples de 256 dans les deux directions de coordonnées).

Note: J'ai déjà essayé d'utiliser glTranslate d pour le décalage mais l'exactitude du double ne suffit pas trop, ou ce n'est pas la raison pour laquelle les défauts.

+0

Vous avez une rétroprojection à ce sujet. Raison? Commentaire? – drahnr

Répondre

4

En fait, j'ai récemment couru dans le exact même problème dans ma mise en œuvre de rendre des planètes entières de l'espace à la terre. En fait, ce que vous devez faire est de créer une nouvelle structure de position qui divise la précision entre différents flotteurs. Par exemple,

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

Ensuite, vous codez tous les opérateurs et les fonctions de la distribution de type pour cette structure (+, -, *, /, toVec3), vous utilisez cette struct emplacement pour coder l'emplacement de votre appareil photo et chaque tuile de grille. Au moment du rendu, vous ne traduisez pas la caméra, mais vous traduisez plutôt les tuiles par différence. Par exemple:

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

    // render the tile 
    glPopMatrix(); 
}

Ce qu'il fait est supprime le calcul de la différence du pipeline OpenGL qui ne dispose que jusqu'à la double précision et met le travail sur votre programme qui peut essentiellement avoir une précision infinie. Maintenant, la précision et la précision diminuent au fur et à mesure que vous vous éloignez de la caméra au lieu de vous éloigner davantage de l'orgin.

Codage heureux.

+0

Que voulez-vous dire par , l'origine ou le dernier point de la position de la caméra? Merci beaucoup pour la réponse – drahnr

+0

Il est écrit en C++, et la fonction render() appartient à la classe ou à la structure de la tuile, donc c'est un pointeur vers la tuile qui est rendue. Donc, cette position est la position du type de la tuile en cours de rendu. –

+0

Merci beaucoup :) vous m'avez vraiment aidé à sortir de la boue .. continuer à coder – drahnr

Questions connexes