На самом деле, я недавно столкнулся с такой же проблемой точно в моей реализации рендеринга целых планет из космоса на землю. Фактически, вам нужно создать новую структуру позиции, которая разделяет точность между различными поплавками. Например,
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, который имеет только двойную точность, и помещает работу в вашу программу, которая может по существу иметь бесконечную точность. Теперь точность и точность снижаются по мере удаления от камеры, а не от организации.
Счастливое кодирование.