Das Problem ist das übliche, wenn man mit Gleitpunktwerten rechnet. Bei Werten die stark von 0 verschieden sind, sind einfach nicht mehr genug Werte zwischen 2 anderen überhaupt abbildbar um ein "Scheinkontinuum" zu sein. Am genausten sind Floats (egal wie viele Bits nun) wenn sie möglichst nah an 0 liegen. Wie weit man davon weg kann, hängt dann davon ab was man machen möchte, und wie genau der Datentyp nun ist. Da gibt es kein Patentrezept.
Allerdings ist man bei
OpenGL, selbst wenn man Double-Werte übergibt, immer im Beriech von Single! Dass heisst, dass du bei 10mio schon ganz schön arg über der Genauigkeit bist. Skalieren hilft, aber nicht wenn du Details drin hast, die in ihrer Ausdehnung schon weit im Nachkommabereich liegen (das wäre aber eine wahnsinnig rieeeesige Szene mit unglaublichem Detailreichtum. Sowas ist mir zumindest noch nicht begegnet
).
Eine Mögliche Variante das ohne Skalierungen zu erledigen wäre es, den Raum in Octrees zu unterteilen, und mit einer Sichtbarkeitsprüfung nachher die Würfel zu identifizieren, die überhaupt nur dargestellt werden müssen (sollte man bei so großen Szenen ohnehin in Betracht ziehen). Noch netter wirds, wenn du die Geometrie in die Prüfung mit einbeziehst, so dass von Wänden verdeckte Raumwürfel, die zwar im Sichtfeld lägen, trotzdem ausgelassen werden.
Das was du dann noch an Raumteilen über hast, kannst du dann um den Weltmittelpunkt von
OpenGL zentrieren, und die Kamera entsprechend anpassen.
Das ganze ist allerdings keine Kleinigkeit, sondern schon eher ein ziemlicher Hammer. Ich weiss ja nicht, wofür du das brauchst, jedoch weiss ich von einigen Spielen, dass sie ähnlich vorgehen (da meist aber mit Unterteilung in Zones von Hand bei Erstellung der Level, und evtl. danach Octrees).
Wenn du zudem in Echtzeit durch die Szene laufen möchtest, dann ist das ganze Prozedere was die Darstellung angeht ein immenser Zetisparer, aber auch nur, wenn man es intelligent und gut implementiert.
Wenn deine Szene also keine winzigen Details enthält, skalier besser einfach. Und wenn du nicht nah genug ran kommst, dann setz die Near-Clipping-Plane näher
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel